last_bash_command="$BASH_COMMAND"
echo "Unexpected non-zero exit code $last_exit_code in ${BASH_SOURCE[*]} at line ${BASH_LINENO[*]} detected!
last bash command: $last_bash_command"
+ if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \
+ [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then
+ einfo "Presenting last ten lines of debootstrap.log:"
+ tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log
+ einfo "End of debootstrap.log"
+ fi
## Check if "bailout" function is available.
## This is not the case in chroot-script.
if command -v bailout >/dev/null 2>&1; then
}
# }}}
+# unmount mountpoint {{{
+try_umount() {
+ local tries=$1
+ local mountpoint="$2"
+
+ if ! mountpoint "$mountpoint" &>/dev/null ; then
+ return 0
+ fi
+
+ for (( try=1; try<=tries; try++ )); do
+ if [[ ${try} -eq ${tries} ]]; then
+ # Last time, show errors this time
+ umount "${mountpoint}" && return 0
+ else
+ # Not last time, hide errors until fatal
+ if umount "${mountpoint}" 2>/dev/null ; then
+ return 0
+ else
+ sleep 1
+ fi
+ fi
+ done
+ return 1 # Tried enough
+}
+# }}}
+
# helper functions {{{
cleanup() {
if [ -n "$CHROOT_VARIABLES" ] ; then
- einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $?
+ einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" || eend $?
fi
if [ -n "$STAGES" ] ; then
- einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?
+ einfo "Removing ${STAGES}" ; rmdir "$STAGES" || eend $?
fi
- if [ -n "$ARM_EFI_TARGET" ]; then
- umount "${MNTPOINT}/boot/efi" >/dev/null 2>&1
- fi
+ try_umount 3 "${MNTPOINT}"/boot/efi
# Remove temporary mountpoint again
if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
if [ -d "$MNTPOINT" ] ; then
- rmdir "$MNTPOINT"
+ rmdir "$MNTPOINT" || true
fi
fi
fi
done
- [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1
+ [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1 || true
# ugly, but make sure we really don't leave anything (/proc /proc and
# /dev /dev are intended, trying to work around timing issues, see #657023)
for ARG in /run/udev /sys /proc /proc /dev/pts /dev/pts /dev /dev ; do
- [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1
- umount "$MNTPOINT"/$ARG >/dev/null 2>&1
+ [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1 || true
+ umount "$MNTPOINT"/$ARG >/dev/null 2>&1 || true
done
if [ -n "$ISODIR" ] ; then
- [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1
+ try_umount 3 "$MNTPOINT/$ISODIR" >/dev/null 2>&1 || true
fi
if [ -n "$DIRECTORY" ] ; then
einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice."
else
einfo "Unmounting $MNTPOINT"
- umount "$MNTPOINT" || eend $?
+ try_umount 3 "$MNTPOINT"
fi
if [ -n "$STAGES" ] ; then
# remove directory only if we used the default with process id inside the name
if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
- if test -d "$MNTPOINT" ; then
+ if [ -d "$MNTPOINT" ] ; then
einfo "Removing directory ${MNTPOINT}"
rmdir "$MNTPOINT" || eend $?
fi
# source main configuration file {{{
if [ -r /etc/debootstrap/config ] ; then
+ bash -n /etc/debootstrap/config
# shellcheck disable=SC1091
. /etc/debootstrap/config
fi
# cmdline handling {{{
CMDLINE_OPTS=mirror:,iso:,release:,target:,mntpoint:,debopt:,defaultinterfaces,interactive,nodebootstrap,nointerfaces,nokernel,nopackages,filesystem:,config:,confdir:,packages:,chroot-scripts:,scripts:,post-scripts:,pre-scripts:,debconf:,vm,vmfile,vmsize:,vmefi,keep_src_list,hostname:,password:,nopassword,grmlrepos,backportrepos,bootappend:,grub:,efi:,arch:,insecure,verbose,help,version,force,debug,contrib,non-free,remove-configs,sshcopyid,sshcopyauth
-_opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
- $CMDLINE_OPTS -- "$@")
-
-if [ $? != 0 ]; then
- eerror "Try 'grml-debootstrap --help' for more information."; eend 1; exit 1
+if ! _opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
+ $CMDLINE_OPTS -- "$@"); then
+ eerror "Try 'grml-debootstrap --help' for more information."
+ bailout 1
fi
eval set -- "$_opt_temp"
# source specified configuration file {{{
if [ -n "$CONFIGFILE" ] ; then
einfo "Reading specified config file $CONFIGFILE."
+ bash -n "$CONFIGFILE"
# shellcheck disable=SC1091 source=config
if ! . "$CONFIGFILE" ; then
eerror "Error reading config file $CONFIGFILE" ; bailout 1
dialog --title "$PN" --trim \
--msgbox "Sorry, no partitions found. Please configure your
harddisks (see /proc/partitions) using a tool like fdisk,
- cfdisk, gpart, gparted,..." 0 0
- bailout 1
+ cfdisk, gpart, gparted,..." 0 0 || bailout 1
fi
PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do
# shellcheck disable=SC2086
TARGET=$(dialog --title "$PN" --single-quoted --stdout \
--menu "Please select the target partition:" 0 0 0 \
- $PARTITION_LIST)
- [ $? -eq 0 ] || bailout 1
+ $PARTITION_LIST) || bailout 1
}
# }}}
--menu "Where do you want to install the bootmanager grub?" 0 0 0 \
mbr "install bootmanager into $MBRPART" \
nowhere "do not install bootmanager at all" \
- ${ADDITIONAL_PARAMS})
- [ $? -eq 0 ] || bailout 3
+ ${ADDITIONAL_PARAMS}) || bailout 3
IFS="$OIFS"
case "$GETMBR" in
buster Debian/10 \
bullseye Debian/11 \
bookworm Debian/12 \
- sid Debian/unstable)"
- [ $? -eq 0 ] || bailout
+ sid Debian/unstable)" \
+ || bailout
}
# }}}
{
HOSTNAME="$(dialog --stdout --title "${PN}" --inputbox \
"Please enter the hostname you would like to use for installation:" \
- 0 0 "$HOSTNAME")"
- [ $? -eq 0 ] || bailout
+ 0 0 "$HOSTNAME")" || bailout
}
# }}}
ROOTPW2='PW2'
while [ "$ROOTPW1" != "$ROOTPW2" ]; do
ROOTPW1=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
- "Please enter the password for the root account:" 10 60)
- [ $? -eq 0 ] || bailout
+ "Please enter the password for the root account:" 10 60) || bailout
ROOTPW2=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
"Please enter the password for the root account again for \
- confirmation:" 10 60)
- [ $? -eq 0 ] || bailout
+ confirmation:" 10 60) || bailout
if [ "$ROOTPW1" != "$ROOTPW2" ]; then
dialog --stdout --title "${PN}" --ok-label \
net "install via network (downloading from mirror)" \
local "install from local directory/mirror"
)
- [ $? -eq 0 ] || bailout
if [ "$CHOOSE_MIRROR" = 'net' ] ; then
[ -n "$MIRROR" ] || MIRROR='http://deb.debian.org/debian'
MIRROR="$(dialog --stdout --title "${PN}" --inputbox \
"Please enter Debian mirror you would like to use for installing packages." \
- 0 0 $MIRROR)"
- [ $? -eq 0 ] || bailout
+ 0 0 $MIRROR)" || bailout
+
else # CHOOSE_MIRROR == local
[ -n "$ISO" ] || ISO='/mnt/mirror'
ISO="$(dialog --stdout --title "${PN}" --inputbox \
"Please enter directory name you would like to use for installing packages." \
- 0 0 $ISO)"
- [ $? -eq 0 ] || bailout
+ 0 0 $ISO)" || bailout
fi
}
# }}}
--menu "Which device do you want to use for ${RAIDLEVEL}?
Notice: activated devices will not be listed for security reasons. Anyway, please make sure the selected device is not in use already!" 0 0 0 \
-$MD_LIST)
-[ $? -eq 0 ] || bailout 20
+$MD_LIST) || bailout 20
AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \
sed 's/*//' | \
# shellcheck disable=SC2086
dialog --title "$PN" --separate-output \
--checklist "Please select the partitions you would like to use for your $RAIDLEVEL on ${TARGET}:" 0 0 0 \
- $PARTITION_LIST 2>"$TMPFILE"
-[ $? -eq 0 ] || bailout
+ $PARTITION_LIST 2>"$TMPFILE" || bailout
+
SELECTED_PARTITIONS="$(cat "$TMPFILE")"
NUM_PARTITIONS=0
done < "$TMPFILE"
ERRORFILE=$(mktemp)
+
+local RC=0
# shellcheck disable=SC2086
yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \
- --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE
-RC=$?
+ --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE || RC=$?
+
if [ "$RC" = 0 ] ; then
dialog --title "$PN" --msgbox \
"Creating $TARGET was successful." 0 0
einfo "EFI partition $EFI seems to have a FAT filesystem, not modifying."
else
einfo "EFI partition $EFI doesn't seem to be formatted, creating filesystem."
- mkfs.fat -F32 -n "EFI" "$EFI"
- RC=$?
- if [ ! $RC -eq 0 ] ; then
+ if ! mkfs.fat -F32 -n "EFI" "$EFI" ; then
eerror "Error while creating filesystem on ${EFI}."
bailout 1
fi
Is this ok for you? Notice: selecting 'No' will exit ${PN}."
dialog --title "$PN" --no-collapse \
- --yesno "$INFOTEXT" 0 0
- [ $? -eq 0 ] || bailout 0
+ --yesno "$INFOTEXT" 0 0 || bailout 0
else # if not running automatic installation display configuration and prompt for execution:
einfo "$PN [${VERSION}] - Please recheck configuration before execution:"
einfo "Running $MKFS $MKFS_OPTS on $TARGET"
# shellcheck disable=SC2086
- "$MKFS" $MKFS_OPTS "$TARGET" ; RC=$?
+ "$MKFS" $MKFS_OPTS "$TARGET"
if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then
if ! echo "$MKFS" | grep -q "mkfs.ext" ; then
# race conditions :-/
sleep 2
- eend $RC
fi
}
# }}}
fi
# make sure loop module is present and a usable loop device exists
- modprobe -q loop
+ modprobe loop || true
if ! losetup -f >/dev/null 2>&1; then
eerror "Error finding usable loop device"
bailout 1
# if dm-mod isn't available then kpartx will fail with
# "Is device-mapper driver missing from kernel? [...]"
- modprobe -q dm-mod
+ modprobe dm-mod || true
if ! grep -q 'device-mapper' /proc/misc >/dev/null 2>&1 ; then
eerror "Device-mapper support missing in kernel."
bailout 1
if [ "$ARCH" = 'arm64' ]; then
einfo "Setting up GPT partitions for arm64"
parted -s "${TARGET}" 'mklabel gpt'
- parted -s "${TARGET}" 'mkpart EFI fat32 1MiB 10MiB'
+ parted -s "${TARGET}" 'mkpart ESP fat32 1MiB 10MiB'
parted -s "${TARGET}" 'set 1 boot on'
parted -s "${TARGET}" 'mkpart LINUX ext4 10MiB 100%'
else
fi
if [ -n "${ARM_EFI_TARGET}" ]; then
- mkdir -p "${MNTPOINT}/boot/efi"
- if ! mount "${ARM_EFI_TARGET}" "${MNTPOINT}/boot/efi" ; then
+ mkdir -p "${MNTPOINT}"/boot/efi
+ if ! mount "${ARM_EFI_TARGET}" "${MNTPOINT}"/boot/efi ; then
eerror "Error: Mounting ${ARM_EFI_TARGET} failed, can not continue."
bailout 1
fi
# workaround for Debian bug #918590 with lvm + udev:
# WARNING: Device /dev/... not initialized in udev database even after waiting 10000000 microseconds
- if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then
- einfo "Unmounting bind-mount /run/udev"
- umount "${MNTPOINT}"/run/udev
- fi
+ try_umount 3 "${MNTPOINT}"/run/udev
- umount "${MNTPOINT}"/proc
- umount "${MNTPOINT}"/sys
- umount "${MNTPOINT}"/dev/pts
+ try_umount 3 "${MNTPOINT}"/proc
+ try_umount 3 "${MNTPOINT}"/sys
+ try_umount 3 "${MNTPOINT}"/dev/pts
try_umount 3 "${MNTPOINT}"/dev
- if [ -n "$VMEFI" ]; then
- umount "${MNTPOINT}"/boot/efi
- fi
+ try_umount 3 "${MNTPOINT}"/boot/efi
}
# }}}
return 0
fi
- if [ -n "${ARM_EFI_TARGET}" ]; then
- umount "${MNTPOINT}/boot/efi"
- fi
+ try_umount 3 "${MNTPOINT}"/boot/efi
- umount "${MNTPOINT}"
+ try_umount 3 "${MNTPOINT}"
kpartx -d "${ORIG_TARGET}" >/dev/null
# Workaround for a bug in kpartx which doesn't clean up properly,
# see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO"
# shellcheck disable=SC2086
"$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$ISO"
- RC=$?
else
einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}"
einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR"
# shellcheck disable=SC2086
"$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$MIRROR"
- RC=$?
fi
-
- if [ $RC -ne 0 ] ; then
- if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \
- [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then
- einfo "Presenting last ten lines of debootstrap.log:"
- tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log
- einfo "End of debootstrap.log"
- fi
- fi
-
- eend $RC
}
# }}}
}
# }}}
-# unmount mountpoint {{{
-try_umount() {
- local tries=$1
- local mountpoint="$2"
-
- for (( try=1; try<=tries; try++ )); do
- if [[ ${try} -eq ${tries} ]]; then
- # Last time, show errors this time
- umount "${mountpoint}" && return 0
- else
- # Not last time, hide errors until fatal
- if umount "${mountpoint}" 2>/dev/null ; then
- return 0
- else
- sleep 1
- fi
- fi
- done
- return 1 # Tried enough
-}
-# }}}
-
# execute chroot-script {{{
chrootscript() {
if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then
mount -t devtmpfs udev "${MNTPOINT}"/dev
mount -t devpts devpts "${MNTPOINT}"/dev/pts
if [ "$DEBUG" = "true" ] ; then
- chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script ; RC=$?
+ chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script
else
- chroot "$MNTPOINT" /bin/chroot-script ; RC=$?
+ chroot "$MNTPOINT" /bin/chroot-script
fi
try_umount 3 "$MNTPOINT"/dev/pts
try_umount 3 "$MNTPOINT"/dev
- eend $RC
fi
# finally get rid of chroot-script again, there's no good reason to
fi
if [ -n "$ISODIR" ] ; then
- if grep -q "$ISODIR" /proc/mounts ; then
- einfo "Unmount $MNTPOINT/$ISODIR"
- umount "$MNTPOINT/$ISODIR"
- fi
+ einfo "Unmount $MNTPOINT/$ISODIR"
+ try_umount 3 "$MNTPOINT/$ISODIR"
fi
- if grep -q "$MNTPOINT" /proc/mounts ; then
- if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then
- einfo "Unmounting bind-mount /run/udev"
- umount "${MNTPOINT}"/run/udev
- fi
+ try_umount 3 "${MNTPOINT}"/run/udev
- if [ -n "$PARTITION" ] ; then
- einfo "Unmount $MNTPOINT"
- umount "$MNTPOINT"
- fi
+ if [ -n "$PARTITION" ] ; then
+ try_umount 3 "$MNTPOINT"
fi
}
# }}}
remove_configs umount_chroot grub_install umount_target fscktool ; do
if stage "${i}" ; then
"$i"
- if [ $? -eq 0 ]; then
- stage "${i}" 'done' && rm -f "${STAGES}/${i}"
- else
- bailout 2 "$i"
- fi
+ stage "${i}" 'done'
+ rm -f "${STAGES}/${i}"
fi
done