#!/bin/sh
#
# bootcd2disk
#
# DISK=auto, we will build an boot partition with size defined in BOOTS
BOOTS=50

VERBOSE=""
CONFDIR="/etc/bootcd"
while [ $# -gt 0 ]; do
  if [ "$1" = "-v" ]; then
    VERBOSE="$1"
    shift
  elif [ "$1" = "-c" -a $# -gt 1 ]; then
    CONFDIR=$2
    shift 2
  else
    echo "Usage: bootcd2disk [-v]"
    echo "  use man bootcd2disk to get help"
    echo "  and see $CONFDIR/bootcd2disk.conf"
    exit 1
  fi
done

[ ! -f /etc/bootcd/thisbootcd.conf ] && err "No file /etc/bootcd/thisbootcd.conf"
[ ! -f $CONFDIR/bootcd2disk.conf ] && err "No file $CONFDIR/bootcd2disk.conf"

CONFVARS="DISK SFDISK EXT2FS EXT3 SWAP MOUNT UMOUNT FSTAB LILO SSHHOSTKEY"
CREATEVARS="KERNEL"
unset $CONFVARS $CREATEVARS
unset 
. $CONFDIR/bootcd2disk.conf
. /etc/bootcd/thisbootcd.conf
. /usr/share/bootcd/bootcd-run.lib

for i in $CONFVARS; do
  [ "`set | grep ^$i=`" ] || err "$i is not set in $CONFDIR/bootcdwrite.conf"
done

for i in $CREATEVARS; do
  [ "`set | grep ^$i=`" ] || err "$i is not set in /etc/bootcd/thisbootcd.conf"
done

cleanup()
{
  echo "cleanup"
}

check_ext3()
{
  [ "$EXT3" = "no" ] && return

PROBLEM="
To use EXT3 some kernel options are needed. It seems not all needed
Options are build in the kernel."
  if [ "$KCONF" ]; then
    for i in \
      "CONFIG_EXT3_FS=y"
    do
      grep -q "^$i" $KCONF
      if [ $? != 0 ]; then
        if [ "$EXT3" = "yes" ]; then
	  warn "CONFIG_EXT3_FS is not configured.$PROBLEM"
        else
	  echo "CONFIG_EXT3_FS is not configured.$PROBLEM" >>$ERRLOG
          echo " => EXT3=no" >>$ERRLOG
	  EXT3=no
	  return
	fi
      fi
    done
  fi

PROBLEM="
To use EXT3 a new version of e2fsprogs has to be installed. For example
the file /sbin/mkfs.ext3 must exist."
  if [ ! -f "/sbin/mkfs.ext3" ]; then
    if [ "$EXT3" = "yes" ]; then
      warn "/sbin/mkfs.ext3 not found.$PROBLEM"
    else
      echo "/sbin/mkfs.ext3 not found.$PROBLEM" >>$ERRLOG
      echo " => EXT3=no" >>$ERRLOG
      EXT3=no
      return
    fi
  fi

  [ "$EXT3" = "auto" ] && EXT3="yes"
}

date "+--- $0 %d.%m.%Y ---" > $ERRLOG
echo "To see full output: tail -f $ERRLOG" | tee -a $ERRLOG

KCONF=`echo "$KERNEL" | sed "s/vmlinu./config/"`

if [ "$SFDISK" != "auto" ]; then
  [ "$EXT2FS" = "auto" ] && warn "To define EXT2FS=auto makes only sence if you define SFDISK=auto too"
  [ "$SWAP" = "auto" ] && warn "To define SWAP=auto makes only sence if you define SFDISK=auto too"
fi

if [ "$EXT2FS" != "auto" ]; then
  [ "$MOUNT" = "auto" ] && warn "To define MOUNT=auto makes only sence if you define EXT2FS=auto too"
  [ "$UMOUNT" = "auto" ] && warn "To define UMOUNT=auto makes only sence if you define EXT2FS=auto too"
  [ "$FSTAB" = "auto" ] && warn "To define FSTAB=auto makes only sence if you define EXT2FS=auto too"
  [ "$LILO" = "auto" ] && warn "To define LILO=auto makes only sence if you define EXT2FS=auto too"
fi

if [ "$DISK" = "auto" ]; then
  DISK=`sfdisk -s -uM | head -1 | cut -d: -f1`
  [ -b $DISK ] || err "Could not automatically calculate DISK"
  echo "auto DISK=<$DISK>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "DISK=<$DISK>"
  # /dev/hda has partitions named /dev/hda1 /dev/hda2 ...
  # /dev/sda has partitions named /dev/sda1 /dev/sda2 ...
  # /dev/ida/c0d0 has partitions named /dev/ida/c0d0p1 /dev/ida/c0d0p2 ...
  P=""; [ -b ${DISK}p1 ] && P="p"
fi

if [ "$SFDISK" = "auto" ]; then
  [ -b "$DISK" ] || err \
    "If you define SFDISK=auto, please define DISK as auto or <block-device>"
  MEMS=`free | grep Mem | awk '{print $2}'`
  SWAPS=$(expr 2 \* $MEMS / 1024)
  SFDISK="
,$BOOTS
,$SWAPS,S
;
"
  echo "auto SFDISK=<$SFDISK>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "SFDISK=<$SFDISK>"
fi

if [ "$EXT2FS" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define EXT2FS=auto, please define DISK as auto or <block-device>"
  EXT2FS="${DISK}${P}1 ${DISK}${P}3"
  echo "auto EXT2FS=<$EXT2FS>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "EXT2FS=<$EXT2FS>"
fi

check_ext3

if [ "$SWAP" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define SWAP=auto, please define DISK as auto or <block-device>"
  SWAP="${DISK}${P}2"
  echo "auto SWAP=<$SWAP>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "SWAP=<$SWAP>"
fi

if [ "$MOUNT" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define MOUNT=auto, please define DISK as auto or <block-device>"
  MOUNT="mount ${DISK}${P}3 /mnt; mkdir /mnt/boot; mount ${DISK}${P}1 /mnt/boot"
  echo "auto MOUNT=<$MOUNT>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "MOUNT=<$MOUNT>"
fi

if [ "$UMOUNT" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define UMOUNT=auto, please define DISK as auto or <block-device>"
  UMOUNT="umount /mnt/boot; umount /mnt"
  echo "auto UMOUNT=<$UMOUNT>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "UMOUNT=<$UMOUNT>"
fi

OPT="ext2"
[ "$EXT3" = "yes" ] && OPT="ext3"
if [ "$FSTAB" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define FSTAB=auto, please define DISK as auto or <block-device>"
  DEVFSMOUNT=""
  [ -c /dev/.devfsd ] && DEVFSMOUNT="none	/dev devfs defaults 0 0"
  FSTAB="
${DISK}${P}1 /boot $OPT defaults 0 1
${DISK}${P}2 none  swap sw 0 0
${DISK}${P}3 /     $OPT defaults,errors=remount-ro 0 1
proc      /proc proc defaults 0 0
$DEVFSMOUNT
"
  echo "auto FSTAB=<$FSTAB>" >>$ERRLOG
  [ "$VERBOSE" ] && echo "FSTAB=<$FSTAB>"
fi

if [ "$LILO" = "auto" ]; then
  [ -b "$DISK" ] || err "If you define LILO=auto, please define DISK as auto or <block-device>"

LILOINITRD=""
[ "$INITRD" ] && LILOINITRD="initrd=$INITRD"

LILO="
boot=$DISK
delay=20
vga=0
lba32
read-only

image=/vmlinuz
  label=linux
  root=${DISK}${P}3
  $LILOINITRD
"
  echo "auto LILO=<$LILO>" >>$ERRLOG
  [ "$VERBOSE" ] && echo LILO="<$LILO>"
fi

echo ""
OPT="EXT2FS"
[ "$EXT3" = "yes" ] && OPT="EXT3FS"
A=""
while [ "$A" != "y" -a "$A" != "n" ]
do
  [ "$DISK" ] && echo "Harddisk $DISK will be erased!!!" | tee -a $ERRLOG
  [ "$SWAP" ] && echo "Partition $SWAP will be newly created as SWAP !!!" | tee -a $ERRLOG
  [ "$EXT2FS" ] && echo "Partition $EXT2FS will be newly created as $OPT !!!" | tee -a $ERRLOG
  echo -n "(y/n) " | tee -a $ERRLOG
  read A; echo "$A" >> $ERRLOG
done
if [ "$A" = "n" ]; then
  exit 1
fi

trap cleanup 2

echo "--- Partitioning Disk $DISK ---" | tee -a $ERRLOG
stdout "^ $DISK: "
stdout "^sfdisk: ERROR: sector .* does not have an msdos signature"
run "echo \"$SFDISK\" | sfdisk -qL -uM $DISK >/dev/null"

OPT=""
[ "$EXT3" = "yes" ] && OPT="-j"
for i in $EXT2FS; do
  echo "--- making Partition Tables $i ---" | tee -a $ERRLOG
  stdout "^mke2fs "
  run "mke2fs $OPT -q $i"
done

for i in $SWAP; do
  echo "--- making SWAP $i ---" | tee -a $ERRLOG
  stdout "^Setting up swapspace"
  run "mkswap $i"
done

echo "--- mounting DISK ---" | tee -a $ERRLOG
run "$MOUNT"

echo "--- copying CD and RAM ---" | tee -a $ERRLOG
run cp -a -x / /mnt
run rm /mnt/etc /mnt/tmp /mnt/dev /mnt/var /mnt/home /mnt/root
run rm -r /mnt/etc.ro /mnt/tmp.ro /mnt/dev.ro /mnt/home.ro /mnt/root.ro
run mv /mnt/var.ro /mnt/var
run cp -a -x /ram1/etc /ram1/tmp /ram1/dev /ram1/home /ram1/root /mnt
run rm -f /mnt/fastboot /mnt/cdboot.catalog /mnt/cdboot.img /mnt/ram1.cpio.gz /mnt/ram2.cpio.gz
run rm -rf /mnt/rr_moved/ /mnt/isolinux/
run rm /mnt/etc/rcS.d/S12bootcdram.sh \
  /mnt/etc/rcS.d/S13bootcdflop.sh \
  /mnt/usr/bin/bootcd2disk \
  /mnt/usr/bin/bootcdflopcp \
  /mnt/etc/bootcd/bootcd2disk.conf \
  /mnt/etc/bootcd/thisbootcd.conf
run rmdir /mnt/ram1 /mnt/ram2

echo "--- deleting NOT_TO_RAM symlinks ---" 
NOT_TO_RAM_RO=$(find /ram1 /ram2 -xdev -type l | xargs /bin/ls -l | grep -e " -> /etc.ro/" -e " -> /home.ro/" -e " -> /root.ro/" | awk '{ print $(NF) }')
for i in $NOT_TO_RAM_RO; do     # exp: i=/etc.ro/X11
  j=$(echo $i | sed "s/\.ro//") #   => j=/etc/X11
  run rm /mnt/$j                #   => /mnt/etc/X11 -> /etc.ro/X11
  run cp -a $i /mnt/$j
done

echo "--- Building fstab ---" | tee -a $ERRLOG
run "echo \"$FSTAB\" > /mnt/etc/fstab"

echo "--- Resetting mtab ---" | tee -a $ERRLOG
run "rm /mnt/etc/mtab"

echo "--- Building lilo.conf ---" | tee -a $ERRLOG
run "echo \"$LILO\" > /mnt/etc/lilo.conf"

if [ "$SSHHOSTKEY" = "yes" ]; then
  # each installed PC gets a unique hostkey (only if hostkey already existed)
  create_host_keys /mnt/etc/ssh

elif [ "$SSHHOSTKEY" != "no" ]; then
  warn 'SSHHOSTKEY is not defined as "yes" or "no".' \
       'It will be treated as "no".'
fi

echo "--- Running lilo ---" | tee -a $ERRLOG
stdout "^Added "
run "chroot /mnt lilo"

echo "--- unmounting DISK ---" | tee -a $ERRLOG
run cp $ERRLOG /mnt/var/log
run "$UMOUNT"

echo "Please Reboot now !" | tee -a $ERRLOG
