221 lines
6.0 KiB
Bash
Executable File
221 lines
6.0 KiB
Bash
Executable File
#!/usr/bin/ksh
|
|
#
|
|
#
|
|
# SCRIPT: pingnodes.ksh
|
|
# AUTHOR: Randy Michael
|
|
# DATE: 02-20-2007
|
|
#
|
|
# PURPOSE: This script is used to ping a list of nodes and
|
|
# send e-mail notification (or alpha-numeric page) of any unreachable
|
|
# nodes.
|
|
#
|
|
# REV: 1.0.A
|
|
#
|
|
# REV.LIST:
|
|
#
|
|
#
|
|
# set -x # Uncomment to debug this script
|
|
# set -n # Uncomment to check command syntax without any execution
|
|
#
|
|
#######################################################
|
|
|
|
# Set a trap and cleanup before a trapped exit...
|
|
# REMEMBER: you CANNOT trap "kill -9"
|
|
|
|
trap 'echo "\n\nExiting on trapped signal...\n" \
|
|
;exit 1' 1 2 3 15
|
|
|
|
#######################################################
|
|
|
|
# Define and initialize variables here...
|
|
|
|
PING_COUNT="3" # The number of times to ping each node
|
|
PACKET_SIZE="56" # Packet size of each ping
|
|
|
|
typeset -u PINGNODES # Always use the UPPERCASE value for $PINGNODES
|
|
PINGNODES="TRUE" # To enable or disable pinging FROM this node - "TRUE"
|
|
|
|
typeset -u MAILOUT # Always use the UPPERCASE value for $MAILOUT
|
|
MAILOUT="TRUE" # TRUE enables outbound mail notification of events
|
|
|
|
UNAME=$(uname)
|
|
|
|
PINGFILE="/usr/local/bin/ping.list" # List of nodes to ping
|
|
|
|
if [ -s $PINGFILE ]
|
|
then
|
|
# Ping all nodes in the list that are not commented out and blank
|
|
PINGLIST=$(cat $PINGFILE | egrep -v '^#')
|
|
else
|
|
echo "\nERROR: Missing file - $PINGFILE"
|
|
echo "\nList of nodes to ping is unknown...EXITING...\n"
|
|
exit 2
|
|
fi
|
|
|
|
MAILFILE="/usr/local/bin/mail.list" # List of persons to notify
|
|
|
|
if [ -s $MAILFILE ]
|
|
then
|
|
# Ping all nodes in the list that are not commented out and blank
|
|
MAILLIST=$(cat $MAILFILE | egrep -v '^#')
|
|
else
|
|
echo "\nERROR: Missing file - $MAILFILE"
|
|
echo "\nList of persons to notify is unknown...\n"
|
|
echo "No one will be notified of unreachable nodes...\n"
|
|
fi
|
|
|
|
PING_OUTFILE="/tmp/pingfile.out" # File for emailed notification
|
|
>$PING_OUTFILE # File for emailed notification
|
|
|
|
integer INTERVAL="3" # Number of seconds to sleep between retries
|
|
|
|
PINGSTAT= # Number of pings received back from pinging a node
|
|
PINGSTAT2= # Number of pings received back on the second try
|
|
|
|
THISHOST=`hostname` # The hostname of this machine
|
|
|
|
########################################################
|
|
############ DEFINE FUNCTIONS HERE #####################
|
|
########################################################
|
|
|
|
function ping_host
|
|
{
|
|
# This function pings a single node based on the Unix flavor
|
|
# set -x # Uncomment to debug this function
|
|
# set -n # Uncomment to check the syntax without any execution
|
|
|
|
# Look for exactly one argument, the host to ping
|
|
|
|
if (( $# != 1 ))
|
|
then
|
|
echo "\nERROR: Incorrect number of arguments - $#"
|
|
echo " Expecting exactly one augument\n"
|
|
echo "\t...EXITING...\n"
|
|
exit 1
|
|
fi
|
|
|
|
HOST=$1 # Grab the host to ping from ARG1.
|
|
|
|
# This next case statement executes the correct ping
|
|
# command based on the Unix flavor
|
|
|
|
case $UNAME in
|
|
|
|
AIX|OpenBSD|Linux)
|
|
ping -c${PING_COUNT} $HOST 2>/dev/null
|
|
;;
|
|
HP-UX)
|
|
ping $HOST $PACKET_SIZE $PING_COUNT 2>/dev/null
|
|
;;
|
|
SunOS)
|
|
ping -s $HOST $PACKET_SIZE $PING_COUNT 2>/dev/null
|
|
;;
|
|
*)
|
|
echo "\nERROR: Unsupported Operatoring System - $(uname)"
|
|
echo "\n\t...EXITING...\n"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
#######################################################
|
|
|
|
function ping_nodes
|
|
{
|
|
#######################################################
|
|
#
|
|
# Ping the other systems check
|
|
#
|
|
# This can be disabled if you do not want every node to be pinging all of the
|
|
# other nodes. It is not necessary for all nodes to ping all other nodes.
|
|
# Although, you do want more than one node doing the pinging just in case
|
|
# the pinging node is down. To activate pinging the "$PINGNODES" variable
|
|
# must be set to "TRUE". Any other value will disable pinging from this node.
|
|
#
|
|
|
|
# set -x # Uncomment to debug this function
|
|
# set -n # Uncomment to check command syntax without any execution
|
|
|
|
if [ $PINGNODES = "TRUE" ]
|
|
then
|
|
echo # Add a single line to the output
|
|
|
|
# Loop through each node in the $PINGLIST
|
|
|
|
for HOSTPINGING in $PINGLIST # Spaces between nodes in the
|
|
# list is assumed
|
|
do
|
|
# Inform the user what is going On
|
|
|
|
echo "Pinging --> ${HOSTPINGING}...\c"
|
|
|
|
# If the pings received back is equal to "0" then you have a
|
|
# problem.
|
|
|
|
# Ping $PING_COUNT times, extract the value for the pings
|
|
# received back.
|
|
|
|
PINGSTAT=$(ping_host $HOSTPINGING | grep transmitted \
|
|
| awk '{print $4}')
|
|
|
|
# If the value of $PINGSTAT is NULL, then the node is
|
|
# unknown to this host
|
|
|
|
if [[ -z "$PINGSTAT" && "$PINGSTAT" = '' ]]
|
|
then
|
|
echo "Unknown host"
|
|
continue
|
|
fi
|
|
if (( $PINGSTAT == 0 ))
|
|
then # Let's do it again to make sure it really is reachable
|
|
|
|
echo "Unreachable...Trying one more time...\c"
|
|
sleep $INTERVAL
|
|
PINGSTAT2=$(ping_host $HOSTPINGING | grep transmitted \
|
|
| awk '{print $4}')
|
|
|
|
if [ $PINGSTAT2 -eq "0" ]
|
|
then # It REALLY IS unreachable...Notify!!
|
|
echo "Unreachable"
|
|
echo "Unable to ping $HOSTPINGING from $THISHOST" \
|
|
| tee -a $PING_OUTFILE
|
|
else
|
|
echo "OK"
|
|
fi
|
|
else
|
|
echo "OK"
|
|
fi
|
|
|
|
done
|
|
fi
|
|
}
|
|
|
|
######################################################
|
|
|
|
function send_notification
|
|
{
|
|
if [ -s $PING_OUTFILE -a "$MAILOUT" = "TRUE" ];
|
|
then
|
|
case $UNAME in
|
|
AIX|HP-UX|Linux|OpenBSD) SENDMAIL="/usr/sbin/sendmail"
|
|
;;
|
|
SunOS) SENDMAIL="/usr/lib/sendmail"
|
|
;;
|
|
esac
|
|
|
|
echo "\nSending email notification"
|
|
$SENDMAIL -f randy@$THISHOST $MAILLIST < $PING_OUTFILE
|
|
fi
|
|
}
|
|
|
|
##################################################
|
|
############ START of MAIN #######################
|
|
##################################################
|
|
|
|
|
|
ping_nodes
|
|
send_notification
|
|
|
|
|
|
# End of script
|