# # 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 modprobe cpufreq_ondemand for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo -n ondemand > $gov done 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 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; cdhclient -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 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 (while ! ntpq -c "rv 0 state"|grep 'state=4' > /dev/null; do sleep 1; done; hwclock --systohc) & if dmidecode|grep IPMI > /dev/null; then modprobe ipmi_si modprobe ipmi_devintf 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` ERROR=`wget $destparameter 2>&1` while [ $? == 1 ] && echo $ERROR|grep -v 416; do sleep 10 ERROR=`wget -c $destparameter 2>&1` 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 "; 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