#!/bin/sh minixcatd.awk & 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 echo "Beginning node discovery process" NICSTOBRINGUP=`ip link|grep mtu|grep -v LOOPBACK|grep -v usb|grep -v ,UP|awk -F: '{print $2}'` for nic in $NICSTOBRINGUP; do dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$nic.pid $nic & #no need to go out of our way for superfluous ipv6 nics done waitforlink=100 while [ ! -z "$NICSTOBRINGUP" -a $waitforlink -gt 0 ]; do NICSTOBRINGUP=`ip link|grep mtu|grep -v LOOPBACK|grep -v usb|grep -v ,LOWER_UP|awk -F: '{print $2}'` waitforlink=$((waitforlink - 1)) sleep 0.1 if [ $waitforlink = 1 ]; then echo "No link detected on $NICSTOBRINGUP" fi done NICSGETTINGADDR=`ip link|grep mtu|grep -v LOOPBACK|grep -v usb|grep ,LOWER_UP|awk -F: '{print $2}'` timewaiting=0 echo "Waiting for nics to get addresses" while [ ! -z "$NICSGETTINGADDR" -a $timewaiting != 700 ]; do NEWNICSGETTINGADDR="" for nic in $NICSGETTINGADDR; do if ! ip addr show dev $nic |grep -v inet6|grep inet >/dev/null; then NEWNICSGETTINGADDR="$NEWNICSGETTINGADDR $nic" else echo -n "$nic|" ip addr show dev $nic |grep -v inet6|grep inet|sed -e s/\\/.*//|awk '{print $2}' fi done sleep 0.1 timewaiting=$((timewaiting+1)) if [ $timewaiting = 699 ]; then echo "No DHCP answer for $nic, ignoring interface" fi NICSGETTINGADDR=$NEWNICSGETTINGADDR done if [ $timewaiting != 700 -a $timewaiting -gt 450 ]; then echo "Got an address, but it took inordinately long, you may want to check spanning tree configuration" fi echo "Stopped waiting on nics to get addresses" 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 #time to make our packet... MTM=unknown SERIAL=unknown ARCH=unknown ARCH=`uname -m` #32-bit only is old news if [ -r /sys/devices/virtual/dmi/id/product_name ]; then #x86 PRODNAME=`cat /sys/devices/virtual/dmi/id/product_name` IAMAVM=0 if [ "$PRODNAME" = "KVM" ]; then IAMAVM=1 MTM=KVM elif [ "$PRODNAME" = "VMware Virtual Platform" ]; then IAMAVM=1 MTM=VMware else MTM=`cat /sys/devices/virtual/dmi/id/product_name|awk -F'[' '{print $2}'|awk -F']' '{print $1}'` fi elif [ -r /proc/device-tree/model ]; then #POWER MTM=`cat /proc/device-tree/model |awk -F, '{print $2}'` fi CPUCOUNT=`cat /proc/cpuinfo |grep "model name"|wc -l` MEMORY=`cat /proc/meminfo |grep MemTotal|awk '{print $2}'` UUID=`cat /sys/devices/virtual/dmi/id/product_uuid` grep "model name" /proc/cpuinfo | while read line; do #to avoid pulling in tail, we do a goofy thing echo $line > /tmp/cpumod done CPUTYPE=`cat /tmp/cpumod|awk -F':' '{print $2}'|sed -e 's/^ //'` echo '' > /tmp/discopacket echo "findme" >> /tmp/discopacket echo "$ARCH" >> /tmp/discopacket if [ "$IAMAVM" = 1 ]; then echo "virtual" >> /tmp/discopacket fi echo "$CPUCOUNT" >> /tmp/discopacket echo "$CPUTYPE" >> /tmp/discopacket echo "$MEMORY" >> /tmp/discopacket echo "$UUID" >> /tmp/discopacket if [ "$MTM" != "unknown" ]; then echo "$MTM" >> /tmp/discopacket fi if [ "$SERIAL" != "unknown" ]; then echo "$SERIAL" fi for dev in `ip link|grep -B1 ether|grep UP|awk '{print $2}'|sed -e s/://`; do DRIVER=`grep DRIVER /sys/class/net/$dev/device/uevent|awk -F= '{print $2}'` ADDRESS=`ip address show dev $dev|grep "inet "|grep global|awk '{print $2}'` MAC=`ip link show dev $dev|grep ether|awk '{print $2}'| tr /a-f/ /A-F/` echo "$DRIVER|$dev|$MAC|$ADDRESS" >> /tmp/discopacket done echo "$PUBKEY" >> /tmp/discopacket #this is not secure to use by itself, switch sourced pubkey for security echo "" >> /tmp/discopacket echo "" >> /tmp/discopacket echo "" >> /tmp/discopacket openssl dgst -sha512 -out /tmp/discopacket.sha512 -sign /etc/xcat/privkey.pem /tmp/discopacket openssl enc -e -a -in /tmp/discopacket.sha512 > /tmp/discopacket.b64sig cat /tmp/discopacket |while read line; do if [ "$line" = "" ]; then cat /tmp/discopacket.b64sig >> /tmp/discopacket.new fi echo $line >> /tmp/discopacket.new done mv /tmp/discopacket.new /tmp/discopacket while [ ! -r /restart ]; do if [ ! -z "$XCATMASTER" ]; then (cat /tmp/discopacket | udpcat.awk $XCATMASTER $XCATPORT ) & fi for dhcps in `grep dhcp-server /var/lib/dhclient/dhclient.leases|awk '{print $4}'|sed -s 's/;//'`; do (cat /tmp/discopacket | udpcat.awk $dhcps $XCATPORT ) & done #cat /tmp/discopacket sleep 5 done /bin/restart