#!/bin/bash # IBM(c) 2013 EPL license http://www.eclipse.org/legal/epl-v10.html # This routine when called, contacts xcatd. It will return to the caller when xcatd is # ready to process the request # It is called by xcatdsklspost before calling getpostscripts.awk # it is called by remoteshell before calling getcredentials.awk # For example xcatflowrequest 3001 # Returns # 0 = good # 1 = ping/nmap to ip address of master failed (TBD) # 2 = xcatd never gave goahead # # Here we will test to see if nmap is available # if available we will use it to see if the daemon is available # If not available we will use ping to the ip address # If nmap or ping fail then # we will return with exit 1 # # check bash version, if < 4 then cannot use autodetect of next FD bashversion=$BASH_VERSION bashversionnum=`echo $bashversion | cut -d. -f1` # cleanup before exiting cleanup() { sleeper=$(cat /tmp/sleeperpid.$parpid) sleeper=$(ps -ef|awk "\$3==$sleeper"|awk '{print $2}') rm /tmp/goahead.$parpid rm /tmp/sleeperpid.$parpid rm /tmp/killme.$parpid if [[ $bashversionnum > 3 ]]; then exec {REMOTEFD}>&- else exec 50>&- fi kill -TERM $sleeper } if [[ $bashversionnum > 3 ]]; then exec {REMOTEFD}<>/dev/udp/$1/$2 else exec 50<>/dev/udp/$1/$2 echo "resourcerequest: xcatd" >&50 REMOTEFD=50 fi echo "resourcerequest: xcatd" >&$REMOTEFD parpid=$$ touch /tmp/goahead.$parpid touch /tmp/killme.$parpid exec 2> /dev/null RETRY=0 MAX_RETRIES=50 while ! grep 'resourcerequest: ok' /tmp/goahead.$parpid > /dev/null; do ( echo "resourcerequest: xcatd" >&$REMOTEFD if [[ $bashversionnum > 3 ]]; then exec {LOCALFD}<>/proc/self/stat else exec 51<>/proc/self/stat LOCALFD=51 fi read mystat<&$LOCALFD mypid=$(echo $mystat|cut -d " " -f 4) (sleep $(((RANDOM%60)+120)).$((RANDOM%50)); if [ -f /tmp/killme.$parpid ]; then kill -TERM $mypid; fi) & echo $! > /tmp/sleeperpid.$parpid exec awk '{print $0 > "/tmp/goahead.'$parpid'";exit}' <&$REMOTEFD exec {LOCALFD}>&- ) # limit retries, if we reach the max error out RETRY=$(($RETRY+1)) if [ $RETRY -eq $MAX_RETRIES ] then cleanup exit 2 fi done cleanup exit 0