#!/bin/bash
# $Id: chkup,v 1.123 2025/10/15 11:15:12 fulford Exp $
# $Source: /src/admin/usr/local/etc/RCS/chkup,v $
# $Revision: 1.123 $
# Author C W Fulford.
# Copyright 2014 (c) C W Fulford.
# Licensed for public use under the LGPL, .
# For assistance contact fulford@fulford.net 0709 229 5385
########################################################################
cmd=`basename $0`
syntax="$cmd [-c config] [-d(ebug)] [-l] [-r <email_rcpts>] [-v(erbose)] clientid"
while [ $# -gt 0 ] ;do
case $1 in
-c) config=$2;shift 2;;
-d) debug=:;set -x;shift;;
-l) log=:;shift;;
-r) _rcpts=$2;shift 2;;
-v) verbose=:;shift;;
*) clientid=$1;shift;;
esac
done
if [ -z "$clientid" ];then
echo $syntax >&2;
exit 1
fi
config=${config:-"/usr/local/etc/chkup.cf"}
if [ ! -f $config ] ;then
echo "$cmd: $config not found">&2
fi
lock=/tmp/$cmd.$clientid.lock
tcfg=/tmp/$cmd.t$$
tmp=/var/tmp/$cmd$$
[ -f $lock ] && {
echo "$cmd: failed - $lock already set" >&2
exit 1
}
if [ -f $config ];then
if grep -e "^${clientid}:" $config >/dev/null ;then
sed -ne '/^'$clientid':/,/^$/{
/[\t ][^#]/p
}' <$config >$tcfg
. $tcfg
else
[ "$verbose" ] &&{
echo "$cmd: can't find client id \"$clientid\" in $config" >&2
echo "$cmd: using $clientid as host name.">&2
}
host=$clientid
fi
fi
_end () {
[ -f $tmp ] && rm $tmp
[ -f $tcfg ] && rm $tcfg
[ -f $lock ] && rm $lock
exit $rval
}
trap "_end" 15
if ! getent hosts $host>/dev/null;then
echo "$cmd: can't resolve $host" >&2
rval=1
_end
fi
[ -n "$_rcpts" -a -n "$rcpts" ] && $rcpts="$rcpts,$_rcpts"
rcpts=${rcpts:-`id -nu`}
_alert () { case $1 in
down) mailx -s "ALERT - $host port $ports down" $rcpts <$tmp ;;
fail) mailx -s "ALERT - $host port $ports still down, giving up" $rcpts <$tmp ;;
up) mailx -s "RECOVERED - $host port $ports" $rcpts <$tmp ;;
esac
[ "$log" ] && logger -t "$cmd:" "$host $ports $1"
}
_up () { if [ $# -eq 1 ];then
state=`awk -v p=$1 <$tmp '{split($1,a,"/");if(a[1] == p)print $2}'`
if [ "$state" = /open/ ];then
return $1
fi
else
state=`awk <$tmp '{if(/Host is up/){
print "up"
}else{
print "down"
}
}'`
if [ $state ~ "up" ];then
return 0
else
return 1
fi
fi
}
if [ $ports ];then
opt="-p$ports"
fi
nmap -Pn $opt $host > $tmp
c=0
max=10
for p in `echo $ports|sed -e 's/,/ /g'`;do
while ! _up $p && [ $c -lt $max ];do
echo "$host port $p down" >&2
[ ! -f $lock ] && _alert down
touch $lock
sleep $((c++ * 60))
nmap -Pn -$opt $host > $tmp
done
[ $verbose ] && {
if [ $p ];then
echo "$cmd: port $p available on $host." >&2
else
echo "$cmd: $host UP." >&2
fi
}
done
if [ -f $lock -a $c -eq $max ] ;then
#lock is only created if host was down
[ $verbose ] && echo "$cmd: $host down for 10 minutes! Giving up" >&2
_alert fail
rm $lock
rval=1
elif [ -f $lock ];then
[ $verbose ] && echo "$cmd: RECOVERED port $p on $host." >&2
_alert up
rval=0
else
rval=0
fi
_end
######################################################################
# This program is free software: you can redistribute it and or #
# modify it under the terms of the Lesser GNU General Public License #
# as published by the Free Software Foundation, either version 3 of #
# the License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# A copy of the Lesser GNU General Public License and the GNU #
# General Public License is available at #
# <http://www.gnu.org/licenses/>. #
######################################################################
######################################################################
# This program is free software: you can redistribute it and or #
# modify it under the terms of the Lesser GNU General Public License #
# as published by the Free Software Foundation, either version 3 of #
# the License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# A copy of the Lesser GNU General Public License and the GNU #
# General Public License is available at #
# <http://www.gnu.org/licenses/>. #
######################################################################
Copyright
© 2003-2017
Clifford W Fulford.
Fulford Consulting Ltd.
Regd. Co. 4250037 in England & Wales.
Regd. office 162, Edward Rd. Nottingham NG2 5GF, England, UK.
Related web sites: City Linux | Flare Support | West Bridgford | Fulford Portal | Joan Mary Fulford (Nottingham Writer) | Fulford Gallery | Amharic Interpreter | Arabic Interpreter | Tigrinya Interpreter
The layout and associated style sheets for this page are taken from the World Wide Web Consortium and used here under the W3C software licence.