mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			280 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			9.9 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
 | |
|     elif [[ ${key,,} == "netdevice" || ${key,,} == "device" ]]; then
 | |
|         netdevice=$value
 | |
|     fi
 | |
| done
 | |
| if [[ -n $hostip && -n $netmask && -n $gateway && -n $netdevice ]]; then
 | |
| 	# doing static ip
 | |
| 	numbits=$(mask2prefix $netmask)
 | |
| 	broadcast=$(bcastcalc $hostip $netmask)
 | |
| 	echo "Setting static IP=$hostip/$numbits broadcast=$broadcast gateway=$gateway netdevice=$netdevice ..."
 | |
| 	ip addr add $hostip/$numbits broadcast $broadcast dev $netdevice scope global label $netdevice
 | |
| 	ip link set $netdevice up
 | |
| 	ip route replace to default via $gateway dev $netdevice
 | |
| 	# 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..."
 | |
| 	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 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`
 | |
| 		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
 |