#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin # # 2004-08-21 # change to pebble-voyage.update by Punky # # 2003-11-14 # Installer hacked to death by Mina Naguib # - 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 <&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