#!/bin/bash if [ -f /etc/portstatus.conf ]; then . /etc/portstatus.conf fi PSPATH=${PSPATH:-"/var/state/portstatus/"} ; if [ ! -d "$PSPATH" ]; then mkdir -p $PSPATH ; fi HOSTSFILE=${HOSTSFILE:-"/var/state/portstatus/hosts"} ; if [ ! -f "$HOSTSFILE" ]; then touch $HOSTSFILE ; fi HOSTWARNTIME=${HOSTWARNTIME:-"0 0 5 0"} SERVICEWARNTIME=${SERVICEWARNTIME:-"0 0 5 0"} WARNEMAIL=${WARNEMAIL:-"root@localhost"} mtimeof () { #parameter is a file, returns space separated days, hours, minutes and seconds of modification time. #${ONENET%%/*} = stuff before / , ${ONENET##*/} = stuff after / #Modify: Fri Feb 25 22:51:45 2000(00000.00:30:08) if [ -d "$1" ] || [ -f "$1" ]; then STATLINE=`stat $1 2>/dev/null | grep '^Modify'` # | sed -e 's/.*(//' -e 's/)//' STATLINE=${STATLINE##*(} #Keep stuff after ( STATLINE=${STATLINE%%)*} #Keep stuff before ), i.e. drop last paren #echo STATLINE=$STATLINE MDAYS=${STATLINE%%.*} ; STATLINE=${STATLINE##*.} MHOURS=${STATLINE%%:*} ; STATLINE=${STATLINE#*:} MMINUTES=${STATLINE%%:*} #No need to do any more with STATLINE from here on. MSECONDS=${STATLINE#*:} #echo $MDAYS days, $MHOURS hours, $MMINUTES minutes, $MSECONDS seconds. echo $MDAYS $MHOURS $MMINUTES $MSECONDS else echo "99999 99 99 99" fi } timelt () { #parameters are two times: days1 hours1 minutes1 seconds1 days2 hours2 minutes2 seconds2 if [ $1 -lt $5 ]; then return 0 #True elif [ $1 -gt $5 ]; then return 1 #False fi if [ $2 -lt $6 ]; then return 0 #True elif [ $2 -gt $6 ]; then return 1 #False fi if [ $3 -lt $7 ]; then return 0 #True elif [ $3 -gt $7 ]; then return 1 #False fi if [ $4 -lt $8 ]; then return 0 #True elif [ $4 -gt $8 ]; then return 1 #False fi return 1 #False (they're equal) } clear for ONEIP in `cat $HOSTSFILE | grep '##' | sed -e 's/#.*//' | awk '{print $1}'` ; do HOSTSTATUS='' SERVICESTATUS='' HOSTLINE=`egrep "^$ONEIP[^0-9]" $HOSTSFILE | tail --lines=1` HOSTNAME=`echo $HOSTLINE | sed -e 's/#.*//' | awk '{print $2}'` HOSTNAME=${HOSTNAME:-$ONEIP} #FIXME - extra comments after services? CHECKSERVICES=`echo $HOSTLINE | sed -e 's/.*##//' -e 's/,/ /'` HOSTTIME=`mtimeof $PSPATH/$ONEIP/HOST-REACHABLE` echo $HOSTNAME - $HOSTTIME #check host reachable, whine if not, check services if so. if ! timelt $HOSTTIME $HOSTWARNTIME ; then HOSTSTATUS="unreachable for $HOSTTIME" else for SERVICE in $CHECKSERVICES ; do MTIME=`mtimeof $PSPATH/$ONEIP/$SERVICE` if ! timelt $MTIME $SERVICEWARNTIME ; then #If more than 5 minutes since last connect then SERVICESTATUS="$SERVICESTATUS $SERVICE($MTIME)" echo -e "\t$SERVICE\t$MTIME" ; echo -n -e "\a" fi done fi if [ -n "$HOSTSTATUS$SERVICESTATUS" ]; then if [ -n "$SERVICESTATUS" ]; then SERVICESTATUS="services:$SERVICESTATUS down" fi mail -s "$HOSTNAME $HOSTSTATUS $SERVICESTATUS" $WARNEMAIL /dev/null fi done #echo -n -e "\a"