#!/bin/bash
# insert-mkbootfloppy - Generate bootfloppies for INSERT
# (works for INSERTs from 1.2.13)
# (C) Klaus Knopper May 2004
# Modifications: Matthias Mikuletz <mm@inside-security.de>
#

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
export PATH

umask 022

# This does not need to run as root on INSERT.
# [ "`id -u`" != "0" ] && exec sudo "$0" "$@"

# LANG et al.
[ -f /etc/sysconfig/i18n ] && { . /etc/sysconfig/i18n;  export LANG LC_ALL; }
[ -f /etc/sysconfig/insert-remote ] && . /etc/sysconfig/insert-remote

XDIALOG_HIGH_DIALOG_COMPAT=1
export XDIALOG_HIGH_DIALOG_COMPAT

TMP="/tmp/insert-mkbootfloppy.$$"
   
KERNEL="$(uname -r)"

#case "$KERNEL" in 2.6*) KERNEL=linux26; MINIROOT=minirt26.gz ;; *) KERNEL=linux24; MINIROOT=minirt24.gz ;; esac
KERNEL=vmlinuz
MINIROOT=miniroot.gz

# Utility functions, usually called in $0 "start"
# Variable substitution has to be finished before

bailout(){
# Leave and remove temporary files
   rm -f "$TMP"
   exit $1
}

trap bailout 2 15

DIALOG="dialog"
[ -n "$DISPLAY" ] && [ -x /usr/bin/Xdialog ] && DIALOG="Xdialog"

case "$LANGUAGE" in
de|at|ch)
CONTINUE="Weiter"
CANCEL="Abbruch"
TITLE0="INSERT Bootdiskette erzeugen"
MESSAGE0="Formatiere Diskette und kopiere Daten..."
TITLE1="Diskette 1"
MESSAGE="Dieses Programm erzeugt zwei Disketten, mit denen INSERT auf einem Rechner gestartet werden kann, dessen CD-Laufwerk nicht bootfhig ist. Sie bentigen neben der aktuellen INSERT-CD (ab 1.2.13) zwei 1.44MB Disketten, die vom Programm VOLLSTNDIG GELSCHT und mit dem Linux-Kernel bzw. einer initialen Ramdisk versehen werden. Wenn Sie fortfahren wollen, legen Sie jetzt bitte die INSERT-CD in ein CD-Rom Laufwerk ein, mounten sie, und klicken dann auf \"Weiter\"."
ERROR="Kann die INSERT-CD in keinem CD-Laufwerk finden (durchsucht wurden /cdrom*, /mnt/cdrom* und /media/cdrom*. Nochmal versuchen?"
MESSAGE1="Bitte legen Sie nun die 1. Diskette (zur Erzeugung der Kernel-Bootdiskette) ein."
FLOPPYERROR="Es ist ein Fehler beim Schreiben auf /dev/fd0 aufgetreten. Diese Diskette ist vermutlich defekt oder schreibgeschtzt. Nochmal versuchen?"
TITLE2="Diskette 2"
MESSAGE2="Bitte legen Sie nun die 2. Diskette (zur Erzeugung der initialen Ramdisk) ein."
SUCCESS="Das Erzeugen der Boot- und Initrd-Disketten war erfolgreich."
;;
*)
CONTINUE="Continue"
CANCEL="Cancel"
TITLE0="INSERT boot floppy creator"
MESSAGE0="Formatting floppy disk and copying data..."
TITLE1="Disk 1"
MESSAGE="This program creates two floppy disks, which can be used in order to boot INSERT on a computer that cannot boot directly from CD. Besides a current INSERT-CD (1.2.13 and up), you will need two 1.44MB floppy disks, which be COMPLETELY ERASED and installed with a Linux-kernel and an initial ramdisk. If you want to continue, please insert the INSERT-CD into a CD-Rom drive now, mount the CD so that it is accessible, and click on \"Continue\"."
ERROR="Can't find the INSERT-CD in any CD-Rom drive (searched /cdrom*, /mnt/cdrom* and /media/cdrom*). Try again?"
MESSAGE1="Please insert the first floppy disk now (for creating the kernel boot floppy)."
FLOPPYERROR="There has been an error while writing to /dev/fd0. The floppy disk is probably not writable or defective. Try again?"
TITLE2="Disk 2"
MESSAGE2="Please insert the second floppy disk now (for creating the initial ramdisk)."
SUCCESS="Creation of boot- and initrd floppy disks was successful."
;;
esac

gauge(){
status=0
while [ ! -e "$TMP.done" ]; do echo "$status" ; status="`expr \( 100 - $status \) / 8 + $status + 1`"; sleep 8; done | $DIALOG --title "$TITLE0" --gauge "$MESSAGE0" 8 65 0
}

endgauge(){
touch "$TMP.done" ; wait ; rm -f "$TMP.done"
}

format(){
fdformat /dev/fd0u1440 >/dev/null && mformat a: >/dev/null
return "$?"
}

$DIALOG --defaultno --ok-label "$CONTINUE" --yes-label "$CONTINUE" --no-label "$CANCEL" --cancel-label "$CANCEL" --title "$TITLE0" --yesno "$MESSAGE" 14 65 || bailout 1
while :; do
rm -f "$TMP" "$TMP".done
# Find CD-Rom boot/isolinux directrory
SRCDIR=""
for i in / /mnt /media; do
 for d in `ls -1d "$i"/*cdrom* 2>/dev/null`; do
  [ -e "$d"/isolinux/"$KERNEL" -a -e "$d"/isolinux/"$MINIROOT" ] && SRCDIR="$d"/isolinux && break 2
 done
done
[ -z "$SRCDIR" ] && { $DIALOG --title "$TITLE0" --yesno "$ERROR" 7 75 && continue || bailout 1; }
break
done


$DIALOG --ok-label "$CONTINUE" --yes-label "$CONTINUE" --no-label "$CANCEL" --cancel-label "$CANCEL" --title "$TITLE1" --yesno "$MESSAGE1" 7 65 || bailout 1
while :; do
rm -f "$TMP" "$TMP".done
gauge &
format && syslinux /dev/fd0u1440 && \
mcopy "$SRCDIR"/{"$KERNEL",boot.msg,logo.16,f2,memtest} a: && \
{ rm -f "$TMP"; perl -p -e 's|^APPEND|APPEND load_ramdisk=1 prompt_ramdisk=1 root=/dev/fd0 rw|g;s|quiet ||g;s|initrd=[^ ]* ||g;' "$SRCDIR"/isolinux.cfg | head -n 34 > "$TMP" && mcopy "$TMP" a:syslinux.cfg >/dev/null; }
[ "$?" != "0" ] && { endgauge; $DIALOG --title "$TITLE1" --yesno "$FLOPPYERROR" 9 65 && continue || bailout 1; }
for i in `ls -1 "$SRCDIR"/*.kbd 2>/dev/null`; do mcopy "$i" a:; done
endgauge
break
done

$DIALOG --ok-label "$CONTINUE" --yes-label "$CONTINUE" --no-label "$CANCEL" --cancel-label "$CANCEL" --title "$TITLE2" --yesno "$MESSAGE2" 7 65 || bailout 1
while :; do
rm -f "$TMP" "$TMP".done
gauge &
format && dd if="$SRCDIR"/"$MINIROOT" of=/dev/fd0u1440 bs=18k
[ "$?" != "0" ] && { endgauge; $DIALOG --title "$TITLE2" --yesno "$FLOPPYERROR" 9 65 && continue || bailout 1; }
endgauge
break
done

$DIALOG --title "$TITLE0" --msgbox "$SUCCESS" 6 65
bailout 0
