Use cdn.debian.net as default mirror
[grml-debootstrap.git] / grml-debootstrap
index 9babb26..dbf9759 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" ] && {
@@ -179,7 +181,7 @@ prompt_for_target()
   AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \
                sed 's/*//' | \
                grep -v 'Extended$' | \
-               gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; echo /dev/md*);
+               gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; ls /dev/md* 2>/dev/null || true);
 
   if [ -z "$AVAILABLE_PARTITIONS" ] ; then
      dialog --title "$PN" --trim \
@@ -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 --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"
 }
 # }}}
 
@@ -509,14 +526,19 @@ else # if not running automatic installation display configuration and prompt fo
    einfo "$PN - Please recheck configuration before execution:"
    echo
    echo "   Target:          $TARGET"
-      case "$MNTPOINT" in "$TARGET") ;; *) echo "   Mount point:     $MNTPOINT" ;; esac
-      [ -n "$GRUB" ]     && echo "   Install grub:    $GRUB" || echo "   Install grub:    no"
-      [ -n "$RELEASE" ]  && echo "   Using release:   $RELEASE"
-      [ -n "$MIRROR" ]   && echo "   Using mirror:    $MIRROR"
-      [ -n "$HOSTNAME" ] && echo "   Using hostname:  $HOSTNAME"
-      [ -n "$ISO" ]      && echo "   Using ISO:       $ISO"
-      case "$MNTPOINT" in "$TARGET") ;; *) echo "   Important! Continuing will delete all data from ${TARGET}!" ;; esac
-      echo
+
+   # do not display if MNTPOINT is the default one
+   case "$MNTPOINT" in /mnt/debootstrap*) ;; *) echo "   Mount point:     $MNTPOINT" ;; esac
+
+   [ -n "$GRUB" ]     && echo "   Install grub:    $GRUB" || echo "   Install grub:    no"
+   [ -n "$RELEASE" ]  && echo "   Using release:   $RELEASE"
+   [ -n "$MIRROR" ]   && echo "   Using mirror:    $MIRROR"
+   [ -n "$HOSTNAME" ] && echo "   Using hostname:  $HOSTNAME"
+   [ -n "$ISO" ]      && echo "   Using ISO:       $ISO"
+
+   echo "   Important! Continuing will delete all data from ${TARGET}!"
+
+   echo
    einfon "Is this ok for you? [y/N] "
    read a
    if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
@@ -552,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)"
@@ -754,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."