#! /bin/sh
#----------------------------------------------------------------------------
# /usr/sbin/setup - install router-disk on harddisk
#
# Creation:	22.05.2001  hs
# Last Update:  18.02.2002  ap
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# Variablen initialisieren
#----------------------------------------------------------------------------
dos_part=''
e2_part=''
swap_part=''
data_part=''
hdn=''
fli_version=''
lang=''


# cd nach /usr/bin, damit die texte gefunden werden!
cd /usr/sbin

#----------------------------------------------------------------------------
# Test, ob das Setup von Diskette/CD, nicht von Festplatte gestartet wurde
#----------------------------------------------------------------------------
boot_dev=`grep /boot /etc/fstab | sed -e 's/ .*//'`
case "$boot_dev"
in
	/dev/hd[a-l][0-9]*|/dev/sd[0-9]*)
	    colecho "*** ERROR: run setup from floppy-disk or CD ***" br x br
	    exit
	;;
esac

#----------------------------------------------------------------------------
# Sprache abfragen
#----------------------------------------------------------------------------
clrhome
cat ./txt/asklang
read lang
case "$lang"
in
    d|D)
    lang=d
    ;;
    e|E)
    lang=e
    ;;
    *)
    colecho "*** ERROR: please select language ***" br x br
    exit
    ;;
esac

#----------------------------------------------------------------------------
# Installationsart abfragen
#----------------------------------------------------------------------------
clrhome
cat ./txt/typ_$lang
read fli_version
case "$fli_version"
in 
    x|X)
    exit
    ;;
    A|B|C|a|b|c)
    ;;
    *)
    colecho "*** ERROR: please enter a, b or c ***" br x br
    exit
    ;;
esac

#----------------------------------------------------------------------------
# Auswahl der Festplatte, zwingend notwendig
#----------------------------------------------------------------------------
clrhome
cat ./txt/hd_$lang
read hdn
case "$hdn"
in 
    x)
    exit
    ;;
    hda|hdb|hdc|hdd|sda)
    ;;
    *)
    colecho "*** ERROR: please enter hd[a|b|c|d] ***" br x br
    exit
    ;;
esac

#----------------------------------------------------------------------------
# Test, ob die Festplatte snsprechbar ist
#----------------------------------------------------------------------------
/sbin/sfdisk -s /dev/"$hdn" 2>/dev/null
if [ "$?" != "0" ]
then 
    colecho "*** ERROR: can't access /dev/"$hdn", choose another disk ***" br x br
    exit
fi  

#----------------------------------------------------------------------------
# bei manueller Partitionierung nichts abfragen
#----------------------------------------------------------------------------
if [ "$fli_version" != c -a "$fli_version" != C ]
then
    #----------------------------------------------------------------------------
    # Anlegen der DOS-Partition, zwingend notwendig
    #----------------------------------------------------------------------------
    clrhome
    cat ./txt/dosp_$lang
    read dos_part
   
    case "$dos_part"
    in
        x)
        exit
        ;;
        [0-9]*)
        if [ "$dos_part" != "0" ]
        then              
            hdsize=`/sbin/sfdisk -s /dev/$hdn`
                
            # max. 32 MB, wegen Partitionstyp 1    
            if [ "$dos_part" = 1 -o "$dos_part" -ge 32 ]
            then
                if [ "$hdsize" -ge 32000 ]
                then
                    dos_part=31
                else
                    dos_part=''
                fi
            fi
        rm /tmp/newpart
        echo "0,$dos_part,1,*" >/tmp/newpart

        else
            colecho "*** ERROR: 0 MB are really to small for this router ;-) ***" br x br
            exit
        fi
        ;;
        *)
        colecho "*** ERROR: enter only numeric values or x to exit ***" br x br
        exit
        ;;
    esac


    #----------------------------------------------------------------------------
    # Anlegen der ext2-Partition, nur bei Typ B
    #----------------------------------------------------------------------------
    if [ "$fli_version" = B -o "$fli_version" = b ]
    then
        clrhome
        # frage nach der gre der ext2-partition
        cat ./txt/ext2p_$lang
        read e2_part
        
        case "$e2_part"
        in
            x)
            exit
            ;;
            [0-9]*)
            if [ "$e2_part" != "0" ]
            then     
                if [ "$e2_part" = 1 ]
                then
                    e2_part=''
                fi  
                echo ",$e2_part,83" >>/tmp/newpart
            else
                colecho "*** ERROR: no ext2-partition? use setup type A ***" br x br
                exit
            fi
            ;;
            *)
            colecho "*** ERROR: enter only numeric values or x to exit ***" br x br
            exit
            ;;
        esac
    fi

    #----------------------------------------------------------------------------
    # Anlegen einer swap-partition, wahlweise
    #----------------------------------------------------------------------------
    clrhome
    cat ./txt/swapp_$lang
    read swap_part
        
    case "$swap_part"
    in
        x)
        exit
        ;;
        [0-9]*)
        if [ "$swap_part" != "0" ]
        then          
            if [ "$swap_part" = 1 ]
            then
                swap_part=''
            fi
            echo ",$swap_part,82" >>/tmp/newpart  
        fi
        ;;
        *)
        colecho "*** ERROR: enter only numeric values or x to exit ***" br x br
        exit
        ;;
    esac

    #----------------------------------------------------------------------------
    # Anlegen einer daten-partition, wahlweise
    #----------------------------------------------------------------------------
    clrhome
    cat ./txt/datap_$lang
    read data_part
        
    case "$data_part"
    in
        x)
        exit
        ;;
        [0-9]*)
        if [ "$data_part" != "0" ]
        then       
            if [ "$data_part" = 1 ]
            then
                data_part=''
            fi  
            echo ",$data_part,83" >>/tmp/newpart
        fi
        ;;
        *)
        colecho "*** ERROR: enter only numeric values or x to exit ***" br x br
        exit
        ;;
    esac

    #----------------------------------------------------------------------------
    # Warnung anzeigen und mit JA besttigen lassen
    #----------------------------------------------------------------------------
    clrhome
    cat ./txt/warnp_$lang
    read all_ok
    if [ "$all_ok" != JA -a "$all_ok" != YES  ]
    then
        exit
    fi   
        
    #----------------------------------------------------------------------------
    # die Festplatte neu partitionieren
    #----------------------------------------------------------------------------
    # alten mbr lschen (lilo-reste)
    dd if=./bootsect.bin of=/dev/"$hdn" bs=512 count=1 >/dev/null 2>/dev/null
    
    # partitionen neu anlegen
    /sbin/sfdisk -D -uM /dev/"$hdn" </tmp/newpart >/dev/null 2>/dev/null
    if [ "$?" != "0" ]
    then
        colecho "*** ERROR: can't create new partition table, see docu ***" br x br
        exit
    fi
    
    # partitionstabelle neu einlesen, es ist kein reboot ntig
    /sbin/sfdisk -R /dev/"$hdn" >/dev/null 2>/dev/null
    
    # bootsector der neuen dos-partition lschen, empfehlung von sfdisk
    dd if=/dev/zero of=/dev/"$hdn"1 bs=512 count=1 >/dev/null 2>/dev/null
    
    #----------------------------------------------------------------------------
    # je nach Version werden die Partitionen formatiert
    #----------------------------------------------------------------------------
    case "$fli_version"
    in
        a|A)
        /sbin/mkdosfs -F 12 -s 16 /dev/"$hdn"1 >/dev/null
        data=2
        if [ "$swap_part" != "0" ]
        then
            /sbin/mkswap /dev/"$hdn"2 >/dev/null
            data=3
        fi
        if [ "$data_part" != "0" ]
        then
            /sbin/mke2fs -q -vm0 /dev/"$hdn""$data" >/dev/null
        fi
        ;;
        b|B)
        /sbin/mkdosfs -F 12 -s 16 /dev/"$hdn"1 >/dev/null
        /sbin/mke2fs -q -vm0 /dev/"$hdn"2 >/dev/null
        data=3
        if [ "$swap_part" != "0" ]
        then
            /sbin/mkswap /dev/"$hdn"3 >/dev/null
            data=4
        fi
        if [ "$data_part" != "0" ]
        then
            /sbin/mke2fs -q -vm0 /dev/"$hdn""$data" >/dev/null
        fi
        ;;
    esac
    bootn=1
fi

#----------------------------------------------------------------------------
# Liste der Partitionen anzeigen
#----------------------------------------------------------------------------
clrhome
cat ./txt/part_$lang
/sbin/sfdisk -uM -l /dev/"$hdn"

if [ "$fli_version" = c -o "$fli_version" = C ]
then
    cat ./txt/enter_$lang
    read all_ok
    clrhome
    cat ./txt/askb_$lang
    read bootn
    case "$bootn"
    in 
        1|2|3|4)
        ;;
        *)
        colecho "*** ERROR: please enter a number from 1 to 4 ***" br x br
        exit
        ;;
    esac
fi    

#----------------------------------------------------------------------------
# Abfrage, ob der Router mit einer Notfall-Option installiert werden soll
#----------------------------------------------------------------------------
clrhome
cat ./txt/recover_$lang
read recover
case "$recover"
in 
    A|B|C|a|b|c)
    ;;
    *)
    colecho "*** ERROR: please enter a, b or c ***" br x br
    exit
    ;;
esac


#----------------------------------------------------------------------------
# Router auf die Platte kopieren
#----------------------------------------------------------------------------
clrhome
cat ./txt/warnc_$lang 
echo /dev/"$hdn""$bootn"
read all_ok
cat ./txt/copyb_$lang

/bin/mount -w /dev/"$hdn""$bootn" /mnt -t vfat 2>/dev/null
if [ "$?" != "0" ]
then 
    colecho "*** ERROR: can't mount FAT-Partition /dev/$hdn$bootn" br x br
    exit
fi

echo copying kernel
cp /boot/kernel /mnt
echo copying rootfs.gz
cp /boot/rootfs.gz /mnt

# read settings of HDINSTALL_MOUNT_BOOT
. /boot/rc.cfg
echo copying rc.cfg
sed  -e "s/MOUNT_BOOT=.*/MOUNT_BOOT='$HDINSTALL_MOUNT_BOOT'/" < /boot/rc.cfg > /mnt/rc.cfg
echo copying opt.tgz
cp /boot/opt.tgz /mnt
if [ -f /sbin/e2fsck ]
then
	echo copying e2fsck
	cp /sbin/e2fsck /mnt
else
	echo skipped copying e2fsck ... 
fi
echo create syslinux.cfg
echo "TIMEOUT 0" >/mnt/syslinux.cfg
echo "DEFAULT kernel" >>/mnt/syslinux.cfg
echo "APPEND load_ramdisk=1 initrd=rootfs.gz root=/dev/ram0 boot=/dev/$hdn$bootn" >>/mnt/syslinux.cfg

case "$recover"
in
    b|B)
    echo copying recovery-script
    cp ./txt/recover.sh /mnt   
    echo preparing rc.cfg for recovery
    sed  -e "s/MOUNT_BOOT=.*/MOUNT_BOOT='$HDINSTALL_MOUNT_BOOT'/" < /boot/rc.cfg > /mnt/rc2.cfg
    echo preparing opt.tgz for recovery
    cp /mnt/opt.tgz /mnt/opt2.tgz
    echo create second syslinux.cfg for recovery
    echo "TIMEOUT 0" >/mnt/syslinux2.cfg
    echo "DEFAULT kernel" >>/mnt/syslinux2.cfg
    echo "APPEND load_ramdisk=1 initrd=rootfs.gz root=/dev/ram0 boot=/dev/$hdn$bootn recover=active" >>/mnt/syslinux2.cfg

    ;;
    c|C)
    echo copying recovery-script
    cp ./txt/recover.sh /mnt 
    echo preparing kernel for recovery
    cp /mnt/kernel /mnt/kernel2
    echo preparing rootfs.gz for recovery
    cp /mnt/rootfs.gz /mnt/rootfs2.gz
    echo preparing rc.cfg for recovery
    sed  -e "s/MOUNT_BOOT=.*/MOUNT_BOOT='$HDINSTALL_MOUNT_BOOT'/" < /boot/rc.cfg > /mnt/rc2.cfg
    echo preparing opt.tgz for recovery
    cp /mnt/opt.tgz /mnt/opt2.tgz
    echo create second syslinux.cfg for recovery
    echo "TIMEOUT 0" >/mnt/syslinux2.cfg
    echo "DEFAULT kernel2" >>/mnt/syslinux2.cfg
    echo "APPEND load_ramdisk=1 initrd=rootfs2.gz root=/dev/ram0 boot=/dev/$hdn$bootn recover=active" >>/mnt/syslinux2.cfg
    ;;
    *)
    ;;
esac


df /mnt | grep 100%
if [ "$?" = "0" ]
then 
    colecho "*** ERROR: DOS-Partition full, try creating a bigger one ***" br x br
    exit
fi 

umount /mnt
insmod msdos
echo running syslinux
syslinux -s /dev/"$hdn""$bootn"
if [ "$?" != "0" ]
then 
    colecho "*** ERROR: can't run syslinux, disk will be not bootable ***" br x br
    exit
fi  
rmmod msdos

clrhome

cat ./txt/finish_$lang

