+ if [ -n "$CONFIGFILE" ] ; then
+ if ! . "$CONFIGFILE" ; then
+ eerror "Error reading config file $CONFIGFILE" ; eend 1 ; exit 1
+ fi
+ else
+ . /etc/debootstrap/config
+ fi
+fi
+# }}}
+
+# cmdline handling {{{
+
+while [ "$#" -gt "0" ] ; do
+ case $1 in
+ -c|--config)
+ shift
+ CONFIGFILE=$1
+ ;;
+ --grub)
+ shift
+ GRUB=$1
+ ;;
+ --groot)
+ shift
+ GROOT=$1
+ ;;
+ -h|--help)
+ usage ; eend 0
+ eend 0
+ exit 0
+ ;;
+ --interactive)
+ INTERACTIVE=1
+ ;;
+ -i|--iso)
+ shift
+ [ -n "$MIRROR" ] && unset MIRROR
+ ISO=$1
+ ;;
+ -m|--mirror)
+ shift
+ MIRROR=$1
+ CHROOTMIRROR=$1
+ ;;
+ -p|--mntpoint)
+ shift
+ MNTPOINT=$1
+ ;;
+ --password)
+ shift
+ ROOTPASSWORD=$1
+ ;;
+ -r|--release)
+ shift
+ RELEASE=$1
+ ;;
+ -t|--target)
+ shift
+ TARGET=$1
+ ;;
+ -v|--version)
+ einfo "$PN - version $VERSION"
+ einfo "Send bug reports to bugs@grml.org or http://grml.org/bugs/"
+ eend 0
+ exit 0
+ ;;
+ *)
+ eerror "Syntax error."
+ usage ; eend 1
+ exit 1
+ ;;
+ esac
+ shift
+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()
+{
+ 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])"
+ done)
+
+ TARGET=$(dialog --title "$PN" --single-quoted --stdout \
+ --menu "Please select the target partition:" 0 0 0 \
+ $PARTITION_LIST)
+}
+# }}}
+
+# ask for bootmanager {{{
+prompt_for_bootmanager()
+{
+ ADDITIONAL_PARAMS=""
+ for device in sda hda; do
+ if [ /dev/$device != ${TARGET%[0-9]} ]; then
+ grep -q $device /proc/partitions && \
+ ADDITIONAL_PARAMS=:$device:"install bootmanager grub into MBR of /dev/${device}"
+ fi
+ done
+ ADDITIONAL_PARAMS=${ADDITIONAL_PARAMS#:}
+
+ OIFS="$IFS"; IFS=:
+
+ if echo $TARGET | grep -q "*md*" ; then
+ MBRPART=$TARGET
+ else
+ MBRPART="${TARGET%[0-9]}"
+ fi
+
+ GETMBR=$(dialog --stdout --title "$PN" --default-item mbr \
+ --menu "Where do you want to install the bootmanager grub?" 0 0 0 \
+ mbr "install bootmanager into MBR of $MBRPART" \
+ partition "install bootmanager into partition $TARGET" \
+ nowhere "do not install bootmanager at all" \
+ ${ADDITIONAL_PARAMS})
+ [ $? -eq 0 ] || bailout 3
+ IFS="$OIFS"
+
+ case "$GETMBR" in
+ mbr)
+ # /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}"
+ else
+ BOOT_PARTITION="${TARGET%[0-9]}"
+ fi
+ ;;
+ partition)
+ BOOT_PARTITION="$TARGET"
+ ;;
+ hda)
+ BOOT_PARTITION="/dev/hda"
+ ;;
+ sda)
+ BOOT_PARTITION="/dev/sda"
+ ;;
+ nowhere)
+ BOOT_PARTITION=''
+ ;;
+ esac
+}
+# }}}
+
+# ask for Debian release {{{
+prompt_for_release()
+{
+ RELEASE="$(dialog --stdout --title "${PN}" --default-item etch --menu \
+ "Please enter the Debian release you would like to use for installation:" \
+ 0 50 3 \
+ etch Debian/stable \
+ lenny Debian/testing \
+ sid Debian/unstable)"
+}
+# }}}
+
+# ask for Debian mirror {{{
+prompt_for_mirror()
+{
+ MIRROR="$(dialog --stdout --title "${PN}" --inputbox \
+ "Please enter Debian mirror you would like to use for installing packages." \
+ 0 0 http://ftp.de.debian.org/debian)"
+}
+# }}}
+
+# get grub's syntax for /dev/ice {{{
+# usage example: 'grubdevice /dev/sda2' returns 'hd0,1'
+grubdevice() {
+ if [ -z "$1" ] ; then
+ echo "Usage: grubdevice <device>">&2
+ return 1
+ fi
+
+ device="$1"
+ device_map=/boot/grub/device.map
+
+ # create device.map
+ if ! [ -f "$device_map" ] ; then
+ echo 'quit' | grub --device-map="$device_map" 1>/dev/null 2>&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%' \
+ -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%.*/fd[0-9]*$%%' \
+ -e 's%.*/floppy/[0-9]*$%%' \
+ -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
+ -e 's%.*c[0-7]d[0-9]*p*%%'`
+ tmp_drive=$(grep -v '^#' $device_map | grep "$tmp_disk *$" | sed 's%.*\([hf]d[0-9][a-g0-9,]*\).*%\1%')
+
+ 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
+ ;;
+ 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"