# Bug-Reports: see https://grml.org/bugs/
# License: This file is licensed under the GPL v2+
################################################################################
+# shellcheck disable=SC2001,SC2181
# error_handler {{{
-[ -n "$REPORT_TRAP_ERR" ] || REPORT_TRAP_ERR='no'
-[ -n "$FAIL_TRAP_ERR" ] || FAIL_TRAP_ERR='no'
-
error_handler() {
last_exit_code="$?"
last_bash_command="$BASH_COMMAND"
- if [ "$REPORT_TRAP_ERR" = "yes" ]; then
- echo "Unexpected non-zero exit code $last_exit_code in ${BASH_SOURCE[*]} at line ${BASH_LINENO[*]} detected!
+ echo "Unexpected non-zero exit code $last_exit_code in ${BASH_SOURCE[*]} at line ${BASH_LINENO[*]} detected!
last bash command: $last_bash_command"
- fi
- if [ ! "$FAIL_TRAP_ERR" = "yes" ]; then
- return
+ 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
bailout 1
else
- echo 'FAIL_TRAP_ERR is set to "yes", exit 1.'
exit 1
fi
}
-if [ "$REPORT_TRAP_ERR" = "yes" ] || [ "$FAIL_TRAP_ERR" = "yes" ]; then
- set -e
- set -E
- set -o pipefail
- trap "error_handler" ERR
- export -f "error_handler"
-fi
+set -e
+set -E
+set -o pipefail
+trap "error_handler" ERR
+export -f "error_handler"
# }}}
# variables {{{
PN="$(basename "$0")"
if [[ -d "$(dirname "$(command -v "$0")")"/.git ]]; then
- VERSION="$(git --git-dir $(dirname "$(command -v "$0")")/.git describe | sed 's|^v||')"
+ VERSION="$(git --git-dir "$(dirname "$(command -v "$0")")"/.git describe | sed 's|^v||')"
else
VERSION="$(dpkg-query --show --showformat='${Version}' "$PN")"
fi
}
# }}}
+# 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
- rmdir "$MNTPOINT" 2>/dev/null
+ if [ -d "$MNTPOINT" ] ; then
+ rmdir "$MNTPOINT" || true
+ fi
fi
# make sure $TARGET is not mounted when exiting grml-debootstrap
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
- einfo "Removing directory ${MNTPOINT}"
- rmdir "$MNTPOINT"
- eend $?
+ if [ -d "$MNTPOINT" ] ; then
+ einfo "Removing directory ${MNTPOINT}"
+ rmdir "$MNTPOINT" || eend $?
+ fi
fi
fi
fi
if [ -n "${ORIG_TARGET}" ] ; then
einfo "Removing loopback mount of file ${ORIG_TARGET}."
- kpartx -d "${ORIG_TARGET}"
+ kpartx -d "${ORIG_TARGET}" || eend $?
# Workaround for a bug in kpartx which doesn't clean up properly,
# see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
if dmsetup ls | grep -q "^${LOOP_PART} "; then
- kpartx -d "/dev/${LOOP_DISK}" >/dev/null
+ kpartx -d "/dev/${LOOP_DISK}" >/dev/null || eend $?
fi
- eend $?
fi
}
# we want to exit smoothly and clean:
bailout(){
+ eend "$1" || true
cleanup
# 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"
CONFFILES=$_opt_confdir
einfo "Using config files under $CONFFILES/."
if ! [ -r "$CONFFILES/config" ] ; then
- eerror "Error: config file $CONFFILES/config not found."; eend 1; bailout 1
+ eerror "Error: config file $CONFFILES/config not found."; bailout 1
fi
# shellcheck disable=SC1091 source=config
if ! . "$CONFFILES/config" ; then
- eerror "Error reading config file $CONFFILES/config" ; eend 1 ; bailout 1
+ eerror "Error reading config file $CONFFILES/config" ; bailout 1
fi
# restore the command line parameter value
CONFFILES=$_opt_confdir
if [ "$_opt_grub" ] && [ "$_opt_vmfile" ] ; then
eerror "The --grub option is incompatible with --vmfile, please drop it from your command line."
eerror "The --grub option is unneeded as GRUB will be installed automatically (unless GRUB_INSTALL='no')."
- eend 1
bailout 1
fi
if [ "${_opt_sshcopyid}" ] && [ "${_opt_sshcopyauth}" ] ; then
eerror "The --sshcopyid option is incompatible with --sshcopyauth, please drop either of them from your command line."
- eend 1
bailout 1
fi
if [ -n "$ISO" ] && [[ "$DEBOOTSTRAP" =~ mmdebstrap$ ]] ; then
eerror "The ISO option is incompatible with usage of mmdebstrap for bootstrapping."
eerror "Either drop the --iso ... option or use plain debootstrap instead."
- eend 1
bailout 1
fi
# 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" ; eend 1 ; bailout 1
+ eerror "Error reading config file $CONFIGFILE" ; bailout 1
fi
fi
# }}}
eerror "Error: you seem to have \$GROOT configured."
eerror "This variable is no longer supported, please visit the"
eerror "grml-debootstrap documentation for details."
- eend 1
bailout 1
fi
if echo "$GRUB" | grep -q '^hd' ; then
eerror "Error: this syntax for the grub configuration variable is no longer supported."
eerror "Please do not use hd... any longer but /dev/sdX instead."
- eend 1
bailout 1
fi
# }}}
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}."
- eend 1
bailout 1
fi
fi
checkconfiguration()
{
-if efi_support ; then
- if [ -z "$_opt_efi" ] ; then
- ewarn "EFI support detected but no --efi option given, please consider enabling it."
- fi
-else
- if [ -n "$_opt_efi" ] ; then
- eerror "EFI option used but no EFI support detected."
- bailout 1
+if [ -z "$VIRTUAL" ] ; then
+ if efi_support ; then
+ if [ -z "$_opt_efi" ] ; then
+ ewarn "EFI support detected but no --efi option given, please consider enabling it."
+ fi
+ else
+ if [ -n "$_opt_efi" ] ; then
+ eerror "EFI option used but no EFI support detected."
+ bailout 1
+ fi
fi
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:"
einfon "Is this ok for you? [y/N] "
read -r a
if ! [ "$a" = 'y' ] || [ "$a" = 'Y' ] ; then
- eerror "Exiting as requested." ; eend 1
+ eerror "Exiting as requested."
bailout 1
fi
fi
if [ -z "${ARCH:-}" ] ; then
eerror 'Architecture neither set (environment variable ARCH), nor could be automatically identified (using dpkg).'
- eerror 'Consider setting the --arch ... option.' ; eend 1
+ eerror 'Consider setting the --arch ... option.'
bailout 1
fi
# }}}
CURRENT_ARCH="$(uname -m)"
if [ "$CURRENT_ARCH" != "x86_64" ] ; then
if [ "$ARCH" = "amd64" ] ; then
- eerror "It is not possible to build amd64 on $CURRENT_ARCH. Consider installing and booting the 'linux-image-amd64' kernel or using '--arch i386' instead." ; eend 1
+ eerror "It is not possible to build amd64 on $CURRENT_ARCH. Consider installing and booting the 'linux-image-amd64' kernel or using '--arch i386' instead."
bailout 1
fi
fi
# Support for generic release codenames is unavailable. {{{
if [ "$RELEASE" = "stable" ] || [ "$RELEASE" = "testing" ] ; then
eerror "Generic release codenames (stable, testing) are unsupported. \
-Please use specific codenames such as bullseye or bookworm." ; eend 1
+Please use specific codenames such as bullseye or bookworm."
bailout 1
fi
# }}}
SHORT_TARGET="${TARGET##*/}"
else
eerror "Please adjust $CONFFILES/config or..."
- eerror "... use the interactive version for configuration before running ${0}" ; eend 1
+ eerror "... use the interactive version for configuration before running ${0}"
bailout 1
fi
# }}}
if [ -r "$STAGES"/grml-debootstrap ] ; then
if grep -q 'done' "${STAGES}/grml-debootstrap" ; then
eerror "Error: grml-debootstrap has been executed already, won't continue therefore."
- eerror "If you want to re-execute grml-debootstrap just manually remove ${STAGES}" ; eend 1
+ eerror "If you want to re-execute grml-debootstrap just manually remove ${STAGES}"
fi
fi
# }}}
# $TARGET was not detected as block device, but we do not want to create target directory in /dev/
if [[ $TARGET == "/dev/"* ]]; then
eerror "Error: Will not create target directory $TARGET in /dev."
- eerror " Please check the partition(s) of the blockdevice."; eend 1
+ eerror " Please check the partition(s) of the blockdevice."
bailout 1
fi
set_target_directory
fi
if grep -q "$TARGET" /proc/mounts ; then
- eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)" ; eend 1
+ eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)"
bailout 1
fi
if [ -n "${ARM_EFI_TARGET}" ] ; then
einfo "Running mkfs.fat $MKFS_OPTS on $ARM_EFI_TARGET"
mkfs.fat -n "EFI" "$ARM_EFI_TARGET"
- eend $?
-
MKFS_OPTS="$MKFS_OPTS -L LINUX"
fi
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
eerror "Not changing disk uuid for $TARGET because $MKFS doesn't seem to match for ext{2,3,4} file system"
- eend 1
bailout 1
else
einfo "Changing disk uuid for $TARGET to fixed (non-random) value $DISK_IDENTIFIER using tune2fs"
tune2fs "$TARGET" -U "$DISK_IDENTIFIER" </dev/null
- eend $?
fi
fi
if [ -n "$VIRTUAL" ] && [ -n "$EFI_TARGET" ]; then
einfo "Creating FAT filesystem on $EFI_TARGET"
mkfs.fat -F32 -n "EFI" "$EFI_TARGET"
- eend $?
fi
# make sure /dev/disk/by-uuid/... is up2date, otherwise grub
# race conditions :-/
sleep 2
- eend $RC
fi
}
# }}}
if [ -n "$TUNE2FS" ] && echo "$MKFS" | grep -q "mkfs.ext" ; then
einfo "Disabling automatic filesystem check on $TARGET via tune2fs"
$TUNE2FS "$TARGET" </dev/null
- eend $?
fi
}
# }}}
einfo "Mounting $TARGET to $MNTPOINT"
mkdir -p "$MNTPOINT"
mount -o rw,suid,dev "$TARGET" "$MNTPOINT"
- eend $?
fi
fi
if [ -n "$ISODIR" ] ; then
einfo "Mounting Debian image loopback to $MNTPOINT/$ISODIR."
mkdir -p "$MNTPOINT/$ISODIR"
mount --bind "$ISODIR" "$MNTPOINT/$ISODIR"
- eend $?
fi
}
# }}}
if [ -b "$TARGET" ] && [ -n "$VMFILE" ] ; then
eerror "Error: specified virtual disk target ($TARGET) is an existing block device."
- eend 1
bailout 1
fi
if [ ! -b "$TARGET" ] && [ -z "$VMFILE" ] ; then
eerror "Error: specified virtual disk target ($TARGET) does not exist yet."
- eend 1
bailout 1
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" ; eend 1
+ eerror "Error finding usable loop device"
bailout 1
fi
# 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." ; eend 1
+ eerror "Device-mapper support missing in kernel."
bailout 1
fi
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
dd if="${TARGET}" of="${MBRTMPFILE}" bs=512 count=1
echo -en "\\x41\\x41\\x41\\x41" | dd of="${MBRTMPFILE}" conv=notrunc seek=440 bs=1
dd if="${MBRTMPFILE}" of="${TARGET}" conv=notrunc
- eend $?
fi
parted -s "${TARGET}" 'mkpart primary ext4 4MiB 100%'
parted -s "${TARGET}" 'set 1 boot on'
DEVINFO=$(kpartx -asv "$TARGET") # e.g. 'add map loop0p1 (254:5): 0 20477 linear 7:0 3' - will be multi-line for arm64
if [ -z "${DEVINFO}" ] ; then
- eerror "Error setting up loopback device." ; eend 1
+ eerror "Error setting up loopback device."
bailout 1
fi
export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop0p1'
if [ -z "$TARGET" ] ; then
- eerror "Error: target could not be set to according /dev/mapper/* device." ; eend 1
+ eerror "Error: target could not be set to according /dev/mapper/* device."
bailout 1
fi
}
fi
if ! mount "${TARGET}" "${MNTPOINT}" ; then
- eerror "Error: Mounting ${TARGET} failed, can not continue." ; eend 1
+ eerror "Error: Mounting ${TARGET} failed, can not continue."
bailout 1
fi
if [ -n "${ARM_EFI_TARGET}" ]; 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." ; eend 1
+ 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
fi
mkdir -p "${MNTPOINT}/boot/grub"
if ! [ -d "${MNTPOINT}"/usr/lib/grub/i386-pc/ ] ; then
- eerror "Error: grub not installed inside Virtual Machine. Can not install bootloader." ; eend 1
+ eerror "Error: grub not installed inside Virtual Machine. Can not install bootloader."
bailout 1
fi
cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/"
einfo "Setting up bind-mount /run/udev"
mkdir -p "${MNTPOINT}"/run/udev
mount --bind /run/udev "${MNTPOINT}"/run/udev
- eend $?
fi
if [ -n "${BOOT_APPEND}" ] ; then
# 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
- eend $?
- 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
}
# }}}
touch "$CHROOT_VARIABLES"
chmod 600 "$CHROOT_VARIABLES" # make sure nobody except root can read it
echo "# Configuration of ${PN}" > "$CHROOT_VARIABLES"
- # Resorting to sed(1) for escaping since "VAR='${VAR//\'/\'\\\'\'}'" does not work with all versions of Bash,
- # e.g. not with 4.2.37(1)-release (a.k.a 4.2+dfsg-0.1+deb7u3) of Debian wheezy
- [ -n "$ARCH" ] && echo "ARCH='$(sed "s,','\\\\'',g" <<<"${ARCH}")'" >> "$CHROOT_VARIABLES"
- [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='$(sed "s,','\\\\'',g" <<<"${BACKPORTREPOS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='$(sed "s,','\\\\'',g" <<<"${BOOT_APPEND}")'" >> "$CHROOT_VARIABLES"
- [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${CHROOT_SCRIPTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$COMPONENTS" ] && echo "COMPONENTS='$(sed "s,','\\\\'',g" <<<"${COMPONENTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$CONFFILES" ] && echo "CONFFILES='$(sed "s,','\\\\'',g" <<<"${CONFFILES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$DEBCONF" ] && echo "DEBCONF='$(sed "s,','\\\\'',g" <<<"${DEBCONF}")'" >> "$CHROOT_VARIABLES"
- [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND='$(sed "s,','\\\\'',g" <<<"${DEBIAN_FRONTEND}")'" >> "$CHROOT_VARIABLES"
- [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP='$(sed "s,','\\\\'',g" <<<"${DEBOOTSTRAP}")'" >> "$CHROOT_VARIABLES"
- [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LOCALES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LANGUAGE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='$(sed "s,','\\\\'',g" <<<"${EXTRAPACKAGES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$EFI" ] && echo "EFI='$(sed "s,','\\\\'',g" <<<"${EFI}")'" >> "$CHROOT_VARIABLES"
- [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='$(sed "s,','\\\\'',g" <<<"${FALLBACK_MIRROR}")'" >> "$CHROOT_VARIABLES"
- [ -n "$FILESYSTEM" ] && echo "FILESYSTEM='$(sed "s,','\\\\'',g" <<<"${FILESYSTEM}")'" >> "$CHROOT_VARIABLES"
- [ -n "$FORCE" ] && echo "FORCE='$(sed "s,','\\\\'',g" <<<"${FORCE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='$(sed "s,','\\\\'',g" <<<"${GRMLREPOS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$GRUB" ] && echo "GRUB='$(sed "s,','\\\\'',g" <<<"${GRUB}")'" >> "$CHROOT_VARIABLES"
- [ -n "$HOSTNAME" ] && echo "HOSTNAME='$(sed "s,','\\\\'',g" <<<"${HOSTNAME}")'" >> "$CHROOT_VARIABLES"
- [ -n "$INITRD" ] && echo "INITRD='$(sed "s,','\\\\'',g" <<<"${INITRD}")'" >> "$CHROOT_VARIABLES"
- [ -n "$INITRD_GENERATOR" ] && echo "INITRD_GENERATOR='$(sed "s,','\\\\'',g" <<<"${INITRD_GENERATOR}")'" >> "$CHROOT_VARIABLES"
- [ -n "$INITRD_GENERATOR_OPTS" ] && echo "INITRD_GENERATOR_OPTS='$(sed "s,','\\\\'',g" <<<"${INITRD_GENERATOR_OPTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES='$(sed "s,','\\\\'',g" <<<"${INSTALL_NOTES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$ISODIR" ] && echo "ISODIR='$(sed "s,','\\\\'',g" <<<"${ISO}")'" >> "$CHROOT_VARIABLES"
- [ -n "$ISO" ] && echo "ISO='$(sed "s,','\\\\'',g" <<<"${ISO}")'" >> "$CHROOT_VARIABLES"
- [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST='$(sed "s,','\\\\'',g" <<<"${KEEP_SRC_LIST}")'" >> "$CHROOT_VARIABLES"
- [ -n "$LOCALES" ] && echo "LOCALES='$(sed "s,','\\\\'',g" <<<"${LOCALES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$MIRROR" ] && echo "MIRROR='$(sed "s,','\\\\'',g" <<<"${MIRROR}")'" >> "$CHROOT_VARIABLES"
- [ -n "$MKFS" ] && echo "MKFS='$(sed "s,','\\\\'',g" <<<"${MKFS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES"
- [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES"
- [ -n "$PACKAGES" ] && echo "PACKAGES='$(sed "s,','\\\\'',g" <<<"${PACKAGES}")'" >> "$CHROOT_VARIABLES"
- [ -n "$POST_SCRIPTS" ] && echo "POST_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${POST_SCRIPTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${PRE_SCRIPTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$RECONFIGURE" ] && echo "RECONFIGURE='$(sed "s,','\\\\'',g" <<<"${RECONFIGURE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$RELEASE" ] && echo "RELEASE='$(sed "s,','\\\\'',g" <<<"${RELEASE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE='$(sed "s,','\\\\'',g" <<<"${RM_APTCACHE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD='$(sed "s,','\\\\'',g" <<<"${ROOTPASSWORD}")'" >> "$CHROOT_VARIABLES"
- [ -n "$SCRIPTS" ] && echo "SCRIPTS='$(sed "s,','\\\\'',g" <<<"${SCRIPTS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$SECURE" ] && echo "SECURE='$(sed "s,','\\\\'',g" <<<"${SECURE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS='$(sed "s,','\\\\'',g" <<<"${SELECTED_PARTITIONS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$TARGET" ] && echo "TARGET='$(sed "s,','\\\\'',g" <<<"${TARGET}")'" >> "$CHROOT_VARIABLES"
- [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM='$(sed "s,','\\\\'',g" <<<"${UPGRADE_SYSTEM}")'" >> "$CHROOT_VARIABLES"
- [ -n "$TARGET_UUID" ] && echo "TARGET_UUID='$(sed "s,','\\\\'',g" <<<"${TARGET_UUID}")'" >> "$CHROOT_VARIABLES"
- [ -n "$TIMEZONE" ] && echo "TIMEZONE='$(sed "s,','\\\\'',g" <<<"${TIMEZONE}")'" >> "$CHROOT_VARIABLES"
- [ -n "$TUNE2FS" ] && echo "TUNE2FS='$(sed "s,','\\\\'',g" <<<"${TUNE2FS}")'" >> "$CHROOT_VARIABLES"
- [ -n "$VMSIZE" ] && echo "VMSIZE='$(sed "s,','\\\\'',g" <<<"${VMSIZE}")'" >> "$CHROOT_VARIABLES"
+ [ -n "$ARCH" ] && echo "ARCH='${ARCH//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='${BACKPORTREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='${BOOT_APPEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='${CHROOT_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$COMPONENTS" ] && echo "COMPONENTS='${COMPONENTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$CONFFILES" ] && echo "CONFFILES='${CONFFILES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBCONF" ] && echo "DEBCONF='${DEBCONF//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND='${DEBIAN_FRONTEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP='${DEBOOTSTRAP//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='${DEFAULT_LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='${DEFAULT_LANGUAGE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='${EXTRAPACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$EFI" ] && echo "EFI='${EFI//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='${FALLBACK_MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FILESYSTEM" ] && echo "FILESYSTEM='${FILESYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FORCE" ] && echo "FORCE='${FORCE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='${GRMLREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$GRUB" ] && echo "GRUB='${GRUB//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$HOSTNAME" ] && echo "HOSTNAME='${HOSTNAME//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD" ] && echo "INITRD='${INITRD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD_GENERATOR" ] && echo "INITRD_GENERATOR='${INITRD_GENERATOR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD_GENERATOR_OPTS" ] && echo "INITRD_GENERATOR_OPTS='${INITRD_GENERATOR_OPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES='${INSTALL_NOTES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ISODIR" ] && echo "ISODIR='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ISO" ] && echo "ISO='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST='${KEEP_SRC_LIST//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$LOCALES" ] && echo "LOCALES='${LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$MIRROR" ] && echo "MIRROR='${MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$MKFS" ] && echo "MKFS='${MKFS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$PACKAGES" ] && echo "PACKAGES='${PACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$POST_SCRIPTS" ] && echo "POST_SCRIPTS='${POST_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS='${PRE_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RECONFIGURE" ] && echo "RECONFIGURE='${RECONFIGURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RELEASE" ] && echo "RELEASE='${RELEASE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE='${RM_APTCACHE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD='${ROOTPASSWORD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SCRIPTS" ] && echo "SCRIPTS='${SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SECURE" ] && echo "SECURE='${SECURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS='${SELECTED_PARTITIONS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET" ] && echo "TARGET='${TARGET//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM='${UPGRADE_SYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET_UUID" ] && echo "TARGET_UUID='${TARGET_UUID//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TIMEZONE" ] && echo "TIMEZONE='${TIMEZONE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TUNE2FS" ] && echo "TUNE2FS='${TUNE2FS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$VMSIZE" ] && echo "VMSIZE='${VMSIZE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
cp $VERBOSE "${CONFFILES}"/chroot-script "${MNTPOINT}"/bin/chroot-script
chmod 755 "${MNTPOINT}"/bin/chroot-script
# setup default locales
[ -n "$LOCALES" ] && cp $VERBOSE "${CONFFILES}"/locale.gen "${MNTPOINT}"/etc/locale.gen
- # MAKEDEV is just a forking bomb crap, let's do it on our own instead :)
- ( cd "${MNTPOINT}"/dev && tar zxf /etc/debootstrap/devices.tar.gz )
-
# copy any existing files to chroot
[ -d "${CONFFILES}"/bin ] && cp $VERBOSE -a -L "${CONFFILES}"/bin/* "${MNTPOINT}"/bin/
[ -d "${CONFFILES}"/boot ] && cp $VERBOSE -a -L "${CONFFILES}"/boot/* "${MNTPOINT}"/boot/
einfo "Installing default /etc/network/interfaces as requested via --defaultinterfaces options."
mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
- eend $?
elif [ -n "$VIRTUAL" ] ; then
einfo "Setting up Virtual Machine, installing default /etc/network/interfaces"
mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
- eend $?
elif [ -r /etc/network/interfaces ] ; then
einfo "Copying /etc/network/interfaces from host to target system"
mkdir -p "${MNTPOINT}/etc/network"
cp $VERBOSE /etc/network/interfaces "${MNTPOINT}/etc/network/interfaces"
- eend $?
else
ewarn "Couldn't read /etc/network/interfaces, installing default /etc/network/interfaces"
mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
- eend $?
fi
# install config file providing some example entries
chmod 0700 "${MNTPOINT}"/root/.ssh
if ! ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then
eerror "Error: executing 'ssh-add -L' failed."
- eend 1
bailout 1
fi
elif [ -f "$AUTHORIZED_KEYS_SOURCE" ]; then
chmod 0700 "$AUTHORIZED_KEYS_TARGET"
if ! cp "$AUTHORIZED_KEYS_SOURCE" "$AUTHORIZED_KEYS_TARGET" ; then
eerror "Error: copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' failed"
- eend 1
bailout 1
fi
else
eerror "Error: Could not open a connection to your authentication agent or the agent has no identities."
- eend 1
bailout 1
fi
fi
if ! [ -f "${AUTHORIZED_KEYS_SOURCE}" ]; then
eerror "Error: could not read '${AUTHORIZED_KEYS_SOURCE}' for setting up SSH key login."
- eend 1
bailout 1
fi
chmod 0700 "${AUTHORIZED_KEYS_TARGET}"
if ! cp "${AUTHORIZED_KEYS_SOURCE}" "${AUTHORIZED_KEYS_TARGET}" ; then
eerror "Error: copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' failed."
- eend 1
bailout 1
fi
fi
einfo "Setting up bind-mount /run/udev"
mkdir -p "${MNTPOINT}"/run/udev
mount --bind /run/udev "${MNTPOINT}"/run/udev
- eend $?
fi
}
# }}}
for script in "${pre_scripts}"/* ; do
if [ -x "$script" ] ; then
einfo "Executing pre-script $script"
- "$script" ; eend $?
+ "$script"
fi
done
fi
for script in "${post_scripts}"/* ; do
if [ -x "$script" ] ; then
einfo "Executing post-script $script"
- "$script" ; eend $?
+ "$script"
fi
done
fi
}
# }}}
-# 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
if grep -q GRML_CHROOT_SCRIPT_MARKER "${MNTPOINT}/bin/chroot-script" ; then
einfo "Removing chroot-script again"
rm -f "${MNTPOINT}/bin/chroot-script"
- eend $?
else
einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found"
fi
fi
if [ -n "$ISODIR" ] ; then
- if grep -q "$ISODIR" /proc/mounts ; then
- einfo "Unmount $MNTPOINT/$ISODIR"
- umount "$MNTPOINT/$ISODIR"
- eend $?
- 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
- eend $?
- fi
+ try_umount 3 "${MNTPOINT}"/run/udev
- if [ -n "$PARTITION" ] ; then
- einfo "Unmount $MNTPOINT"
- umount "$MNTPOINT"
- eend $?
- fi
+ if [ -n "$PARTITION" ] ; then
+ try_umount 3 "$MNTPOINT"
fi
}
# }}}
[ -n "$FSCKTOOL" ] || FSCKTOOL="fsck.${MKFS#mkfs.}"
einfo "Checking filesystem on $TARGET using $FSCKTOOL"
"$FSCKTOOL" "$TARGET"
- eend $?
fi
}
# }}}
einfo "Removing configuration files from installed system as requested via --remove-configs / REMOVE_CONFIGS."
rm -rf "${MNTPOINT}"/etc/debootstrap/
- eend $?
}
# }}}
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