207
Chapter 15: Advanced Configuration
15.1.6 Power cycle any device upon a ping request failure
The ping-detect script is designed to run specified commands when a monitored host stops responding to ping requests.
The first parameter taken by the ping-detect script is the hostname/ IP address of the device to ping. Any other parameters are
then regarded as a command to run whenever the ping to the host fails. ping-detect can run any number of commands.
Below is an example using ping-detecttopowercycleanRPC(PDU)outletwheneveraspecichostfailstorespondtoaping
request. The ping-detect is run from /etc/config/rc.local to make sure that the monitoring starts whenever the system boots.
So if we assume we have a serially controlled RPC connected to port01 on a Console Server and have a router powered by
outlet3ontheRPC(andtherouterhasaninternalIPaddressof192.168.22.2).Thefollowinginstructionswillshowyou
howtocontinuouslypingtherouterandwhentherouterfailstorespondtoaseriesofpings,theConsoleServerwillsenda
commandtoRPCoutlet3topowercycletherouter,andwritethecurrentdate/timetoale:
• Copytheping-detect script to /etc/config/scripts/ on the Console Server
• Open /etc/config/rc.local using vi
• Addthefollowinglinetorc.local:
/etc/config/scripts/ping-detect 192.168.22.2 /bin/bash -c "pmpower -l port01 -o 3 cycle && date" > /tmp/output.log &
Theabovecommandwillcausetheping-detectscripttocontinuouslypingthehostat192.168.22.2whichistherouter.Ifthe
routercrashesitwillnolongerrespondtopingrequests.Ifthishappens,thetwocommandspmpower and date will run. The
output from these commands is sent to the file /tmp/output.log so that we have some kind of record. The ping-detect is also
runinthebackgroundusingthe"&".
Remember the rc.local script is only run by default when the system boots. You can manually run the rc.local script or the
ping-detectscriptifdesired.
The ping-detect script
Theaboveisjustoneexampleofusingtheping-detect script. The idea of the script is to run any number of commands when
a specific host stops responding to ping requests. Here are details of the ping-detect script itself:
#!/bin/sh
# Usage: ping-detect HOST [COMMANDS...]
# This script takes 2 types of arguments: hostname/IPaddress to ping, and the commands to
# run if the ping fails 5 times in a row. This script can only take one host/IPaddress per
# instance. Multiple independent commands can be sent to the script. The commands will be
# run one after the other.
#
# PINGREP is the entire reply from the ping command
# LOSS is the percentage loss from the ping command
# $1 must be the hostname/IPaddress of device to ping
# $2... must be the commands to run when the pings fail.
COUNTER=0
TARGET="$1"
shift
# loop indefinitely:
while true
do
# ping the device 10 times
PINGREP=`ping -c 10 -i 1 "$TARGET" `
#get the packet loss percentage
LOSS=`echo "$PINGREP" | grep "%" | sed -e 's/.* \([0-9]*\)% .*/\1/'`
if [ "$LOSS" -eq "100" ]
then
COUNTER=`expr $COUNTER + 1`
else
COUNTER=0
sleep 30s
fi