#!/bin/sh
# Filename:      /etc/debootstrap/chroot-script
# Purpose:       script executed in chroot when installing Debian via grml-debootstrap
# 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: Sam Nov 18 10:32:33 CET 2006 [mika]
################################################################################

set -e # exit on any error

. /etc/debootstrap/config || exit 1

[ -r /proc/1 ] || mount -t proc   none /proc

if [ -n "$CHROOTMIRROR" ] ; then
   echo "deb $CHROOTMIRROR $RELEASE main contrib non-free" > /etc/apt/sources.list
fi

if [ -n "$GRMLREPOS" ] ; then
   echo 'deb     http://grml.org/repos/ ./' >> /etc/apt/sources.list
fi

if ! [ -r /etc/kernel-img.conf ] ; then
   echo "Setting up /etc/kernel-img.conf"
   cat > /etc/kernel-img.conf << EOF
# Kernel Image management overrides
# See kernel-img.conf(5) for details
do_initrd = Yes
do_symlinks = Yes
EOF
fi

# create default devices
if ! [ -r /dev/hda20 ] ; then
   echo "Creating generic devices in /dev - this might take a while..."
   cd /dev && MAKEDEV generic
fi

# install additional packages
if [ "$PACKAGES" = 'yes' ] ; then
   if ! [ -r /etc/debootstrap/packages ] ; then
     echo "Error: /etc/debootstrap/packages not found, exiting."
     exit 1
   else
     apt-get update
     apt-get --force-yes -y install $(cat /etc/debootstrap/packages) $GRMLPACKAGES
   fi
fi

# sarge specific stuff
if [ "$RELEASE" = 'sarge' ] ; then
   sed -i "s#ROOT=probe#ROOT=$TARGET#" /etc/mkinitrd/mkinitrd.conf
fi

if [ -n "$KERNEL" ] ; then
   apt-get update
   if [ "$RELEASE" = 'sarge' ] ; then
      KERNELPACKAGES="kernel-image-$KERNEL kernel-headers-$KERNEL"
   else
      KERNELPACKAGES="linux-image-$KERNEL linux-headers-$KERNEL"
   fi
   apt-get --force-yes -y install $KERNELPACKAGES
fi

if [ -n "$RECONFIGURE" ] ; then
   for package in $RECONFIGURE ; do
       dpkg --list $package 1>/dev/null 2>/dev/null && dpkg-reconfigure $package || echo "Warning: $package does not exist, can not reconfigure it."
   done
fi

# set password of user root
echo "Activating shadow passwords."
shadowconfig on
echo "Setting password for user root:"
set +e # do not exit if passwd returns error due to missmatching passwords
passwd
echo ""
set -e # restore default behaviour again

if ! [ -f /etc/hosts ] ; then
   echo "Setting up /etc/hosts"
   echo "127.0.0.1       localhost  $HOSTNAME" > /etc/hosts
fi

if ! [ -f /etc/network/interfaces ] ; then
   echo "Setting up /etc/network/interfaces"
   cat >> /etc/network/interfaces << EOF
iface lo inet loopback
iface eth0 inet dhcp
auto lo
auto eth0
EOF
fi

# adjust timezone
if [ -n "$TIMEZONE" ] ; then
   echo "Adjusting /etc/localtime"
   ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
fi

function createfstab(){
   echo "Setting up /etc/fstab"
cat > /etc/fstab << EOF
$TARGET      /            auto    defaults,errors=remount-ro 0   1
/sys           /sys         sysfs   rw,nosuid,nodev,noexec     0   0
proc           /proc        proc    defaults                   0   0
/dev/cdrom     /mnt/cdrom0  iso9660 ro,user,noauto             0   0
# some other examples:
# /dev/sda2       none         swap    sw                   0   0
# /dev/hda1       /Grml        ext3    dev,suid,user,noauto 0  2
# //1.2.3.4/pub   /smb/pub     smbfs   defaults,user,noauto,uid=grml,gid=grml 0 0
# linux:/pub      /beer        nfs     defaults             0  0
# tmpfs           /tmp         tmpfs   size=300M            0  0
EOF
}

# set up /etc/fstab if file is not present (cdebootstrap)
if [ ! -f /etc/fstab  ] ; then
   createfstab
fi

# set up /etc/fstab if file is UNCONFIGURED (debootstrap)
if grep -q UNCONFIGURED /etc/fstab ; then
   createfstab
fi

# set up hostname
if [ -n "$HOSTNAME" ] ; then
   echo "Setting hostname to ${HOSTNAME}."
   echo "$HOSTNAME" > /etc/hostname
fi

# assume the first available kernel as our main kernel
KERNELIMG=$(ls -1 /boot/vmlinuz-* | head -1)
KERNELVER=${KERNELIMG#/boot/vmlinuz-}

# generate initrd
if [ -n "$INITRD" ] ; then
   if [ "$RELEASE" = 'sarge' ] ; then
      echo "Release sarge detected, will not create an initrd."
   else
      echo "Generating initrd."
      update-initramfs -c -t -k $KERNELVER
      if [ -f "/boot/initrd.img-$KERNELVER" ] ; then
         GRUBINITRD="initrd          /boot/initrd.img-$KERNELVER"
         LILOINITRD="        initrd=/boot/initrd.img-$KERNELVER"
      fi
   fi
fi

if [ -z "$GROOT" ] ; then
   echo "Warning: \$GROOT is not defined, can not adjust grub configuration therefor."
else
   echo "Adjusting grub configuration for use on ${GROOT}."

   # copy stage-files to /boot/grub/
   [ -d /boot/grub/ ] || mkdir /boot/grub
   if [ -d /usr/lib/grub/i386-pc/ ] ; then
      cp /usr/lib/grub/i386-pc/* /boot/grub/
   else
      # sarge ships grub files in another directory
      cp /lib/grub/i386-pc/* /boot/grub/
   fi

   # finally install grub
   update-grub -y
   sed -i "s/^# groot=.*/# groot=(${GROOT})/g" /boot/grub/menu.lst
   sed -i "s|^# kopt=root=.*|# kopt=root=${TARGET} ro|g" /boot/grub/menu.lst
   # not sure why savedefault does not work for me; any ideas?
   sed -i "s/^savedefault.*/# &/g" /boot/grub/menu.lst
   update-grub -y
fi

# make sure we don't have any running processes left
for service in ssh mdadm mdadm-raid ; do
    [ -x "/etc/init.d/$service" ] && "/etc/init.d/$service" stop
done

# unmount all filesystems in chroot, make sure nothing is left...
umount -a    1>/dev/null 2>/dev/null || true
umount /proc 1>/dev/null 2>/dev/null || true
umount /proc 1>/dev/null 2>/dev/null || true
umount -a    1>/dev/null 2>/dev/null || true

# finally exit the chroot
echo "Finished chroot installation, exiting."
exit 0

## END OF FILE #################################################################
