83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/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 <ip address of master> 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
 |