From c33096066f32297bbc275ea820531fe55e45b705 Mon Sep 17 00:00:00 2001 From: Olivier Blin Date: Sun, 28 Aug 2005 21:38:32 +0000 Subject: ka support (initially from Antoine Ginies and Erwan Velu) --- rescue/tree/etc/rc.sysinit | 7 + rescue/tree/ka/gen_modules_conf.pl | 191 +++++++++++ rescue/tree/ka/hostnames | 225 +++++++++++++ rescue/tree/ka/install.sh | 641 +++++++++++++++++++++++++++++++++++++ rescue/tree/ka/ka-d-client | Bin 0 -> 399376 bytes rescue/tree/ka/make_initrd | 44 +++ rescue/tree/ka/setup_network.sh | 80 +++++ rescue/tree/ka/tftpserver | 1 + 8 files changed, 1189 insertions(+) create mode 100644 rescue/tree/ka/gen_modules_conf.pl create mode 100644 rescue/tree/ka/hostnames create mode 100755 rescue/tree/ka/install.sh create mode 100755 rescue/tree/ka/ka-d-client create mode 100755 rescue/tree/ka/make_initrd create mode 100755 rescue/tree/ka/setup_network.sh create mode 100644 rescue/tree/ka/tftpserver (limited to 'rescue') diff --git a/rescue/tree/etc/rc.sysinit b/rescue/tree/etc/rc.sysinit index e228c91ba..9128ea562 100755 --- a/rescue/tree/etc/rc.sysinit +++ b/rescue/tree/etc/rc.sysinit @@ -57,6 +57,13 @@ load sr_mod grep -q noauto /proc/cmdline || drvinst SERIAL_USB +if grep ka /proc/cmdline; then + echo Welcome to Ka rescue + drvinst + cd /ka + ./install.sh +fi + if ! grep -q expert /proc/cmdline; then rescue-gui fi diff --git a/rescue/tree/ka/gen_modules_conf.pl b/rescue/tree/ka/gen_modules_conf.pl new file mode 100644 index 000000000..ae6c5bec6 --- /dev/null +++ b/rescue/tree/ka/gen_modules_conf.pl @@ -0,0 +1,191 @@ +$kinds2all_modules = { + 'usb' => [ + 'usb-uhci', + 'usb-ohci', + 'ehci-hcd' + ], + 'network' => [ + '3c501', + '3c503', + '3c505', + '3c507', + '3c509', + '3c515', + '3c90x', + '82596', + 'abyss', + 'ac3200', + 'acenic', + 'aironet4500_card', + 'at1700', + 'atp', + 'com20020-pci', + 'cs89x0', + 'de600', + 'de620', + 'defxx', + 'depca', + 'dgrs', + 'dmfe', + 'e100', + 'e2100', + 'eepro', + 'eepro100', + 'eexpress', + 'epic100', + 'eth16i', + 'ewrk3', + 'hamachi', + 'hp', + 'hp-plus', + 'hp100', + 'ibmtr', + 'lance', + 'natsemi', + 'ne', + 'ne2k-pci', + 'ni5010', + 'ni52', + 'ni65', + 'nvnet', + 'olympic', + 'pcnet32', + 'plip', + 'rcpci', + 'sb1000', + 'sis900', + 'smc-ultra', + 'smc9194', + 'starfire', + 'tlan', + 'tmspci', + 'tulip', + 'via-rhine', + 'wd', + 'winbond-840', + 'forcedeth', + 'fealnx', + '3c990', + '3c990fx', + 'b44', + 'bcm4400', + 'skfp', + 'tc35815', + 'lanstreamer', + 'farsync', + 'sdladrv', + 'prism2_plx', + 'iph5526', + '3c59x', + '8139too', + '8139cp', + 'sundance', + 'catc', + 'CDCEther', + 'kaweth', + 'pegasus', + 'rtl8150', + 'usbnet', + 'dl2k', + 'myri_sbus', + 'yellowfin', + 'ns83820', + 'r8169', + 'tg3', + 'e1000', + 'sk98lin', + 'bcm5820', + 'bcm5700' + ], + 'scsi' => [ + '3w-xxxx', + 'AM53C974', + 'BusLogic', + 'NCR53c406a', + 'a100u2w', + 'advansys', + 'aha152x', + 'aha1542', + 'aha1740', + 'atp870u', + 'dc395x_trm', + 'dtc', + 'g_NCR5380', + 'in2000', + 'initio', + 'pas16', + 'pci2220i', + 'psi240i', + 'fdomain', + 'qla1280', + 'qla2x00', + 'qlogicfas', + 'qlogicfc', + 'seagate', + 'wd7000', + 'sim710', + 'sym53c416', + 't128', + 'tmscsim', + 'u14-34f', + 'ultrastor', + 'eata', + 'eata_pio', + 'eata_dma', + 'mptscsih', + 'nsp32', + 'ata_piix', + 'sata_promise', + 'sata_svw', + 'sata_via', + '53c7,8xx', + 'aic7xxx', + 'aic7xxx_old', + 'aic79xx', + 'pci2000', + 'qlogicisp', + 'sym53c8xx', + 'lpfcdd', + 'DAC960', + 'dpt_i2o', + 'megaraid', + 'aacraid', + 'cciss', + 'cpqarray', + 'gdth', + 'i2o_block', + 'cpqfc', + 'qla2200', + 'qla2300', + 'pdc-ultra', + 'ips', + 'ppa', + 'imm' + ] + }; +my @l = map { /^(\S+)\s*:/ ? $1 : () } `lspcidrake`; + +my %kinds2modules = map { + $_ => [ intersection(\@l, $kinds2all_modules->{$_}) ]; +} qw(usb scsi); + +$kinds2modules{network} = [ + grep { + my $l = $_; + scalar grep { $_ eq $l } @{ $kinds2all_modules->{network} } + } @l +]; + +if (my @scsi = @{$kinds2modules{scsi}}) { + print "probeall scsi_hostadapter ", join(" ", @scsi), "\n"; +} +if (my @usb = @{$kinds2modules{usb}}) { + print "probeall usb-interface ", join(" ", @usb), "\n"; +} +my $eth = 0; +foreach (@{$kinds2modules{network}}) { + print "alias eth$eth $_\n"; + $eth++; +} + +sub intersection { my (%l, @m); @l{@{shift @_}} = (); foreach (@_) { @m = grep { exists $l{$_} } @$_; %l = (); @l{@m} = () } keys %l } diff --git a/rescue/tree/ka/hostnames b/rescue/tree/ka/hostnames new file mode 100644 index 000000000..e30fac24a --- /dev/null +++ b/rescue/tree/ka/hostnames @@ -0,0 +1,225 @@ +icluster1 129.88.96.1 +icluster2 129.88.96.2 +icluster3 129.88.96.3 +icluster4 129.88.96.4 +icluster5 129.88.96.51 +icluster6 129.88.96.6 +icluster7 129.88.96.7 +icluster8 129.88.96.8 +icluster9 129.88.96.9 +icluster10 129.88.96.10 +icluster11 129.88.96.11 +icluster12 129.88.96.12 +icluster13 129.88.96.13 +icluster14 129.88.96.14 +icluster15 129.88.96.15 +icluster16 129.88.96.16 +icluster17 129.88.96.17 +icluster18 129.88.96.18 +icluster19 129.88.96.19 +icluster20 129.88.96.20 +icluster21 129.88.96.21 +icluster22 129.88.96.22 +icluster23 129.88.96.23 +icluster24 129.88.96.24 +icluster25 129.88.96.25 +icluster26 129.88.96.26 +icluster27 129.88.96.27 +icluster28 129.88.96.28 +icluster29 129.88.96.29 +icluster30 129.88.96.30 +icluster31 129.88.96.31 +icluster32 129.88.96.32 +icluster33 129.88.96.33 +icluster34 129.88.96.34 +icluster35 129.88.96.35 +icluster36 129.88.96.36 +icluster37 129.88.96.37 +icluster38 129.88.96.38 +icluster39 129.88.96.39 +icluster40 129.88.96.40 +icluster41 129.88.96.41 +icluster42 129.88.96.42 +icluster43 129.88.96.43 +icluster44 129.88.96.44 +icluster45 129.88.96.45 +icluster46 129.88.96.46 +icluster47 129.88.96.47 +icluster48 129.88.96.48 +icluster49 129.88.96.49 +icluster50 129.88.96.50 +icluster51 129.88.96.51 +icluster52 129.88.96.52 +icluster53 129.88.96.53 +icluster54 129.88.96.54 +icluster55 129.88.96.55 +icluster56 129.88.96.56 +icluster57 129.88.96.57 +icluster58 129.88.96.58 +icluster59 129.88.96.59 +icluster60 129.88.96.60 +icluster61 129.88.96.61 +icluster62 129.88.96.62 +icluster63 129.88.96.63 +icluster64 129.88.96.64 +icluster65 129.88.96.65 +icluster66 129.88.96.66 +icluster67 129.88.96.67 +icluster68 129.88.96.68 +icluster69 129.88.96.69 +icluster70 129.88.96.70 +icluster71 129.88.96.71 +icluster72 129.88.96.72 +icluster73 129.88.96.73 +icluster74 129.88.96.74 +icluster75 129.88.96.75 +icluster76 129.88.96.76 +icluster77 129.88.96.77 +icluster78 129.88.96.78 +icluster79 129.88.96.79 +icluster80 129.88.96.80 +icluster81 129.88.96.81 +icluster82 129.88.96.82 +icluster83 129.88.96.83 +icluster84 129.88.96.84 +icluster85 129.88.96.85 +icluster86 129.88.96.86 +icluster87 129.88.96.87 +icluster88 129.88.96.88 +icluster89 129.88.96.89 +icluster90 129.88.96.90 +icluster91 129.88.96.91 +icluster92 129.88.96.92 +icluster93 129.88.96.93 +icluster94 129.88.96.94 +icluster95 129.88.96.95 +icluster96 129.88.96.96 +icluster97 129.88.96.97 +icluster98 129.88.96.98 +icluster99 129.88.96.99 +icluster100 129.88.96.100 +icluster101 129.88.96.101 +icluster102 129.88.96.102 +icluster103 129.88.96.103 +icluster104 129.88.96.104 +icluster105 129.88.96.105 +icluster106 129.88.96.106 +icluster107 129.88.96.107 +icluster108 129.88.96.108 +icluster109 129.88.96.109 +icluster110 129.88.96.110 +icluster111 129.88.96.111 +icluster112 129.88.96.112 +icluster113 129.88.96.113 +icluster114 129.88.96.114 +icluster115 129.88.96.115 +icluster116 129.88.96.116 +icluster117 129.88.96.117 +icluster118 129.88.96.118 +icluster119 129.88.96.119 +icluster120 129.88.96.120 +icluster121 129.88.96.121 +icluster122 129.88.96.122 +icluster123 129.88.96.123 +icluster124 129.88.96.124 +icluster125 129.88.96.125 +icluster126 129.88.96.126 +icluster127 129.88.96.127 +icluster128 129.88.96.128 +icluster129 129.88.96.129 +icluster130 129.88.96.130 +icluster131 129.88.96.131 +icluster132 129.88.96.132 +icluster133 129.88.96.133 +icluster134 129.88.96.134 +icluster135 129.88.96.135 +icluster136 129.88.96.136 +icluster137 129.88.96.137 +icluster138 129.88.96.138 +icluster139 129.88.96.139 +icluster140 129.88.96.140 +icluster141 129.88.96.141 +icluster142 129.88.96.142 +icluster143 129.88.96.143 +icluster144 129.88.96.144 +icluster145 129.88.96.145 +icluster146 129.88.96.146 +icluster147 129.88.96.147 +icluster148 129.88.96.148 +icluster149 129.88.96.149 +icluster150 129.88.96.150 +icluster151 129.88.96.151 +icluster152 129.88.96.152 +icluster153 129.88.96.153 +icluster154 129.88.96.154 +icluster155 129.88.96.155 +icluster156 129.88.96.156 +icluster157 129.88.96.157 +icluster158 129.88.96.158 +icluster159 129.88.96.159 +icluster160 129.88.96.160 +icluster161 129.88.96.161 +icluster162 129.88.96.162 +icluster163 129.88.96.163 +icluster164 129.88.96.164 +icluster165 129.88.96.165 +icluster166 129.88.96.166 +icluster167 129.88.96.167 +icluster168 129.88.96.168 +icluster169 129.88.96.169 +icluster170 129.88.96.170 +icluster171 129.88.96.171 +icluster172 129.88.96.172 +icluster173 129.88.96.173 +icluster174 129.88.96.174 +icluster175 129.88.96.175 +icluster176 129.88.96.176 +icluster177 129.88.96.177 +icluster178 129.88.96.178 +icluster179 129.88.96.179 +icluster180 129.88.96.180 +icluster181 129.88.96.181 +icluster182 129.88.96.182 +icluster183 129.88.96.183 +icluster184 129.88.96.184 +icluster185 129.88.96.185 +icluster186 129.88.96.186 +icluster187 129.88.96.187 +icluster188 129.88.96.188 +icluster189 129.88.96.189 +icluster190 129.88.96.190 +icluster191 129.88.96.191 +icluster192 129.88.96.192 +icluster193 129.88.96.193 +icluster194 129.88.96.194 +icluster195 129.88.96.195 +icluster196 129.88.96.196 +icluster197 129.88.96.197 +icluster198 129.88.96.198 +icluster199 129.88.96.199 +icluster200 129.88.96.200 +icluster201 129.88.96.201 +icluster202 129.88.96.202 +icluster203 129.88.96.203 +icluster204 129.88.96.204 +icluster205 129.88.96.205 +icluster206 129.88.96.206 +icluster207 129.88.96.207 +icluster208 129.88.96.208 +icluster209 129.88.96.209 +icluster210 129.88.96.210 +icluster211 129.88.96.211 +icluster212 129.88.96.212 +icluster213 129.88.96.213 +icluster214 129.88.96.214 +icluster215 129.88.96.215 +icluster216 129.88.96.216 +icluster217 129.88.96.217 +icluster218 129.88.96.218 +icluster219 129.88.96.219 +icluster220 129.88.96.220 +icluster221 129.88.96.221 +icluster222 129.88.96.222 +icluster223 129.88.96.223 +icluster224 129.88.96.224 +icluster225 129.88.96.225 diff --git a/rescue/tree/ka/install.sh b/rescue/tree/ka/install.sh new file mode 100755 index 000000000..ee93c1e19 --- /dev/null +++ b/rescue/tree/ka/install.sh @@ -0,0 +1,641 @@ +#!/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 diff --git a/rescue/tree/ka/ka-d-client b/rescue/tree/ka/ka-d-client new file mode 100755 index 000000000..1ae4fa703 Binary files /dev/null and b/rescue/tree/ka/ka-d-client differ diff --git a/rescue/tree/ka/make_initrd b/rescue/tree/ka/make_initrd new file mode 100755 index 000000000..8f8a0492d --- /dev/null +++ b/rescue/tree/ka/make_initrd @@ -0,0 +1,44 @@ +#!/bin/bash +echo Looking for default kernel +CHROOT=/mnt/disk +IMG=`cat $CHROOT/etc/lilo.conf | grep default | cut -d "=" -f 2 | sed -e 's/\"//g'` +KERN="x" +INITRD="" +LABEL="x" + +modprobe loop + +for i in `cat $CHROOT/etc/lilo.conf`; do + + if echo $i | grep image >/dev/null; then + KERN=$CHROOT`echo $i | cut -d "=" -f 2` + INITRD="" + LABEL="x" + fi + if echo $i | grep label >/dev/null; then + LABEL=`echo $i | cut -d "=" -f 2 | sed -e 's/\"//g'` + fi + if echo $i | grep initrd >/dev/null; then + INITRD=`echo $i | cut -d "=" -f 2` + fi + if [ ${LABEL} == ${IMG} ] && [ ! -z ${INITRD} ]; then + echo "Kernel name is $KERN" + echo "Initrd name is $INITRD" + KERN_VERSION=`/usr/bin/strings $KERN | grep "^2\.[2.6]"| cut -d " " -f 1` + if [ -z $KERN_VERSION ]; then + echo "No kernel version found !" + fi + chroot $CHROOT mount /proc + mount /dev/ $CHROOT/dev -o bind +# chroot $CHROOT MAKEDEV loop +# chroot $CHROOT MAKEDEV fd +# chroot $CHROOT MAKEDEV hd +# chroot $CHROOT MAKEDEV sd +# chroot $CHROOT MAKEDEV md +# chroot $CHROOT MAKEDEV zero + chroot $CHROOT /sbin/mkinitrd -f $INITRD $KERN_VERSION + umount $CHROOT/dev + chroot $CHROOT umount /proc + exit + fi +done diff --git a/rescue/tree/ka/setup_network.sh b/rescue/tree/ka/setup_network.sh new file mode 100755 index 000000000..9ef6992bd --- /dev/null +++ b/rescue/tree/ka/setup_network.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# this script setups the network on the cloned system +# puts a correct hostname +# changes the IP if static -- for only ONE device (dunno what will happen with multiple NICs) +# needs the file /ka/hostnames + + +curdir=`pwd` + + +ip=`/sbin/ifconfig | /bin/grep -v 127.0.0.1 | /bin/grep "inet addr" | /bin/sed 's/^.*inet addr:\([^ ]*\) .*$/\1/g'` +oldip=$ip +ip=`echo $ip | sed -e 's/\./_/g'` +echo -n "Setting hostname: " +/bin/hostname $ip + + +# current hostname has been set up in rc.sysinit +ip=$oldip +echo My IP is $ip +cd /ka + +# the sed command will remove unwanted spaces +########################## +# HOSTNMAE already set on NODE +############################ +#if test -f hostnames ; then +# myname=`/bin/cat hostnames | /bin/sed -e 's/ / /g' -e 's/ *$//' | /bin/grep " $ip\$" | /bin/cut -d ' ' -f 1` +# nbfound=`echo "$myname" |/usr/bin/wc -l` +#fi## +# +#if [ $nbfound -ne 1 ] || [ -z "$myname" ]; then +# # try DNS +# echo IP not found in /ka/hostnames, Trying DNS +# myname=`/usr/bin/host $ip | /bin/grep "domain name" | /bin/cut -d " " -f 5 | /bin/sed 's/\.$//g' ` +# myname=`nslookup $ip | grep ^Name: | tail -n +2 | head -n 1 | sed 's/Name: *//'` +#fi +# +#if [ -z "$myname" ]; then +# myname=`/bin/hostname` +# echo WARNING:HOSTNAME NOT FOUND +#fi +# +#echo My hostname is $myname + +# change hostname in the network file +#old=/mnt/disk/etc/sysconfig/network.beforeka +#new=/mnt/disk/etc/sysconfig/network + +#rm -f "$old" +#mv "$new" "$old" +#/bin/cat "$old" | /bin/grep -v ^HOSTNAME= > "$new" +#echo "HOSTNAME=$myname" >> "$new" +###################### +## +###################### + + + + +# assume first NIC is the gatewaydev (right ? wrong ?) +#firstnic=`grep ^GATEWAYDEV "$new" | cut -d = -f 2 | tr -d \"` +#echo GATEWAYDEV=$firstnic + +# see if IP has to be written +#proto=`grep ^BOOTPROTO /mnt/disk/etc/sysconfig/network-scripts/ifcfg-$firstnic | cut -d = -f 2 | tr -d \"` +#echo PROTO=$proto +#if [ "$proto" != "dhcp" ]; then +# # proto is static, write the new IP in the config file +# old=/mnt/disk/etc/sysconfig/network-scripts/ifcfg-$firstnic.beforeka +# new=/mnt/disk/etc/sysconfig/network-scripts/ifcfg-$firstnic +# +# rm -f "$old" +# mv "$new" "$old" +# cat "$old" | grep -v ^IPADDR= > "$new" +# echo IPADDR=$ip >> "$new" +#fi + +cd $curdir diff --git a/rescue/tree/ka/tftpserver b/rescue/tree/ka/tftpserver new file mode 100644 index 000000000..deed6748f --- /dev/null +++ b/rescue/tree/ka/tftpserver @@ -0,0 +1 @@ +192.168.200.10 -- cgit v1.2.1