Move displaying installation notes into umount_chroot()
[grml-debootstrap.git] / grml-debootstrap
index 8cafe54..946b5be 100755 (executable)
@@ -11,7 +11,7 @@ set -e # exit on any error
 
 # variables {{{
 PN="$(basename $0)"
-VERSION='0.28'
+VERSION='0.30'
 MNTPOINT="/mnt/debootstrap.$$"
 
 # inside the chroot system locales might not be available, so use minimum:
@@ -51,6 +51,7 @@ Bootstrap options:
                            \$TARGET in grub syntax, like hd0,0 for /dev/sda1.
       --grub <device>    Target for grub installation. Use grub syntax for
                            specifying, like hd0 for /dev/sda.
+      --arch <arch>      Architecture to use. Currently only i386 is supported.
 
 Configuration options:
 
@@ -149,6 +150,7 @@ fi
 [ "$_opt_bootappend" ]          && BOOT_APPEND=$_opt_bootappend
 [ "$_opt_groot" ]               && GROOT=$_opt_groot
 [ "$_opt_grub" ]                && GRUB=$_opt_grub
+[ "$_opt_arch" ]                && ARCH=$_opt_arch
 [ "$_opt_verbose" ]             && VERBOSE="-v"
 
 [ "$_opt_help" ] && {
@@ -326,7 +328,7 @@ prompt_for_mirror()
           )
 
   if [ "$CHOOSE_MIRROR" = 'net' ] ; then
-     [ -n "$MIRROR" ] || MIRROR='ftp://ftp.de.debian.org/debian'
+     [ -n "$MIRROR" ] || MIRROR='http://cdn.debian.net/debian'
      MIRROR="$(dialog --stdout --title "${PN}" --inputbox \
                "Please enter Debian mirror you would like to use for installing packages." \
                0 0 $MIRROR)"
@@ -348,33 +350,48 @@ grubdevice() {
   fi
 
   device="$1"
-  device_map=/boot/grub/device.map
+  device_map=$(mktemp)
 
   # create device.map
-  if ! [ -f "$device_map" ] ; then
-     echo 'quit' | grub --device-map="$device_map" 1>/dev/null 2>&1
+  if which grub >/dev/null 2>&1 ; then
+     echo 'quit' | grub --device-map="$device_map" >/dev/null 2>&1
+  elif which grub-mkdevicemap >/dev/null 2>&1 ; then
+     grub-mkdevicemap --no-floppy --device-map="$device_map" >/dev/null 2>&1
+  else
+    echo "Error: neither grub nor grub-mkdevicemap command found." >&2
+    return 1
   fi
 
   # based on code from d-i's trunk/packages/arch/i386/grub-installer/grub-installer:
-  tmp_disk=`echo "$device" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
+  tmp_disk=$(echo "$device" | sed -e 's%\(\(s\|h\|v\|xv\)d[a-z]\)[0-9]*$%\1%' \
                     -e 's%\(fd[0-9]*\)$%\1%' \
                     -e 's%/part[0-9]*$%/disc%' \
-                    -e 's%\(c[0-7]d[0-9]*\).*$%\1%'`
-  tmp_part=`echo "$device" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
+                    -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
+                    -e 's%\(mmcblk[0-9]d[0-9]*\).*$%\1%' \
+                    -e 's%\(/mapper/mpath[0-9]\+\)-part[0-9]\+$%\1%')
+  tmp_part=$(echo "$device" | sed -e 's%.*/\(s\|h\|v\|xv\)d[a-z]\([0-9]*\)$%\2%' \
                     -e 's%.*/fd[0-9]*$%%' \
                     -e 's%.*/floppy/[0-9]*$%%' \
                     -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
-                    -e 's%.*c[0-7]d[0-9]*p*%%'`
+                    -e 's%.*c[0-7]d[0-9]*p*%%' \
+                    -e 's%.*mmcblk[0-9]d[0-9]*p%%' \
+                    -e 's%.*/mapper/mpath[0-9]\+-part\([0-9]\+\)%\1%')
   tmp_drive=$(grep -v '^#' $device_map | grep "$tmp_disk *$" | sed 's%.*\([hf]d[0-9][a-g0-9,]*\).*%\1%')
 
+  if [ -z "$tmp_drive" ]; then
+    echo "Error: $device does not have any corresponding BIOS drive." >&2
+    return 1
+  fi
+
   case $1 in
      /dev/[sh]d[a-z]) # we expect something like 'hd0'
         echo "$tmp_drive"
         ;;
       *) # we expect something like 'hd0,0'
-        echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%" # FIXME => md0
+        echo "$tmp_drive" | sed "s%$%,$(expr $tmp_part - 1)%" # FIXME => md0
         ;;
   esac
+  rm -f "$device_map"
 }
 # }}}
 
@@ -557,7 +574,6 @@ interactive_mode()
         TMPDEVICE=$(echo ${SELECTED_PARTITIONS} | awk '{print $1}') # use first disk only
         GRUB="$(grubdevice ${TMPDEVICE%%[0-9]})" # like: hd0
         GROOT="$(grubdevice ${TMPDEVICE})"       # like: hd0,0
-        echo "debug: GRUB = $GRUB - GROOT = $GROOT" >/tmp/debug # FIXME
      fi
   else
      [ -n "$BOOT_PARTITION" ] && GRUB="$(grubdevice $BOOT_PARTITION)"
@@ -759,17 +775,18 @@ mount_target() {
 
 # install main chroot {{{
 debootstrap_system() {
-  if ! grep -q "$MNTPOINT" /proc/mounts ; then
-     mount_target
-  fi
   if [ "$_opt_nodebootstrap" ]; then
      einfo "Skipping debootstrap as requested."
      return
   fi
+
   if grep -q "$MNTPOINT" /proc/mounts || [ -n "$DIRECTORY" ] ; then
      einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}${ISO}"
-     [ -n "$MIRROR" ] && $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR || \
-     $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO
+     if [ -n "$MIRROR" ] ; then
+        $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR
+     else
+        $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO
+     fi
      eend $?
   else
      eerror "Error: $MNTPOINT not mounted, can not continue."
@@ -787,18 +804,19 @@ preparechroot() {
   touch $CHROOT_VARIABLES
   chmod 600 $CHROOT_VARIABLES # make sure nobody except root can read it
   echo "# Configuration of ${PN}"                              > $CHROOT_VARIABLES
-  [ -n "$ARCH" ]         && echo "ARCH=$ARCH"                 >> $CHROOT_VARIABLES
-  [ -n "$GROOT" ]        && echo "GROOT=$GROOT"               >> $CHROOT_VARIABLES
-  [ -n "$GRUB" ]         && echo "GRUB=$GRUB"                 >> $CHROOT_VARIABLES
-  [ -n "$HOSTNAME" ]     && echo "HOSTNAME=$HOSTNAME"         >> $CHROOT_VARIABLES
-  [ -n "$ISODIR" ]       && echo "ISODIR=$ISO"                >> $CHROOT_VARIABLES
-  [ -n "$ISO" ]          && echo "ISO=$ISO"                   >> $CHROOT_VARIABLES
-  [ -n "$MIRROR" ]       && echo "MIRROR=$MIRROR"             >> $CHROOT_VARIABLES
+  [ -n "$ARCH" ]          && echo "ARCH=$ARCH"                 >> $CHROOT_VARIABLES
+  [ -n "$GROOT" ]         && echo "GROOT=$GROOT"               >> $CHROOT_VARIABLES
+  [ -n "$GRUB" ]          && echo "GRUB=$GRUB"                 >> $CHROOT_VARIABLES
+  [ -n "$HOSTNAME" ]      && echo "HOSTNAME=$HOSTNAME"         >> $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 "$MIRROR" ]        && echo "MIRROR=$MIRROR"             >> $CHROOT_VARIABLES
   [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST=$KEEP_SRC_LIST" >> $CHROOT_VARIABLES
-  [ -n "$PACKAGES" ]     && echo "PACKAGES=$PACKAGES"         >> $CHROOT_VARIABLES
-  [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES
-  [ -n "$TARGET" ]       && echo "TARGET=$TARGET"             >> $CHROOT_VARIABLES
-  [ -n "$TARGET_UUID" ]  && echo "TARGET_UUID=$TARGET_UUID"   >> $CHROOT_VARIABLES
+  [ -n "$PACKAGES" ]      && echo "PACKAGES=$PACKAGES"         >> $CHROOT_VARIABLES
+  [ -n "$ROOTPASSWORD" ]  && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES
+  [ -n "$TARGET" ]        && echo "TARGET=$TARGET"             >> $CHROOT_VARIABLES
+  [ -n "$TARGET_UUID" ]   && echo "TARGET_UUID=$TARGET_UUID"   >> $CHROOT_VARIABLES
 
   cp $VERBOSE $CONFFILES/chroot-script $MNTPOINT/bin/chroot-script
   chmod 755 $MNTPOINT/bin/chroot-script
@@ -812,6 +830,11 @@ preparechroot() {
   sed -i "s#GRUB=.*#GRUB=\"$GRUB\"#"          $MNTPOINT/etc/debootstrap/config
   sed -i "s#GROOT=.*#GROOT=\"$GROOT\"#"       $MNTPOINT/etc/debootstrap/config
 
+  # install notes:
+  if [ -n "$INSTALL_NOTES" ] ; then
+     [ -r "$INSTALL_NOTES" ] && cp "$INSTALL_NOTES" $MNTPOINT/etc/debootstrap/
+  fi
+
   # package selection:
   cp $VERBOSE ${_opt_packages:-$CONFFILES/packages} \
     $MNTPOINT/etc/debootstrap/packages
@@ -923,8 +946,14 @@ grub_install() {
 }
 # }}}
 
-# unmount $MNTPOINRT {{{
+# unmount $MNTPOINT {{{
 umount_chroot() {
+
+  # display installation notes:
+  if [ -n "$INSTALL_NOTES" ] ; then
+     [ -r "${MNTPOINT}/${INSTALL_NOTES}" ] && cat "${MNTPOINT}/${INSTALL_NOTES}"
+  fi
+
   if [ -n "$ISODIR" ] ; then
      if grep -q "$ISODIR" /proc/mounts ; then
         einfo "Unmount $MNTPOINT/$ISODIR"