summaryrefslogtreecommitdiffstats
path: root/rescue/tree/ka/install.sh
diff options
context:
space:
mode:
Diffstat (limited to 'rescue/tree/ka/install.sh')
-rwxr-xr-xrescue/tree/ka/install.sh641
1 files changed, 0 insertions, 641 deletions
diff --git a/rescue/tree/ka/install.sh b/rescue/tree/ka/install.sh
deleted file mode 100755
index ee93c1e19..000000000
--- a/rescue/tree/ka/install.sh
+++ /dev/null
@@ -1,641 +0,0 @@
-#!/bin/bash
-
-# this script is run by at startup on the nfs_root system, and runs the ka-deploy client
-# it also updates the 'step file' on the tftp server
-
-# $Revision$
-# $Author$
-# $Date$
-# $Header$
-# $Id$
-# $Log$
-# Revision 1.4 2005/08/28 21:38:32 oblin
-# ka support (initially from Antoine Ginies and Erwan Velu)
-#
-# Revision 1.1.2.5 2003/06/17 06:34:33 erwan
-# Removing remaining dchp cache for KA
-#
-# Revision 1.1.2.4 2003/06/11 18:04:28 erwan
-# Fixing mkreiserfs call
-#
-# Revision 1.1.2.3 2002/11/07 15:10:52 erwan
-# SCSI support now activated
-#
-# Revision 1.1.2.2 2002/11/05 15:49:13 erwan
-# added some files
-#
-# Revision 1.1.2.1 2002/11/05 11:16:54 erwan
-# added ka tools in rescue
-#
-# Revision 1.6 2001/12/03 16:28:02 sderr
-# Completely new install script
-#
-# Revision 1.5 2001/10/10 13:55:04 sderr
-# Updates in documentation
-#
-# Revision 1.4 2001/06/29 09:31:45 sderr
-# *** empty log message ***
-#
-# Revision 1.3 2001/05/31 08:51:43 sderr
-# scripts/doc update to match new command-line syntax
-#
-# Revision 1.2 2001/05/03 12:34:41 sderr
-# Added CVS Keywords to most files. Mostly useless.
-#
-# $State$
-
-# This script is provided as an exmaple and should probably not be run as is
-
-
-unset LANG
-unset LANGUAGE
-
-# needed for some for i in foo* loops
-shopt -s nullglob
-
-bash < /dev/tty2 >/dev/tty2 2>&1 &
-
-# IDEA : maybe this option could be overriden by a kaopt= in the kernel command line ?
-KA_SESSION_BASE="-s kainstall"
-
-ka_call_num=0
-
-inc_ka_session()
-{
- (( ka_call_num++ ))
- cur_ka_session=$KA_SESSION_BASE$ka_call_num
-}
-
-
-# testing ? -- NOT FULLY IMPLEMENTED !!!!!!!!!!!!!!!!!!!!
-#DONTWRITE=yes
-DONTWRITE=no
-
-# Let's find out what our IP is
-ip=`/sbin/ifconfig | grep -v 127.0.0.1 | grep "inet addr" | sed 's/^.*inet addr:\([^ ]*\) .*$/\1/g' | head -n 1`
-
-# the file tftpserver should contain the name of the .. tftpserver
-server=`cat tftpserver`
-
-
-# reverse a file
-tac()
-{
- awk '{ x[NR] = $0 } END { for (i = NR; i >= 1; i--) print x[i] }'
-}
-
-# run a command, hide its output and print OK if it suceeds, print FAILED and show the output otherwise.
-runcom()
-{
- echo -n "$1..." 1>&2
- shift;
- out=`"$@" 2>&1`
- ret=$?
- if [ $ret -eq 0 ]; then
- echo $C_S"OK"$C_N 1>&2
- else
- echo $C_F"Failed"$C_N 1>&2
- echo $C_W"$out"$C_N 1>&2
- fi
- return $ret
-
-}
-
-# 5 4 3 2 1 zero ignition
-countdown()
-{
- t=$1
- while [ "$t" -ne 0 ]; do
- echo -n "$t "
- sleep 1
- # move the cursor back
- # I use now tr instead of sed because busybox's sed adds a non-wanted carriage return
- # busybox's tr does not seem to know about the [: :] stuff (?)
- echo -n "$t " | tr " 0-9" $'\x08'
- (( t-- ))
- done
- # backspace only moves the cursor back, so at this point there's still a "1" to erase
- if [ "$1" -ne 0 ] ;then
- echo -n " "$'\x08\x08'
- fi
-}
-
-
-int_shell()
-{
- echo $C_H"starting an interactive shell"$C_N
- exec /bin/bash
-}
-
-fail()
-{
- echo $*
- echo $C_F"--- The installation program FAILED ---"$C_N
- echo "Check your configuration -- try to read previous error messages"
- echo "This machine is going to reboot (Ctrl-S to block it) (Ctrl-C for an interactive shell)"
- trap int_shell SIGINT
- countdown 30
- do_reboot
-}
-
-do_reboot()
-{
- reboot
- sleep 1234567 # do not continue the install script (/sbin/reboot does not block)
-}
-
-
-
-# ahem this LILO function should be fixed someday
-# right now this function assumes there is a properly configured lilo on the duplicated linux system
-do_lilo()
-{
-
-
-chroot /mnt/disk << EOF
-lilo
-EOF
-
-
-}
-
-
-run_chroot_command()
-{
-
- /usr/sbin/chroot /mnt/disk $*
-
-}
-
-
-log()
-{
- echo $* 1>&2
- echo $* >> /tmp/ginstlog
-}
-
-# version for the standard tftp client
-std_tftp_put_file()
-{
- remotef=$2
- localf=$1
- err=`echo put $localf $remotef | tftp $server 2>&1`
- err=`echo $err | grep Sent`
- if [ -z "$err" ]; then
- log tftp error: could not get/put file
- return 1
- fi
- return 0
-}
-
-# version for the tftp client built in busybox
-busybox_tftp_put_file()
-{
- remotef=$2
- localf=$1
- err=`tftp -p -l $localf -r $remotef $server 2>&1`
- if [ $? -ne 0 ]; then
- log tftp error: could not get/put file $err
- return 1
- fi
- return 0
-}
-
-
-busybox_tftp_get_file()
-{
- remotef=$1
- localf=$2
- err=`tftp -g -l $localf -r $remotef $server 2>&1`
- if [ $? -ne 0 ]; then
- log tftp error: could not get/put file $err
- return 1
- fi
- return 0
-}
-
-
-std_tftp_get_file()
-{
- remotef=$1
- localf=$2
- err=`echo get $remotef $localf | tftp $server 2>&1`
- err=`echo $err | grep Received`
- if [ -z "$err" ]; then
- echo tftp error: could not get/put file
- return 1
- fi
- return 0
-}
-
-tftp_get_file()
-{
- busybox_tftp_get_file "$@"
-}
-
-tftp_put_file()
-{
- busybox_tftp_put_file "$@"
-}
-
-# write a string ($2) in a remote file ($1)
-tftp_put_in()
-{
- echo "$2" > $temp
- err=`echo put $temp "$1" | tftp $server 2>&1`
- rm -f $temp
- err=`echo $err | grep Sent`
- if [ -z "$err" ]; then
- log tftp error: could not get/put file
- return 1
- fi
- return 0
-}
-
-get_var_bis()
-{
- while read a; do
- echo "$a" | grep -s -q "^ *#.*"
- if [ $? -eq 0 ]; then
- continue
- fi
- val=`echo "$a" | sed 's/[^"]*"\(.*[^\\]\)".*/\1/'`
- var=`echo "$a" | sed 's/[^"]*".*[^\\]" *\$\([^ ]*\)/\1/'`
- if [ "$var" = "$1" ]; then
- echo $val
- return 0
- fi
- done
- return 1
-}
-
-# fetch variable $2 from file $1
-get_var()
-{
- (cat $1; echo) | get_var_bis $2
-}
-
-# find the current step in the kernel command line
-get_step()
-{
- step=install
-# step=`cat /proc/cmdline | sed 's/.*kastep=\([^ ]*\).*/\1/'`
- if [ "$step" ]; then
- echo $step > /tmp/step
- return 0
- fi
- return 1
-}
-
-
-# write a new file on the tftp server
-# this file is a pxelinux config file
-# do this by getting the 'template file' and adding a DEFAULT at the beginning
-set_step()
-{
- step=$1
-
-
- runcom "Getting template file" tftp_get_file "ka/pxelinux.cfg/template" /tmp/template || return 1
-
- echo DEFAULT $step > /tmp/newcfg
- cat /tmp/template >> /tmp/newcfg
-
- runcom "Sending back new pxelinux config file" tftp_put_file /tmp/newcfg "ka/pxelinux.cfg/IP/$ip" || return 1
-
- return 0
-}
-
-
-
-# the mount_partition calls must be done in the same shell (NOT a subshell) because the global variable below has to be updated
-# idea : maybe use a file instead of this variable (and since the tac function now exists, why not ?)
-mounted_fs=""
-
-# mount a partition UNDER /disk !!! (/disk is prepended to $2)
-mount_partition()
-{
- dev=$1
- point=$2
-
- echo -n "Mounting $C_H$1$C_N as /mnt/disk$C_H$point$C_N"
- mkdir -p /mnt/disk$point
- test -d /mnt/disk$point || return 1
- runcom "..." mount $dev /mnt/disk/$point || return 1
- mounted_fs="$dev $mounted_fs"
- return 0
-}
-
-# umount all mounted partitions under /disk, in the reverse order
-umount_partitions()
-{
- for dev in $mounted_fs; do
- retries=0
- while ! runcom "Umounting $dev" umount $dev ; do
- sleep 3
- (( retries++ ))
- if [ $retries -gt 3 ]; then
- echo Failed too many times. giving up.
- break
- fi
- done
- done
-}
-
-
-# recreate excluded directories
-# read stdin like this : u=rwx g=rwx o=rwx uid gid filename
-recreate_dirs()
-{
- while read line; do
- declare -a fields
- fields=( $line )
- file=/mnt/disk/${fields[5]}
-# echo $file
-# note : it is possible that the directory exists already, if it was a mount point
-# we need to set the permissions/users anyway
- mkdir -p $file
-# echo chmod ${fields[0]},${fields[1]},${fields[2]} $file
- chmod ${fields[0]},${fields[1]},${fields[2]} $file
- # argl !! chmod o+t does not work with busybox's chmod !
- # we have to handle it alone
- if echo ${fields[2]} | grep -q t; then
- chmod +t $file
- fi
- chown ${fields[3]}.${fields[4]} $file
- done
-}
-
-make_partitions()
-{
- # we must be in the partfiles directory
- for file in partition_tab*; do
- drive=`echo $file | sed 's/partition_tab//'`
- cat $file | runcom "Writing partition table for $drive using sfdisk" /sbin/sfdisk /dev/$drive -uS --force || fail "error with sfdisk"
- done
-
- for file in fdisk_commands*; do
- drive=`echo $file | sed 's/fdisk_commands//'`
- runcom "Cleaning hard drive" dd if=/dev/zero of=/dev/$drive bs=1M count=5 || fail "Can t clean drive$drive"
- cat $file | runcom "Writing partition table for $drive using fdisk" fdisk /dev/$drive || fail "error with fdisk"
- done
-
-}
-checkDevEntries()
-{
- if ! test -r /mnt/disk/dev/hda ; then
- (cd /dev && tar c *) | (cd /mnt/disk/dev && tar x)
- fi
-}
-
-write_MBRs()
-{
-# we must be in the partfiles directory also
- for file in MBR*; do
- drive=`echo $file | sed 's/MBR//'`
- runcom "Writing new MBR for $drive" dd if=$file of=/dev/$drive bs=1 count=446
- done
-}
-
-
-# Colors
-# Success
-C_S=$'\033[1;32m'
-# Failure
-C_F=$'\033[1;31m'
-# Warning
-C_W=$'\033[1;33m'
-# Normal
-C_N=$'\033[0;39m'
-# Hilight
-C_H=$'\033[1;39m'
-
-
-# Clear screen, fancy startup message.
-echo $'\033'[2J$'\033'[H
-echo "------| $C_H"Ka"$C_N |---- Install starting..."
-
-temp=/tmp/ginst
-
-# activate dma ? -- obsolete stuff I think
-# runcom "Setting HD optimizations" hdparm -c1 -d1 -K1 $HD
-
-delay=0
-
-if ! runcom "Getting step name" get_step; then
- echo "Error: Could not get current step "
- fail
-else
- step=`cat /tmp/step`
-fi
-
-echo Next Server is `cat /ka/tftpserver`
-
-echo Current step for $ip is : \"$C_H$step$C_N\"
-
-echo -n "Finding install type : "
-case $step in
- shell)
- echo No install, but interactive shell
- ## drop the user to an interactive shell
- exec /bin/bash
- ;;
- install)
- install_type=install
- nextstep=ready
- echo Install Linux
- ;;
- test_install)
- install_type=test_install
- nextstep=ready
- echo TEST TEST TEST
- countdown 10
- echo Install Linux TEST
- ;;
-esac
-
-
-if [ -z "$install_type" ]; then
- echo FATAL : Could not recognize this step name
- echo "Aborting... "
- fail
-fi
-
-
-
-# receive the partition table, fstab, etc from the source node
-mkdir /tmp/partfiles
-inc_ka_session
-echo Current session is $cur_ka_session
-runcom "Receiving partitions information" /ka/ka-d-client -w $cur_ka_session -e "( cd /tmp/partfiles && tar xvf - )" || fail
-
-
-
-
-cd /tmp/partfiles
-make_partitions
-
-
-test -f /tmp/partfiles/streams || fail "Missing streams file"
-first_stream=`cat /tmp/partfiles/streams | head -n 1`
-
-if [ "$first_stream" = linux ]; then
- rcv_linux=yes
-else
- rcv_linux=no
-fi
-
-
-
-#if we must receive a linux system, we need to format and mount the partitions
-if [ $rcv_linux = yes ]; then
- # format partitions
- format_partitions()
- {
- while read line; do
- declare -a fields
- fields=( $line )
-
- case ${fields[2]} in
- reiserfs )
- runcom "Formatting ${fields[0]} as reiserfs" mkreiserfs -f ${fields[0]} || fail
- ;;
- jfs )
- runcom "Formatting ${fields[0]} as jfs" mkfs.jfs ${fields[0]} || fail
- ;;
-
- xfs )
- runcom "Formatting ${fields[0]} as xfs" mkfs.xfs -f ${fields[0]} || fail
- ;;
- ext3 )
- runcom "Formatting ${fields[0]} as ext3" mkfs.ext2 -j ${fields[0]} || fail
- ;;
- ext2 )
- runcom "Formatting ${fields[0]} as ext2" mkfs.ext2 ${fields[0]} || fail
- ;;
- swap )
- runcom "Formatting ${fields[0]} as swap" mkswap ${fields[0]} || fail
- ;;
- esac
- done
- }
-
- format_partitions < /tmp/partfiles/pfstab
-
-
- # mount the partitions
-
- mount_partitions()
- {
- while read line; do
- declare -a fields
- fields=( $line )
-
- case ${fields[2]} in
- reiserfs )
- mount_partition ${fields[0]} ${fields[1]} || fail
- ;;
- xfs )
- mount_partition ${fields[0]} ${fields[1]} || fail
- ;;
- jfs )
- mount_partition ${fields[0]} ${fields[1]} || fail
- ;;
- ext3 )
- mount_partition ${fields[0]} ${fields[1]} || fail
- ;;
- ext2 )
- mount_partition ${fields[0]} ${fields[1]} || fail
- ;;
- esac
- done
- }
-
- # NOTE
- # I replaced cat truc | mount_partitions by mount_partitions < truc
- # because in the former case mount_partitions runs in a subshell and the $mounted_fs value is lost
- mount_partitions < /tmp/partfiles/pfstab
-
- echo ++++++++++++++++++++++++++
- mount
- echo ++++++++++++++++++++++++++
-
- delay=0
-else
- delay=10
-fi
-
-if [ $DONTWRITE != yes ]; then
- for stream in `cat /tmp/partfiles/streams`; do
- if [ "$stream" = "linux" ]; then
- # partitions already formatted/mounted, just copy now
- # untar data from the master 'on the fly'
- echo -n "Linux copy is about to start "
- countdown $delay
- echo
- inc_ka_session
- /ka/ka-d-client -w $cur_ka_session -e "(cd /mnt/disk; tar --extract --read-full-records --same-permissions --numeric-owner --sparse --file - ) 2>/dev/null" || fail
-
- runcom "Syncing disks" sync
- echo Linux copy done.
- echo Creating excluded directories
- cat /tmp/partfiles/excluded | recreate_dirs
- #echo Setting up networking
- #/ka/setup_network.sh
- #delay=10
- else
- # maybe receive some raw partition dumps
- echo Raw copy of $stream is about to start
- countdown $delay
- inc_ka_session
- /ka/ka-d-client -w $cur_ka_session -e "dd of=$stream bs=65536" || fail
- delay=10
- fi
- done
-
- echo "Removing computing interfaces"
- rm -f /mnt/disk/etc/sysconfig/network-scripts/ifcfg-eth1 >/dev/null 2>&1
-
- echo "Removing duplicated dhcp cache"
- rm -f /mnt/disk/etc/dhcpc/* >/dev/null 2>&1
-
- echo "Writing modules.conf"
- /usr/bin/perl /ka/gen_modules_conf.pl >/mnt/disk/etc/modules.conf
-
- echo "Writing modprobe.conf"
- chroot /mnt/disk/ /sbin/generate-modprobe.conf >/mnt/disk/etc/modprobe.conf
-
- echo "Running mkinitrd"
- /ka/make_initrd
-
- cd /tmp/partfiles
- write_MBRs
-
-
- if test -f /tmp/partfiles/command; then
- checkDevEntries
- command_to_run=`cat /tmp/partfiles/command`
- runcom "Running $command_to_run" run_chroot_command "$command_to_run"
- fi
-
-else
- echo " I would run ka-deploy(s) and then lilo/mbr "
- sleep 1
-fi
-
-# maybe there is a last dummy ka-deploy for synchronization
-if test -f /tmp/partfiles/delay; then
- sleep 1
- inc_ka_session
- runcom "Waiting source node signal to end installation" /ka/ka-d-client -w $cur_ka_session -e "cat" || fail
-fi
-
-umount_partitions
-
-
-# Update the step file on the tftp server
-#runcom 'Sending back new $step' set_step $nextstep || fail
-
-echo -n Rebooting...
-countdown 3
-do_reboot