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
|