#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
#
# 2004-08-21
# change to pebble-voyage.update by Punky <punkytse@yahoo.com>
#
# 2003-11-14
# Installer hacked to death by Mina Naguib <webmaster@topfx.com>
#	- Added loads of sanity checking
#	- Added saving answers to config file and re-loading and pre-defaulting
#	  answers on next invocations
#       - Added diagnostic and error messages throughout process
#	- Changed input for DISK from numeric to actual device name
#	- As a result of above, renamed etc/lilo-standard-* to just etc/lilo-standard.conf and etc/lilo-serial-* to
#	  just etc/lilo-serial.conf - and now installer dynamically generates a etc/lilo.pebble.conf
#


#
# Define the defaults:
#
CONFIGFILENAME=.pebble.config
DEFAULTMOUNTCF=/mnt/cf
DEFAULTMOUNTPEB=/mnt/pebble
DEFAULTDISK=/dev/hde
DEFAULTMODULE=2

set -a
echo "" >&2
echo "" >&2
echo "Welcome to the Pebble Linux installation script" >&2
echo "" >&2
echo "" >&2

if [ -f $CONFIGFILENAME ]; then
	#
	# Load previously saved data from config file
	#
	echo "Loading defaults from $CONFIGFILENAME" >&2
	echo "" >&2
	{
		read MOUNTCF
		read MOUNTPEB
		read DISK
		read MODULE
	} < $CONFIGFILENAME
fi

#
# Default any empty data
#
MOUNTCF=${MOUNTCF:-$DEFAULTMOUNTCF}
MOUNTPEB=${MOUNTPEB:-$DEFAULTMOUNTPEB}
DISK=${DISK:-$DEFAULTDISK}
MODULE=${MODULE:-$DEFAULTMODULE}

#
# Slight cleverness if MOUNTPEB is invalid
#
if [ ! -d $MOUNTPEB ] || [ ! -f $MOUNTPEB/pebble-voyage.update ]; then
	MOUNTPEB=`pwd`;
fi

badin=true
while $badin
do
	echo "Where is the pebble installer (this) directory? (default=$MOUNTPEB): " >&2
	read a
	echo
	a=${a:-$MOUNTPEB}
	if [ ! -d $a ]; then
		echo "Error: $a is not a directory" >&2
		echo "" >&2
	elif [ ! -f $a/pebble-voyage.update ]; then
		echo "Error: $a does not seem to contain the pebble installer" >&2
		echo "" >&2
	else
		MOUNTPEB=$a
		badin=false
	fi
done

badin=true
while $badin
do
	echo "Which device accesses the compact flash ? (default=$DISK): " >&2
	read a
	echo
	a=${a:-$DISK}
	if [ ! -b $a ]; then
		echo "Error: $a does not seem to be a block device" >&2
		echo "" >&2
	else
		DISK=$a
		badin=false
	fi
done

badin=true
while $badin
do
	echo "Which directory should I mount the FlashCard to? (default=$MOUNTCF): " >&2
	read a
	echo
	a=${a:-$MOUNTCF}
	if [ ! -d $a ]; then
		echo "Error: $a is not a directory" >&2
		echo "" >&2
	else
		MOUNTCF=$a
		badin=false
	fi
done

badin=true
while $badin
do
	echo "Which module? Enter 1 for pcmcia, 2 for net4501, or 3 for net4521/net4511 (default=$MODULE): " >&2
	read a
	a=${a:-$MODULE}
	case "$a" in
		1) MODULE=1;MODULES=pcmcia;INIT=standard;badin=false;;
		2) MODULE=2;MODULES=net4501;INIT=serial;badin=false;;
		3) MODULE=3;MODULES=net4521;INIT=serial;badin=false;;
		*) echo "Huh? Try again" >&2;;
	esac
done

#
# Save the results to the config file for later pre-filling
#
echo "" >&2
echo "Saving defaults to $CONFIGFILENAME" >&2
echo "" >&2
{
	echo $MOUNTCF
	echo $MOUNTPEB
	echo $DISK
	echo $MODULE
} > $CONFIGFILENAME

cat <<EOM >&2

Configuration completed:
-----------------------

Installer directory: $MOUNTPEB

FlashCard Device:    $DISK
Will be mounted on:  $MOUNTCF

Installation mode:   $MODULE

If this is good hit RETURN, otherwise hit CTRL+C
EOM
read a

echo "Installing . . ." >&2;

if [ "$INIT" != serial ]; then
	newlilo=`sed -e "s#REPLACEWITHDISK#$DISK#" -e "/9600/d" $MOUNTPEB/etc/lilo.conf.pebble-voyage`
else
	newlilo=`sed -e "s#REPLACEWITHDISK#$DISK#" $MOUNTPEB/etc/lilo.conf.pebble-voyage`
fi

[ "$newlilo" ] || { echo "Fatal Error: Failed to calculate new lilo.pebble.conf contents" >&2; exit; }
echo "$newlilo" > $MOUNTPEB/etc/lilo.pebble.conf

mount -t ext2 ${DISK}1 $MOUNTCF || { echo "Fatal Error: Failed to mount ${DISK}1 on $MOUNTCF as an ext2 partition" >&2; exit; }
rm -rf $MOUNTCF/* || { echo "Fatal Error: Failed to delete everything in $MOUNTCF/*" >&2; exit; }
cd $MOUNTPEB || { echo "Fatal Error: Failed to change directory to $MOUNTPEB" >&2; exit; }
cp -a * $MOUNTCF || { echo "Fatal Error: Failed to install Pebble Linux onto $MOUNTCF" >&2; exit; }
chroot $MOUNTCF lilo -C /etc/lilo.pebble.conf || { echo "Fatal Error: Failed to chroot to $MOUNTCF to install lilo" >&2; exit; }
umask 022 || { echo "Fatal Error: Failed to set umask to 022" >&2; exit; }
ssh-keygen -t rsa -f $MOUNTCF/etc/ssh/ssh_host_rsa_key -N '' || { echo "Fatal Error: Failed to generate RSA keypair" >&2; exit; }
ssh-keygen -t dsa -f $MOUNTCF/etc/ssh/ssh_host_dsa_key -N '' || { echo "Fatal Error: Failed to generate DSA keypair" >&2; exit; }
if [ "$MODULES" != net4501 ]; then
	ln -s ../init.d/pcmcia $MOUNTCF/etc/rcS.d/S65pcmcia || { echo "Fatal Error: Failed to create symlink ../init.d/pcmcia to $MOUNTCF/etc/rcS.d/S65pcmcia" >&2; exit; }
fi
cp $MOUNTCF/etc/modules.$MODULES $MOUNTCF/etc/modules || { echo "Fatal Error: Failed to copy $MOUNTCF/etc/modules.$MODULES to $MOUNTCF/etc/modules" >&2; exit; }
cp $MOUNTCF/etc/inittab.$INIT $MOUNTCF/etc/inittab || { echo "Fatal Error: Failed to copy $MOUNTCF/etc/inittab.$INIT to $MOUNTCF/etc/inittab" >&2; exit; }
cp $MOUNTCF/etc/fstab.hda1.ext2 $MOUNTCF/etc/fstab || { echo "Fatal Error: Failed to copy $MOUNTCF/etc/fstab.hda1.ext2 to $MOUNTCF/etc/fstab" >&2; exit; }
echo "" >&2
echo "" >&2
echo "Now set your root password for the new system:" >&2
echo "" >&2
echo "" >&2
chroot $MOUNTCF passwd || { echo "Fatal Error: Failed to chroot to $MOUNTCF to change password" >&2; exit; }
umount $MOUNTCF || { echo "Fatal Error: Failed to unmount $MOUNTFS" >&2; exit; }

echo "" >&2
echo "" >&2
echo "Congratulations.  Pebble Linux should now be installed on $DISK" >&2
echo "" >&2
echo "" >&2
# Eject the compact flash pcmcia card for clean removal
cardctl eject
