#!/bin/sh
#
# getping.cgi - ping servers and produce a html report. Unix/Linux.
#
# 24-Jul-2004	ver 1.10
#
# USAGE: Configure your webserver to trigger this as a CGI.
#
# Configuration is through variables in this script. By default it pings 
# servers found in /etc/hosts, which can be changed to an explicit list 
# in the "hostlist" variable, or to a file containing a text list of
# hosts by updating the "hostfile" variable. (hostfile is easiest).
# 
# The website is colour coded, and is generated by some lines of shell code.
# The HTML can be customised to taste, by editing the subroutines.
#
# Standard Disclaimer: this is freeware, use at your own risk.
#
# 25-Jun-2003	Brendan Gregg	Created this.


#
# --- Config Variables ---
#

# hostlist - hosts to ping, eg hostlist="venus earth mars"
#
hostlist=""

# hostfile - text file which is a list of hosts to ping, eg hostfile="prod.txt"
#
hostfile=""

ping=/usr/sbin/ping	# Location of ping
hostsdb=/etc/hosts	# System hosts file, default hosts to ping
timeout=5		# Default ping timeout, seconds
PATH=/bin:$PATH


#
# --- Subroutines ---
#

# htmlhead - print HTML header.
#
htmlhead() {
	echo "Content-type: text/html\n
<HTML><HEAD><TITLE>Get Ping</TITLE></HEAD>
	<BODY bgcolor=\"white\"><H3>Ping began at `date`</H3>
	<H3>"
}

# htmltail - print HTML footer.
#
htmltail() {
	echo "</H3></FONT><H3>Completed at `date`</H3></BODY></HTML>"
}

# ping2html - process the output of ping to be in HTML.
#
ping2html() {
	sed 's/.*no answer.*/<FONT COLOR="#FF0000"> \&nbsp; &<\/FONT>/
	     s/.*is alive.*/<FONT COLOR="#00AA00"> \&nbsp; &<\/FONT>/
	     s/.*unknown host.*/<FONT COLOR="#0000AA"> \&nbsp; &<\/FONT>/
	     s/$/<BR>/'
}
# Note: The HTML choosen here is fairly basic. An improvement that may spring
# to mind is to add a table for the results - however this stops some browsers
# drawing partial results.


#
# --- Check ping exists ---
#
if [ ! -x $ping ]
then
	ping=/bin/ping
	if [ ! -x $ping ]; then
		echo >&2 "ERROR1: Can't find ping. See script line 77."
		exit 1
	fi
fi


#
# --- Fetch hosts to ping ---
#
if [ "$hostfile" != "" ]; then
	if [ ! -r $hostfile ]; then
	   echo >&2 "ERROR2: $hostfile, is not readable."
	   exit 2
	fi
	hosts=`cat $hostfile` 		# Use hostfile for list of hosts
fi

if [ "$hostlist" != "" ]; then		# hostlist gets preference
	hosts="$hostlist"		# ("if" is easier to follow than
fi					#  Bourne parameter substitution)

if [ "$hosts" = "" ]; then		# if unset, fetch hosts from default
	if [ ! -r "$hostsdb" ]; then
		echo >&2 "ERROR3: $hostsdb, is not readable."
		exit 2
	fi
	hosts=`awk '/^[0-9]/ { print $1 }' $hostsdb`
fi


#
# --- MAIN - Ping hosts, make website ---
#
htmlhead

for host in $hosts
do
	echo "$host,<BR> "
	$ping $host $timeout 2>&1 | ping2html
done 

htmltail
