Improve look'n'feel of partition error dialog.
[grml-debootstrap.git] / grml-debootstrap
index ac188e1..17e7385 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
 
@@ -12,7 +11,7 @@ set -e # exit on any error
 
 # variables {{{
 PN="$(basename $0)"
-VERSION='0.18'
+VERSION='0.23'
 MNTPOINT="/mnt/debootstrap.$$"
 
 # inside the chroot system locales might not be available, so use minimum:
@@ -40,6 +39,7 @@ Usage: $PN [options]
 
   -c|--config <configfile>    Use specified configuration file,
                               defaults to /etc/debootstrap/config
+  --hostname <hostname>       Hostname of Debian system
   -i|--iso <mnt>              Mountpoint where a Debian ISO is mounted to,
                               for use instead of fetching packages from a mirror
   -m|--mirror <URL>           Mirror which should be used for apt-get/aptitude.
@@ -104,6 +104,10 @@ while [ "$#" -gt "0" ] ; do
             eend 0
             exit 0
             ;;
+        --hostname)
+            shift
+            HOSTNAME=$1
+            ;;
         --interactive)
             INTERACTIVE=1
             ;;
@@ -152,8 +156,8 @@ done
 # welcome screen {{{
 welcome_dialog()
 {
-   dialog --title "$PN" --msgbox "Welcome to the interactive configuration of grml-debootstrap." 0 0
-   # TODO: improve message
+   dialog --title "$PN" --yesno "Welcome to the interactive configuration of ${PN}.
+Do you want to continue installing Debian using this frontend?" 0 0
 }
 # }}}
 
@@ -165,7 +169,14 @@ prompt_for_target()
                grep -v 'Extended$' | \
                gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}')
 
-  [ -n "$AVAILABLE_PARTITIONS" ] || echo "FIXME: no partitions available?"
+  if [ -z "$AVAILABLE_PARTITIONS" ] ; then
+     dialog --title "$PN" --trim \
+     --msgbox "Sorry, no partitions found. Please configure your
+     harddisks (see /proc/partitions) using a tool like fdisk,
+     cfdisk, gpart, gparted,..." 0 0
+     exit 0
+  fi
+
   PARTITION_LIST=$(for i in $(echo $AVAILABLE_PARTITIONS) ; do
                        echo "$i $(vol_id --type $i 2>/dev/null || echo [no_filesystem_yet])"
                    done)
@@ -190,15 +201,15 @@ prompt_for_bootmanager()
 
   OIFS="$IFS"; IFS=:
 
-  if echo $TARGET | grep -q "*md*" ; then
-     MBRPART=$TARGET
+  if echo $TARGET | grep -q "/dev/md" ; then
+     MBRPART="all disks of Software RAID $TARGET"
   else
-     MBRPART="${TARGET%[0-9]}"
+     MBRPART="MBR of ${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" \
+            mbr       "install bootmanager into $MBRPART" \
             partition "install bootmanager into partition $TARGET" \
             nowhere   "do not install bootmanager at all" \
           ${ADDITIONAL_PARAMS})
@@ -230,6 +241,48 @@ prompt_for_bootmanager()
 }
 # }}}
 
+# 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 hostname {{{
+prompt_for_hostname()
+{
+  HOSTNAME="$(dialog --stdout --title "${PN}" --inputbox \
+            "Please enter the hostname you would like to use for installation:" \
+            0 0 grml)"
+}
+# }}}
+
+# ask for password {{{
+prompt_for_password()
+{
+     ROOTPW1='PW1'
+     ROOTPW2='PW2'
+     while [ "$ROOTPW1" != "$ROOTPW2" ]; do
+       ROOTPW1=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
+       "Please enter the password for the root account:" 10 60)
+       ROOTPW2=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
+       "Please enter the password for the root account again for \
+       confirmation:" 10 60)
+
+       if [ "$ROOTPW1" != "$ROOTPW2" ]; then
+         $(dialog --stdout --title "${PN}" --ok-label \
+         "Retry" --msgbox "Passwords do not match!" 10 60)
+       fi
+     done
+     ROOTPASSWORD="$ROOTPW1"
+}
+# }}}
+
 # ask for Debian mirror {{{
 prompt_for_mirror()
 {
@@ -272,30 +325,187 @@ grubdevice() {
         echo "$tmp_drive"
         ;;
       *) # we expect something like 'hd0,0'
-        echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%"
+        echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%" # FIXME => md0
         ;;
   esac
 }
 # }}}
 
+# software raid setup {{{
+config_swraid_setup()
+{
+TMPFILE=$(mktemp)
+
+# Currently we support only raid1:
+RAIDLEVEL='raid1'
+
+#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" --separate-output \
+       --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 only RAID level 1 is supported by ${PN} currently. Configuration will take place using mdadm." 0 0 ; then
+  config_swraid_setup
+fi
+}
+# }}}
+
+# make sure the user is aware of the used configuration {{{
+checkconfiguration()
+{
+if [ -n "$AUTOINSTALL" ] ; then
+   if checkforrun ; then
+      eerror "Exiting as requested" ; eend 0
+      exit 1
+   fi
+elif [ -n "$INTERACTIVE" ] ; then
+
+   INFOTEXT="Please recheck configuration before execution:
+   "
+   [ -n "$TARGET" ]  && INFOTEXT="$INFOTEXT
+   Target:          $TARGET"
+   [ -n "$GRUB" ]    && INFOTEXT="$INFOTEXT
+   Install grub:    $GRUB"
+   [ -n "$RELEASE" ] && INFOTEXT="$INFOTEXT
+   Using release:   $RELEASE"
+   [ -n "$HOSTNAME" ] && INFOTEXT="$INFOTEXT
+   Using hostname   $HOSTNAME"
+   [ -n "$MIRROR" ]  && INFOTEXT="$INFOTEXT
+   Using mirror:    $MIRROR"
+
+   INFOTEXT="$INFOTEXT
+
+Is this ok for you? Notice: selecting 'No' will exit ${PN}."
+
+   dialog --title "$PN" --no-collapse \
+          --yesno "$INFOTEXT" 0 0
+
+else # if not running automatic installation display configuration and prompt for execution:
+   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 "$ISO" ]     && echo "   Using iso:       $ISO"
+      case "$MNTPOINT" in "$TARGET") ;; *) echo "   Important! Continuing will delete all data from ${TARGET}!" ;; esac
+      echo
+   einfon "Is this ok for you? [y/N] "
+   read a
+   if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
+      eerror "Exiting as requested." ; eend 1
+      exit 1
+   fi
+fi
+}
+# }}}
+
 # interactive mode {{{
 interactive_mode()
 {
   welcome_dialog
-  prompt_for_target
+
+  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
 
-  [ -n "$BOOT_PARTITION" ] && GRUB="$(grubdevice $BOOT_PARTITION)"
-  [ -n "$TARGET" ]         && GROOT="$(grubdevice $TARGET)"
+  prompt_for_release
+
+  prompt_for_hostname
+
+  prompt_for_password
+
+  # use first disk of sw-raid for grub by default, install grub on
+  # all involved disks later on
+  if echo "$TARGET" | grep -q '/dev/md' ; then
+     if [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid
+        # use hdX and not hdX,Y for $GRUB
+        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)"
+     [ -n "$TARGET" ]         && GROOT="$(grubdevice $TARGET)"
+  fi
+
+  prompt_for_mirror
 
-  # TODO
-  # ask for raid
-  # ask for lvm
+  checkconfiguration
 }
 
 # run interactive mode if we didn't get the according configuration yet
 if [ -z "$TARGET" -o -n "$INTERACTIVE" ] ; then
+   # only target might be unset, so make sure the INTERACTIVE flag is set as well
+   INTERACTIVE=1
    interactive_mode
 fi
 # }}}
@@ -312,7 +522,7 @@ fi
 
 # stages setup {{{
 if [ -z "$STAGES" ] ; then
-   STAGES="/etc/debootstrap/stages_${SHORT_TARGET}"
+   STAGES="/var/cache/grml-debootstrap/stages_${SHORT_TARGET}"
    [ -d "$STAGES" ] || mkdir -p "$STAGES"
 fi
 
@@ -370,21 +580,6 @@ ISODIR=${ISO##file:}
 ISODIR=${ISODIR%%/}
 # }}}
 
-# provide variables to chroot system {{{
-CHROOT_VARIABLES="/etc/debootstrap/variables_${SHORT_TARGET}"
-touch $CHROOT_VARIABLES
-chmod 600 $CHROOT_VARIABLES # make sure nobody except root can read it
-[ -n "$ARCH" ]   && echo "ARCH=$ARCH"     >  $CHROOT_VARIABLES
-[ -n "$GRUB" ]   && echo "GRUB=$GRUB"     >> $CHROOT_VARIABLES
-[ -n "$GROOT" ]  && echo "GROOT=$GROOT"   >> $CHROOT_VARIABLES
-[ -n "$TARGET" ] && echo "TARGET=$TARGET" >> $CHROOT_VARIABLES
-[ -n "$ISO" ]    && echo "ISO=$ISO"       >> $CHROOT_VARIABLES
-[ -n "$ISODIR" ] && echo "ISODIR=$ISO"    >> $CHROOT_VARIABLES
-[ -n "$MIRROR" ] && echo "MIRROR=$MIRROR" >> $CHROOT_VARIABLES
-[ -n "$MIRROR" ] && echo "CHROOTMIRROR=$MIRROR" >> $CHROOT_VARIABLES
-[ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES
-# }}}
-
 # helper functions {{{
 # we want to exit smoothly and clean:
 bailout(){
@@ -402,6 +597,11 @@ bailout(){
         [ -d "$MNTPOINT/$ISODIR" ]    && umount "$MNTPOINT/$ISODIR" 1>/dev/null 2>&1
         einfo "Unmounting $MNTPOINT"   ; umount "$MNTPOINT" ; eend $?
 
+        if [ -n "$STAGES" ] ; then
+           echo -n "Removing stages directory ${STAGES}: "
+           rm -rf "$STAGES" && echo done
+        fi
+
         # remove directory only if we used the default with process id inside the name
         if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
            einfo "Removing directory ${MNTPOINT}" ; rmdir $MNTPOINT ; eend $?
@@ -437,43 +637,19 @@ 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
 }
 
-if [ -n "$AUTOINSTALL" ] ; then
-   if checkforrun ; then
-      eerror "Exiting as requested" ; eend 0
-      exit 1
-   fi
-else # if not running automatic installation display configuration and prompt for execution:
-   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 "$ISO" ]     && echo "   Using iso:       $ISO"
-      case "$MNTPOINT" in "$TARGET") ;; *) echo "   Important! Continuing will delete all data from ${TARGET}!" ;; esac
-      echo
-   einfon "Is this ok for you? [y/N] "
-   read a
-   if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
-      eerror "Exiting as requested." ; eend 1
-      exit 1
-   fi
-fi
-# }}}
-
 # create filesystem {{{
 mkfs() {
   if [ -n "$MKFS" ] ; then
      einfo "Running $MKFS on $TARGET"
      $MKFS $TARGET
+     TARGET_UUID="$(vol_id -u $TARGET 2>/dev/null || echo '')"
      eend $?
   fi
 }
@@ -517,7 +693,7 @@ debootstrap_system() {
   if ! grep -q $MNTPOINT /proc/mounts ; then
      mount_target
   fi
-  if grep -q $MNTPOINT /proc/mounts ; then
+  if grep -q $MNTPOINT /proc/mounts || [ -n "$DIRECTORY" ] ; then
      einfo "Running $DEBOOTSTRAP for release ${RELEASE}${ARCHINFO} using ${MIRROR}${ISO}"
      [ -n "$MIRROR" ] && $DEBOOTSTRAP $ARCHCMD $RELEASE $MNTPOINT $MIRROR || \
      $DEBOOTSTRAP $ARCHCMD $RELEASE $MNTPOINT $ISO
@@ -532,23 +708,58 @@ debootstrap_system() {
 # prepare chroot via chroot-script {{{
 preparechroot() {
   einfo "Preparing chroot system"
+
+  # provide variables to chroot system
+  CHROOT_VARIABLES="/var/cache/grml-debootstrap/variables_${SHORT_TARGET}"
+  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 "CHROOTMIRROR=$MIRROR"       >> $CHROOT_VARIABLES
+  [ -n "$MIRROR" ]       && echo "MIRROR=$MIRROR"             >> $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 $CONFFILES/chroot-script $MNTPOINT/bin/chroot-script
   chmod 755 $MNTPOINT/bin/chroot-script
   mkdir $MNTPOINT/etc/debootstrap/
 
   # make sure we have our files for later use via chroot-script
   cp /etc/debootstrap/config    $MNTPOINT/etc/debootstrap/
+  # make sure we adjust the configuration variables accordingly:
+  sed -i "s#RELEASE=.*#RELEASE=\"$RELEASE\"#" $MNTPOINT/etc/debootstrap/config
+  sed -i "s#TARGET=.*#TARGET=\"$TARGET\"#"    $MNTPOINT/etc/debootstrap/config
+  sed -i "s#GRUB=.*#GRUB=\"$GRUB\"#"          $MNTPOINT/etc/debootstrap/config
+  sed -i "s#GROOT=.*#GROOT=\"$GROOT\"#"       $MNTPOINT/etc/debootstrap/config
+
   cp /etc/debootstrap/packages  $MNTPOINT/etc/debootstrap/packages
-  cp $CHROOT_VARIABLES          $MNTPOINT/etc/debootstrap/variables # do NOT use $CHROOT_VARIABLES inside chroot!
+
+  # notice: do NOT use $CHROOT_VARIABLES inside chroot but statically file instead!
+  cp $CHROOT_VARIABLES          $MNTPOINT/etc/debootstrap/variables
 
   cp -a /etc/debootstrap/extrapackages/ $MNTPOINT/etc/debootstrap/
 
   # make sure we can access network [relevant for cdebootstrap]
   [ -f "$MNTPOINT/etc/resolv.conf" ] || cp /etc/resolv.conf $MNTPOINT/etc/resolv.conf
 
+  # provide system's /etc/hosts to the target:
+  if ! [ -f "$MNTPOINT/etc/hosts" ] ; then
+     cp /etc/hosts $MNTPOINT/etc/hosts
+     sed -i "s#127.0.0.1 .*#127.0.0.1       localhost  $HOSTNAME#" /etc/hosts
+  fi
+
   # setup default locales
   [ -n "$LOCALES" ] && cp /etc/debootstrap/locale.gen  $MNTPOINT/etc/locale.gen
 
+  # MAKEDEV is just a forking bomb crap, let's do it on our own instead :)
+  ( cd $MNTPOINT/dev && tar zxf /etc/debootstrap/devices.tar.gz )
+
   # copy any existing existing files to chroot
   [ -d /etc/debootstrap/boot  ] && cp -a /etc/debootstrap/boot/*  $MNTPOINT/boot/
   [ -d /etc/debootstrap/etc   ] && cp -a /etc/debootstrap/etc/*   $MNTPOINT/etc/
@@ -586,9 +797,21 @@ chrootscript() {
 grub_install() {
   if [ -z "$GRUB" -o -z "$GROOT" ] ; then
      echo "Notice: \$GRUB or \$GROOT not defined, will not install grub therefor."
+  elif [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid
+     for device in $SELECTED_PARTITIONS ; do
+        # TMPDEVICE=$(echo ${SELECTED_PARTITIONS} | awk '{print $1}')
+        # GRUB="$(grubdevice ${TMPDEVICE})"
+        # GRUB="$(grubdevice ${TMPDEVICE%%[0-9]})"
+        # GRUB=$(grubdevice $device)
+        GRUB="$(grubdevice ${device%%[0-9]})"
+        einfo "Installing grub on ${GRUB}:"
+        [ -x /usr/sbin/grub-install ] && GRUBINSTALL="/usr/sbin/grub-install --no-floppy" || GRUBINSTALL="/sbin/grub-install --no-floppy"
+        $GRUBINSTALL --root-directory="$MNTPOINT" "(${GRUB})"
+        eend $?
+     done
   else
      einfo "Installing grub on ${GRUB}:"
-     [ -x /usr/sbin/grub-install ] && GRUBINSTALL=/usr/sbin/grub-install || GRUBINSTALL=/sbin/grub-install
+     [ -x /usr/sbin/grub-install ] && GRUBINSTALL="/usr/sbin/grub-install --no-floppy" || GRUBINSTALL="/sbin/grub-install --no-floppy"
      $GRUBINSTALL --root-directory="$MNTPOINT" "(${GRUB})"
      eend $?
   fi
@@ -629,22 +852,27 @@ fscktool() {
 for i in mkfs tunefs mount_target debootstrap_system preparechroot \
          chrootscript grub_install umount_chroot fscktool ; do
     if stage "${i}" ; then
-       $i && stage "${i}" done || bailout 2 "i"
+       $i && ( stage "${i}" done && rm -f "${STAGES}/${i}" ) || bailout 2 "i"
     fi
 done
 # }}}
 
-# stages {{{
-  echo done > $STAGES/grml-debootstrap
+# finalize {{{
+einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $?
+einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?
+
+# Remove temporary mountpoint again
+if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
+   einfo "Removing directory ${MNTPOINT}" ; rmdir "$MNTPOINT" ; eend $?
+fi
 # }}}
 
 # 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
 # }}}