Several fixes for mdadm code
[grml-debootstrap.git] / grml-debootstrap
index 221f8d3..43f19ed 100755 (executable)
@@ -4,7 +4,6 @@
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Wed Aug 27 01:46:13 CEST 2008 [mika]
 ################################################################################
 # http://www.debian.org/releases/stable/i386/index.html.en
 
@@ -149,6 +148,14 @@ while [ "$#" -gt "0" ] ; do
 done
 # }}}
 
+# welcome screen {{{
+welcome_dialog()
+{
+   dialog --title "$PN" --yesno "Welcome to the interactive configuration of ${PN}.
+Do you want to continue installing Debian using this frontend?" 0 0
+}
+# }}}
+
 # ask for target {{{
 prompt_for_target()
 {
@@ -199,7 +206,6 @@ prompt_for_bootmanager()
 
   case "$GETMBR" in
     mbr)
-      USE_MBR=1
       # /dev/md0: has to be installed in MBR of /dev/md0 and not in /dev/md:
       if echo $TARGET | grep -q "*md*" ; then
          BOOT_PARTITION="${TARGET}"
@@ -211,11 +217,9 @@ prompt_for_bootmanager()
       BOOT_PARTITION="$TARGET"
       ;;
     hda)
-      USE_MBR=1
       BOOT_PARTITION="/dev/hda"
       ;;
     sda)
-      USE_MBR=1
       BOOT_PARTITION="/dev/sda"
       ;;
     nowhere)
@@ -250,7 +254,7 @@ grubdevice() {
      echo 'quit' | grub --device-map="$device_map" 1>/dev/null 2>&1
   fi
 
-  # taken from d-i's trunk/packages/arch/i386/grub-installer/grub-installer:
+  # 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%' \
                     -e 's%\(fd[0-9]*\)$%\1%' \
                     -e 's%/part[0-9]*$%/disc%' \
@@ -267,37 +271,108 @@ grubdevice() {
         echo "$tmp_drive"
         ;;
       *) # we expect something like 'hd0,0'
-        # make sure we don't install into MBR if $USE_MBR is not set
-        if [ -z "$USE_MBR" ] ; then
-           echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%"
-        else
-           echo "$tmp_drive" | sed "s%,[0-9]%%"
-        fi
+        echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%" # FIXME => md0
         ;;
   esac
 }
 # }}}
 
+# software raid setup {{{
+config_swraid_setup()
+{
+TMPFILE=$(mktemp)
+RAIDLEVEL=$(dialog --stdout --title "$PN" --default-item raid1 \
+                   --menu "Which RAID level do you want to use?" 0 0 0 \
+                     raid1 "Software RAID level 1" \
+                     raid5 "Software RAID level 5")
+[ $? -eq 0 ] || bailout 20
+
+MD_LIST=$(for i in $(seq 0 9) ; do
+            awk '{print $4}' /proc/partitions | grep -q md$i || \
+            echo "/dev/md$i /dev/md$i"
+          done)
+
+TARGET=$(dialog --stdout --title "$PN" --default-item /dev/md0 \
+--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
+
+AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \
+             sed 's/*//' | \
+             grep -v 'Extended$' | \
+             gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}')
+[ -n "$AVAILABLE_PARTITIONS" ] || echo "FIXME: no partitions available?"
+PARTITION_LIST=$(for i in $(echo $AVAILABLE_PARTITIONS) ; do
+                     echo "$i $(vol_id --type $i 2>/dev/null || echo [no_filesystem_yet]) off"
+                 done)
+
+dialog --title "$PN" \
+       --single-quoted \
+       --checklist "Please select the partitions you would like to use for your $RAIDLEVEL on ${TARGET}:" 0 0 0 \
+       $PARTITION_LIST 2>$TMPFILE
+RETVAL=$?
+SELECTED_PARTITIONS="$(cat $TMPFILE)"
+
+NUM_PARTITIONS=0
+for i in $(cat $TMPFILE) ; do
+   NUM_PARTITIONS=$((${NUM_PARTITIONS}+1))
+done
+
+ERRORFILE=$(mktemp)
+set +e
+# TODO: better error handling?
+yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \
+      --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} 1>/dev/null 2>$ERRORFILE
+RC=$?
+set -e
+
+if [ "$RC" = 0 ] ; then
+   dialog --title "$PN" --msgbox \
+   "Creating $TARGET was successful." 0 0
+   rm -f "$TMPFILE" "$ERRORFILE"
+else
+   dialog --title "$PN" --msgbox \
+   "There was an error setting up $TARGET:
+
+$(cat $ERRORFILE)
+
+Exiting." 0 0
+   rm -f "$TMPFILE" "$ERRORFILE"
+   exit 1
+fi
+
+}
+
+prompt_for_swraid()
+{
+if dialog --stdout --title "$PN" \
+          --defaultno --yesno "Do you want to configure Software RAID?
+
+Please notice that currently only RAID levels 1 and 5 are supported by ${PN}. Configuration will take place using mdadm." 0 0 ; then
+  config_swraid_setup
+fi
+}
+# }}}
+
 # interactive mode {{{
 interactive_mode()
 {
-  prompt_for_target
+  welcome_dialog
+
+  prompt_for_swraid
+
+  # do not prompt for partition dialog if swraid has been configured already
+  [ -n "$TARGET" ] || prompt_for_target
+
   prompt_for_bootmanager
-  prompt_for_mirror
 
+  # FIXME: there seems to be a problem with grubdevice if it's /dev/md*
   [ -n "$BOOT_PARTITION" ] && GRUB="$(grubdevice $BOOT_PARTITION)"
   [ -n "$TARGET" ]         && GROOT="$(grubdevice $TARGET)"
 
-  # FIXME
-  echo "debug: BOOT_PARTITION=$BOOT_PARTITION"
-  echo "debug: TARGET=$TARGET"
-  echo "debug: MIRROR=$MIRROR"
-  echo "debug: GROOT=$GROOT"
-  echo "debug: GRUB=$GRUB"
-
-  # TODO
-  # ask for raid
-  # ask for lvm
+  prompt_for_mirror
 }
 
 # run interactive mode if we didn't get the according configuration yet
@@ -443,8 +518,8 @@ checkforrun() {
    dialog --timeout 10 --title "$PN" \
           --yesno "Do you want to stop at this stage?
 
-Notice: you are running grml-debootstrap in non-interactive mode.
-grml-debootstrap will install Debian ${RELEASE} on ${TARGET}.
+Notice: you are running ${PN} in non-interactive mode.
+${PN} will install Debian ${RELEASE} on ${TARGET}.
 Last chance to quit. Timeout of 10 seconds running....
 
 Do you want to stop now?" 0 0 2>/dev/null
@@ -647,10 +722,9 @@ done
 # end dialog of autoinstallation {{{
 if [ -n "$AUTOINSTALL" ] ; then
    dialog --title "$PN" --msgbox \
-          "Finished execution of ${0}.
-Enjoy your Debian system." 6 60
+          "Finished execution of ${PN}. Enjoy your Debian system." 0 0
 else
-   einfo "Finished execution of $PN - enjoy your Debian system." ; eend 0
+   einfo "Finished execution of ${PN}. Enjoy your Debian system." ; eend 0
 fi
 # }}}