implemented trap ERR for grml-debootstrap and chroot-script; changed chroot script...
[grml-debootstrap.git] / grml-debootstrap
index 93bcbbf..9b8c47d 100755 (executable)
@@ -6,6 +6,38 @@
 # License:       This file is licensed under the GPL v2+
 ################################################################################
 
+# 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!
+last bash command: $last_bash_command"
+   fi
+   if [ ! "$FAIL_TRAP_ERR" = "yes" ]; then
+      return
+   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 -o pipefail
+   trap "error_handler" ERR
+   export -f "error_handler"
+fi
+# }}}
+
 # variables {{{
 PN="$(basename "$0")"
 if [[ -d "$(dirname "$(which "$0")")"/.git ]]; then
@@ -389,7 +421,7 @@ fi
 
 # make sure we have what we need {{{
 if [ -n "$VIRTUAL" ] ; then
-  check4progs grub-mkimage kpartx mksh parted qemu-img || bailout 1
+  check4progs kpartx mksh parted qemu-img || bailout 1
 fi
 # }}}
 
@@ -535,6 +567,7 @@ prompt_for_release()
             squeeze  Debian/6.0 \
             wheezy   Debian/7.0 \
             jessie   Debian/8.0 \
+            stretch  Debian/9.0 \
             sid      Debian/unstable)"
   [ $? -eq 0 ] || bailout
 }
@@ -838,7 +871,7 @@ 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 lenny, squeeze, wheezy or jessie." ; eend 1
+Please use specific codenames such as lenny, squeeze, wheezy, jessie or stretch." ; eend 1
    bailout 1
 fi
 # }}}
@@ -1092,12 +1125,15 @@ finalize_vm() {
     bailout 1
   fi
 
-  einfo "Installing Grub as bootloader."
   mount -t proc none "${MNTPOINT}"/proc
   mount -t sysfs none "${MNTPOINT}"/sys
   mount --bind /dev "${MNTPOINT}"/dev
   mount --bind /dev/pts "${MNTPOINT}"/dev/pts
 
+# Has chroot-script installed GRUB to MBR using grub-install (successfully), already?
+# chroot-script skips installation for unset ${GRUB}
+if [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/dev/null | cat -v | fgrep -q GRUB; then
+  einfo "Installing Grub as bootloader."
   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
@@ -1115,6 +1151,7 @@ finalize_vm() {
   chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2
   dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=4
   rm -f "${MNTPOINT}/tmp/core.img"
+fi
 
   einfo "Updating grub configuration file."
   if [ -n "$BOOT_APPEND" ] ; then
@@ -1132,7 +1169,7 @@ finalize_vm() {
   umount "${MNTPOINT}"/proc
   umount "${MNTPOINT}"/sys
   umount "${MNTPOINT}"/dev/pts
-  umount "${MNTPOINT}"/dev
+  try_umount 3 "${MNTPOINT}"/dev
   umount "${MNTPOINT}"
   kpartx -d "${ORIG_TARGET}" >/dev/null
 }
@@ -1398,7 +1435,7 @@ chrootscript() {
     mount --bind /dev "$MNTPOINT"/dev
     mount --bind /dev/pts "$MNTPOINT"/dev/pts
     if [ "$DEBUG" = "true" ] ; then
-      chroot "$MNTPOINT" /bin/sh -x /bin/chroot-script ; RC=$?
+      chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script ; RC=$?
     else
       chroot "$MNTPOINT" /bin/chroot-script ; RC=$?
     fi