Always execute finalize(), based on patch by Tong Sun <suntong@cpan.org>
[grml-debootstrap.git] / chroot-script
index f9e3b0e..b5f1abe 100755 (executable)
@@ -17,7 +17,7 @@ set -e # exit on any error
 
 # use aptitude only if it's available
 if [ -x /usr/bin/aptitude ] ; then
-   APTINSTALL='aptitude -y install '
+   APTINSTALL='aptitude -y --without-recommends install '
    APTUPDATE='aptitude update'
 else
    APTINSTALL='apt-get --force-yes -y install'
@@ -36,14 +36,17 @@ stage() {
      echo "$2" > "$STAGES/$1"
      return 0
   elif grep -q done "$STAGES/$1" 2>/dev/null ; then
-     echo "[*] Notice: stage $1 has been executed already, skipping execution therefore.">&2
+     echo "   [*] Notice: stage $1 has been executed already, skipping execution therefore.">&2
      return 1
   fi
+  echo "   Executing stage ${1}"
+  return 0
 }
 # }}}
 
 # define chroot mirror {{{
 chrootmirror() {
+  [ -n "$KEEP_SRC_LIST" ] && return
   if [ -n "$ISO" ] ; then
      echo "deb $ISO $RELEASE main contrib" > /etc/apt/sources.list
      [ -n "$CHROOTMIRROR" ] && echo "deb $CHROOTMIRROR $RELEASE main contrib non-free" >> /etc/apt/sources.list
@@ -58,7 +61,9 @@ chrootmirror() {
 # set up grml repository {{{
 grmlrepos() {
   if [ -n "$GRMLREPOS" ] ; then
-     cat >> /etc/apt/sources.list << EOF
+     # user might have provided their own apt sources.list
+     if ! grep -q grml /etc/apt/sources.list 2>/dev/null ; then
+        cat >> /etc/apt/sources.list << EOF
 
 # grml: stable repository:
   deb     http://deb.grml.org/ grml-stable  main
@@ -69,6 +74,8 @@ grmlrepos() {
   deb-src http://deb.grml.org/ grml-testing main
 
 EOF
+     fi
+
      # make sure we have the keys available for aptitude
      gpg --keyserver subkeys.pgp.net --recv-keys F61E2E7CECDEA787
      gpg --export F61E2E7CECDEA787 | apt-key add - || /bin/true # not yet sure
@@ -131,6 +138,13 @@ EOF
 
 # install additional packages {{{
 packages() {
+  # Pre-seed the debconf database with answers. Each question will be marked
+  # as seen to prevent debconf from asking the question interactively.
+  [ -f /etc/debootstrap/debconf-selections ] && {
+    echo "Preseeding the debconf database, some lines might be skipped..."
+    cat /etc/debootstrap/debconf-selections | debconf-set-selections
+  }
+
   if [ "$PACKAGES" = 'yes' ] ; then
      if ! [ -r /etc/debootstrap/packages ] ; then
        echo "Error: /etc/debootstrap/packages not found, exiting."
@@ -200,13 +214,14 @@ reconfigure() {
 # }}}
 
 # set password of user root {{{
-passwords() {
+passwords()
+{
   echo "Activating shadow passwords."
   shadowconfig on
 
   if [ -n "$ROOTPASSWORD" ] ; then
-     echo root:"$ROOTPASSWD" | chpasswd -m
-     export ROOTPASSWD=''
+     echo root:"$ROOTPASSWORD" | chpasswd -m
+     export ROOTPASSWORD=''
   else
     a='1'
     b='2'
@@ -218,12 +233,15 @@ passwords() {
        echo -n "Retype new UNIX password for user root: "
        read -s b
        echo
-       echo root:"$a" | chpasswd -m
        if [ "$a" != "$b" ] ; then
          echo "Sorry, passwords do not match. Retry."
+         a='1'
+         b='2'
+       else
+         echo root:"$a" | chpasswd -m
+         unset a
+         unset b
        fi
-       unset a
-       unset b
      done
   fi
 }
@@ -240,7 +258,7 @@ hosts() {
 
 # set up /etc/network/interfaces {{{
 interfaces() {
-  if ! [ -r /etc/network/interfaces ] ; then
+  if ! [ -r /etc/network/interfaces ] || ! grep -q "auto lo" /etc/network/interfaces ; then
      echo "Setting up /etc/network/interfaces"
      cat >> /etc/network/interfaces << EOF
 
@@ -269,8 +287,13 @@ timezone() {
 # helper function for fstab() {{{
 createfstab(){
      echo "Setting up /etc/fstab"
-cat > /etc/fstab << EOF
-$TARGET      /            auto    defaults,errors=remount-ro 0   1
+if [ -n "$TARGET_UUID" ] ; then
+   echo "/dev/disk/by-uuid/${TARGET_UUID} /  auto    defaults,errors=remount-ro 0   1" > /etc/fstab
+else
+   echo "${TARGET} /  auto    defaults,errors=remount-ro 0   1" > /etc/fstab
+fi
+
+cat >> /etc/fstab << EOF
 proc           /proc        proc    defaults                      0   0
 /sys           /sys         sysfs   noauto,rw,nosuid,nodev,noexec 0   0
 /dev/cdrom     /mnt/cdrom0  iso9660 ro,user,noauto                0   0
@@ -303,6 +326,11 @@ hostname() {
   if [ -n "$HOSTNAME" ] ; then
      echo "Setting hostname to ${HOSTNAME}."
      echo "$HOSTNAME" > /etc/hostname
+
+     # adjust postfix configuration
+     if [ -r /etc/postfix/main.cf ] ; then
+        sed -i "s/grml/$HOSTNAME/g" /etc/postfix/main.cf
+     fi
   fi
 }
 # }}}
@@ -354,7 +382,11 @@ grub() {
      $UPDATEGRUB -y
      if [ -f /boot/grub/menu.lst ] ; then
         sed -i "s/^# groot=.*/# groot=(${GROOT})/g" /boot/grub/menu.lst
-        sed -i "s|^# kopt=root=.*|# kopt=root=${TARGET} ro ${BOOT_APPEND}|g" /boot/grub/menu.lst
+       if [ -n "$TARGET_UUID" ] ; then
+          sed -i "s|^# kopt=root=.*|# kopt=root=UUID=${TARGET_UUID} ro ${BOOT_APPEND}|g" /boot/grub/menu.lst
+       else
+          sed -i "s|^# kopt=root=.*|# kopt=root=${TARGET} ro ${BOOT_APPEND}|g" /boot/grub/menu.lst
+       fi
         # not sure why savedefault does not work for me; any ideas?
         sed -i "s/^savedefault.*/# &/g" /boot/grub/menu.lst
         $UPDATEGRUB -y
@@ -363,6 +395,17 @@ grub() {
 }
 # }}}
 
+# execute all scripts present in /etc/debootstrap/chroot-scripts/ {{{
+custom_scripts() {
+  [ -d /etc/debootstrap/chroot-scripts/ ] || return 0
+
+  for script in /etc/debootstrap/chroot-scripts/* ; do
+      echo "Executing script $script"
+      $script && echo "done" || echo "failed"
+  done
+}
+# }}}
+
 # make sure we don't have any running processes left {{{
 services() {
   for service in ssh mdadm mdadm-raid ; do
@@ -388,11 +431,13 @@ finalize() {
 # execute the functions {{{
  for i in chrootmirror grmlrepos kernelimg_conf makedev install_policy_rcd \
      packages extrapackages mkinitrd kernel reconfigure hosts interfaces   \
-     timezone fstab hostname initrd grub passwords services finalize ; do
-    if stage $i ; then
+     timezone fstab hostname initrd grub passwords custom_scripts services ; do
+     if stage $i ; then
        $i && stage $i done || exit 1
-    fi
+     fi
   done
+  # always execute the finalize stage:
+  finalize
 # }}}
 
 # finally exit the chroot {{{