304 lines
11 KiB
Plaintext
Executable File
304 lines
11 KiB
Plaintext
Executable File
#
|
|
# 2013.02.07 Brian Elliott Finley <bfinley@us.ibm.com>
|
|
# - Added slash in front of "var" in the NICSTOBRINGUP dhclient section.
|
|
# Bug reported by Jeff Lang <jrlang@uwyo.edu>. Thanks, Jeff!
|
|
#
|
|
|
|
modprobe acpi_cpufreq 2>/dev/null # on some machines this fails
|
|
modprobe cpufreq_ondemand
|
|
if ls /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor &>/dev/null; then
|
|
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
|
echo -n ondemand > $gov
|
|
done
|
|
fi
|
|
if [ ! -z "$BOOTIF" ]; then
|
|
BOOTIF=`echo $BOOTIF|sed -e s/01-// -e s/-/:/g`
|
|
echo -n "Waiting for device with address $BOOTIF to appear.."
|
|
gripeiter=6000
|
|
while [ -z "$bootnic" ]; do
|
|
bootnic=`ip link show|grep -B1 $BOOTIF|grep mtu|awk '{print $2}'|sed -e 's/:$//'`
|
|
sleep 0.1
|
|
if [ $gripeiter = 0 ]; then
|
|
echo "ERROR"
|
|
echo "Unable to find boot device (maybe the nbroot is missing the driver for your nic?)"
|
|
while :; do sleep 365d; done
|
|
fi
|
|
gripeiter=$((gripeiter-1))
|
|
done
|
|
fi
|
|
echo "Done"
|
|
if [ -z "$bootnic" ]; then
|
|
echo "ERROR: BOOTIF missing, can't detect boot nic"
|
|
fi
|
|
|
|
if [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
|
|
duid='default-duid "\\000\\004';
|
|
#product_uuid in sysfs fails to cope with endianness of SMBIOS 2.6, unconditionnaly swap. Technically leads to incorrect DUID in 'older' systems but matches MS behavior
|
|
for i in `sed -e 's/\(..\)\(..\)\(..\)\(..\)-\(..\)\(..\)-\(..\)\(..\)/\4\3\2\1-\6\5-\8\7/;s/-//g;s/\(..\)/\1 /g' /sys/devices/virtual/dmi/id/product_uuid`; do
|
|
octnum="\\"`printf "\\%03o" 0x$i`
|
|
duid=$duid$octnum
|
|
done
|
|
duid=$duid'";'
|
|
echo $duid > /var/lib/dhclient/dhclient6.leases
|
|
fi
|
|
rpcbind
|
|
rpc.statd
|
|
ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C '' -N ''
|
|
ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C '' -N ''
|
|
echo 'Protocol 2' >> /etc/ssh/sshd_config
|
|
/usr/sbin/sshd
|
|
mkdir -p /etc/xcat
|
|
mkdir -p /etc/pki/tls
|
|
echo "[ req ]
|
|
distinguished_name = nodedn
|
|
|
|
[ nodedn ]" > /etc/pki/tls/openssl.cnf
|
|
echo -n "Generating private key..."
|
|
openssl genrsa -out /etc/xcat/privkey.pem 1024 >& /dev/null
|
|
echo "Done"
|
|
PUBKEY=`openssl rsa -in /etc/xcat/privkey.pem -pubout 2> /dev/null|grep -v "PUBLIC KEY"`
|
|
PUBKEY=`echo $PUBKEY|sed -e 's/ //g'`
|
|
export PUBKEY
|
|
/sbin/rsyslogd -c4
|
|
mkdir -p /var/lib/lldpad
|
|
echo 'lldp :' >> /var/lib/lldpad/lldpad.conf
|
|
echo '{' >> /var/lib/lldpad/lldpad.conf
|
|
for iface in `ip link |grep -v '^ '|awk '{print $2}'|sed -e 's/:$//'|grep -v lo`; do
|
|
echo "$iface :" >> /var/lib/lldpad/lldpad.conf
|
|
echo "{" >> /var/lib/lldpad/lldpad.conf
|
|
echo "tlvid00000006 :" >> /var/lib/lldpad/lldpad.conf
|
|
echo "{" >> /var/lib/lldpad/lldpad.conf
|
|
echo info = '"'$PUBKEY'";' >> /var/lib/lldpad/lldpad.conf
|
|
echo 'enableTx = true;' >> /var/lib/lldpad/lldpad.conf
|
|
echo '};' >> /var/lib/lldpad/lldpad.conf
|
|
echo 'adminStatus = 3;' >> /var/lib/lldpad/lldpad.conf
|
|
echo '};' >> /var/lib/lldpad/lldpad.conf
|
|
done
|
|
echo '};' >> /var/lib/lldpad/lldpad.conf
|
|
lldpad -d
|
|
|
|
# Caclulate the broadcast address of a given IP address and mask.
|
|
bcastcalc(){
|
|
read oct1 oct2 oct3 oct4 << HERE
|
|
$(echo "$1" | sed -e 's/\./ /g')
|
|
HERE
|
|
read msk1 msk2 msk3 msk4 << HERE
|
|
$(echo "$2" | sed -e 's/\./ /g')
|
|
HERE
|
|
ipa=$(($oct1+(255-($oct1 | $msk1))))
|
|
ipb=$(($oct2+(255-($oct2 | $msk2))))
|
|
ipc=$(($oct3+(255-($oct3 | $msk3))))
|
|
ipd=$(($oct4+(255-($oct4 | $msk4))))
|
|
echo "$ipa.$ipb.$ipc.$ipd"
|
|
}
|
|
|
|
# Calculates the number of bits in a netmask for converting something like 255.255.255.192 to 26 so
|
|
# you can use the notation 10.0.0.1/26
|
|
mask2prefix() {
|
|
nbits=0
|
|
old_ifs=$IFS
|
|
IFS=.
|
|
for dec in $1 ; do
|
|
case $dec in
|
|
255) let nbits+=8;;
|
|
254) let nbits+=7;;
|
|
252) let nbits+=6;;
|
|
248) let nbits+=5;;
|
|
240) let nbits+=4;;
|
|
224) let nbits+=3;;
|
|
192) let nbits+=2;;
|
|
128) let nbits+=1;;
|
|
0);;
|
|
*) echo "Error: $dec is not recognised"; exit 1
|
|
esac
|
|
done
|
|
IFS=$old_ifs
|
|
echo "$nbits"
|
|
}
|
|
|
|
# see if they specified static ip info, otherwise use dhcp
|
|
for parm in `cat /proc/cmdline`; do
|
|
key=`echo $parm|awk -F= '{print $1}'`
|
|
value=`echo $parm|awk -F= '{print $2}'`
|
|
if [[ ${key,,} == "hostip" || ${key,,} == "ipaddr" ]]; then
|
|
hostip=$value
|
|
elif [[ ${key,,} == "netmask" ]]; then
|
|
netmask=$value
|
|
elif [[ ${key,,} == "gateway" ]]; then
|
|
gateway=$value
|
|
fi
|
|
done
|
|
if [[ -n $hostip && -n $netmask && -n $gateway && -n $bootnic ]]; then
|
|
# doing static ip
|
|
# the device was determined above from the bootif mac, and put in bootnic
|
|
numbits=$(mask2prefix $netmask)
|
|
broadcast=$(bcastcalc $hostip $netmask)
|
|
echo "Setting static IP=$hostip/$numbits broadcast=$broadcast gateway=$gateway device=$bootnic BOOTIF=$BOOTIF ..."
|
|
ip addr add $hostip/$numbits broadcast $broadcast dev $bootnic scope global label $bootnic
|
|
ip link set $bootnic up
|
|
ip route replace to default via $gateway dev $bootnic
|
|
# in softlayer it takes up to 60 seconds for the nic to actually be able to communicate
|
|
echo -n Waiting to reach xCAT mgmt node $gateway.
|
|
xcatretries=60
|
|
while [ $((xcati+=1)) -le $xcatretries ] && ! ping -c2 -w3 $gateway >/dev/null 2>&1; do echo -n .; done
|
|
if [ $xcati -le $xcatretries ]; then echo " success"; else echo " failed"; fi
|
|
sleep 3
|
|
else
|
|
echo "Setting IP via DHCP..."
|
|
# This section is for System P hardware discovery, which won't have a BOOTIF value set
|
|
tries=0
|
|
while [ $tries -lt 5 ]; do
|
|
if [ -z "$bootnic" ]; then
|
|
ALLUP_NICS=`ip link show | grep -v "^ " | grep "state UP" | awk '{print $2}' | sed -e 's/:$//'|grep -v lo`
|
|
for tmp1 in $ALLUP_NICS; do
|
|
bootnic=$tmp1
|
|
break
|
|
done
|
|
else
|
|
break
|
|
fi
|
|
sleep 2
|
|
tries=$(($tries+1))
|
|
done
|
|
if [ -z "$bootnic" ]; then
|
|
ALL_NICS=`ip link show | grep -v "^ " | awk '{print $2}' | sed -e 's/:$//' | grep -v lo`
|
|
for tmp in $ALL_NICS; do
|
|
bootnic=$tmp
|
|
break
|
|
done
|
|
fi
|
|
|
|
dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$bootnic.pid $bootnic &
|
|
#we'll kick of IPv6 and IPv4 on all nics, but not wait for them to come up unless doing discovery, to reduce
|
|
#chances that we'll perform a partial discovery
|
|
#in other scenarios where downed non-bootnics cause issues, will rely on retries to fix things up
|
|
dhclient -6 -pf /var/run/dhclient6.$bootnic.pid $bootnic -lf /var/lib/dhclient/dhclient6.leases &
|
|
NICSTOBRINGUP=`ip link|grep mtu|grep -v LOOPBACK|grep -v $bootnic|grep -v usb|grep -v ,UP|awk -F: '{print $2}'`
|
|
export NICSTOBRINGUP
|
|
for nic in $NICSTOBRINGUP; do
|
|
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$nic.pid $nic ) &
|
|
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -6 -pf /var/run/dhclient6.$nic.pid -lf /var/lib/dhclient/dhclient6.leases $nic ) &
|
|
done
|
|
fi
|
|
|
|
openssl genrsa -out /etc/xcat/certkey.pem 4096 > /dev/null 2>&1 &
|
|
|
|
gripeiter=101
|
|
echo -n "Acquiring network addresses.."
|
|
while ! ip addr show dev $bootnic|grep -v 'scope link'|grep -v 'dynamic'|grep -v inet6|grep inet > /dev/null; do
|
|
sleep 0.1
|
|
if [ $gripeiter = 1 ]; then
|
|
echo
|
|
echo "It seems to be taking a while to acquire an IPv4 address, you may want to check spanning tree..."
|
|
fi
|
|
gripeiter=$((gripeiter-1))
|
|
done
|
|
echo -n "Acquired IPv4 address on $bootnic: "
|
|
ip addr show dev $bootnic|grep -v 'scope link'|grep -v 'dynamic'|grep -v inet6|grep inet|awk '{print $2}'
|
|
ntpd -g -x
|
|
# rv 0 state does not work with the new ntp versions
|
|
#(while ! ntpq -c "rv 0 state"|grep 'state=4' > /dev/null; do sleep 1; done; hwclock --systohc) &
|
|
(while [ "`ntpq -c \"rv 0 offset\" | grep \"offset=\" | awk -F \"=\" '{print $2}' | awk -F \".\" '{print $1}' | sed s/-//`" -ge 1000 ]; do sleep 1; done; hwclock --systohc) &
|
|
if [ -f "/usr/sbin/dmidecode" ]; then
|
|
if dmidecode|grep IPMI > /dev/null; then
|
|
modprobe ipmi_si
|
|
modprobe ipmi_devintf
|
|
fi
|
|
fi
|
|
DEVICE=$bootnic
|
|
export DEVICE
|
|
XCATPORT=3001
|
|
export XCATPORT
|
|
for parm in `cat /proc/cmdline`; do
|
|
key=`echo $parm|awk -F= '{print $1}'`
|
|
if [ "$key" = "xcatd" ]; then
|
|
XCATMASTER=`echo $parm|awk -F= '{print $2}'|awk -F: '{print $1}'`
|
|
XCATPORT=`echo $parm|awk -F= '{print $2}'|awk -F: '{print $2}'`
|
|
fi
|
|
done
|
|
export XCATMASTER
|
|
if [ "$destiny" != "discover" ]; then #we aren't discoverying, we probably can and should get a cert
|
|
/bin/getcert $XCATMASTER:$XCATPORT
|
|
fi
|
|
while :; do
|
|
if [ -z "$destiny" ]; then
|
|
destiny=`getdestiny $XCATMASTER:$XCATPORT`
|
|
fi
|
|
destparameter=`echo $destiny|awk -F= '{print $2}'`
|
|
destiny=`echo $destiny|awk -F= '{print $1}'`
|
|
dest=`echo $destiny|awk '{print $1}'` #could probably use bash but oh well
|
|
if [ "$dest" = "discover" ]; then #skip a query to xCAT when /proc/cmdline will do
|
|
/bin/dodiscovery
|
|
/bin/getcert $XCATMASTER:$XCATPORT
|
|
destiny=''
|
|
dest=''
|
|
elif [ "$dest" = shell ]; then
|
|
echo "Dropping to debug shell, exit to check for further action"
|
|
destiny=''
|
|
dest=''
|
|
/bin/bash
|
|
elif [ "$dest" = runcmd ]; then
|
|
destiny=`/bin/nextdestiny $XCATMASTER:$XCATPORT`
|
|
dest=`echo $destiny|awk -F= '{print $1}'`
|
|
$destparameter
|
|
elif [ "$dest" = runimage ]; then
|
|
destiny=`/bin/nextdestiny $XCATMASTER:$XCATPORT`
|
|
dest=`echo $destiny|awk -F= '{print $1}'`
|
|
mkdir /tmp/`basename $destparameter`
|
|
cd /tmp/`basename $destparameter`
|
|
eval destparameter=$destparameter
|
|
ERROR=`wget $destparameter 2>&1`
|
|
rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
echo "Failed to wget $destparameter"
|
|
echo $ERROR
|
|
fi
|
|
while [ $rc -ne 0 ] && echo $ERROR|grep -v 416; do
|
|
sleep 10
|
|
ERROR=`wget -c $destparameter 2>&1`
|
|
rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
echo "Failed to wget $destparameter"
|
|
echo $ERROR
|
|
fi
|
|
done
|
|
tar xvf `basename $destparameter`
|
|
./runme.sh
|
|
cd -
|
|
elif [ "$dest" = "reboot" -o "$dest" = "boot" ]; then
|
|
/bin/nextdestiny $XCATMASTER:$XCATPORT
|
|
ipmitool chassis bootdev pxe
|
|
reboot -f
|
|
elif [ "$dest" = "install" -o "$dest" = "netboot" ]; then
|
|
ipmitool chassis bootdev pxe
|
|
reboot -f
|
|
elif [ "$dest" = sysclone ]; then
|
|
/bin/dosysclone
|
|
destiny=''
|
|
dest=''
|
|
elif [ "$dest" = standby ]; then
|
|
destiny=''
|
|
dest=''
|
|
delay=$((30+$RANDOM%270))
|
|
while [ $delay -gt 0 ]; do
|
|
echo -en "Received request to retry in a bit, will call xCAT back in $delay seconds \r"
|
|
delay=$((delay-1))
|
|
sleep 1
|
|
done
|
|
echo "Retrying ";
|
|
elif [ "$dest" = shutdown ]; then
|
|
poweroff -f
|
|
else
|
|
echo "Unrecognized directive $dest"
|
|
destiny=''
|
|
dest=''
|
|
delay=$((30+$RANDOM%270))
|
|
while [ $delay -gt 0 ]; do
|
|
echo -en "Will retry in $delay seconds \r"
|
|
delay=$((delay-1))
|
|
sleep 1
|
|
done
|
|
|
|
fi
|
|
done
|