#!/bin/bash # ====================================================================== # # Check DNS response time # requirements: # - netstat # # ---------------------------------------------------------------------- # 2020-06-17 v1.0 <axel.hahn@iml.unibe.ch> # 2021-11-12 v1.1 <axel.hahn@iml.unibe.ch> check fqd instead of fixed value # test tcp 53 first # check result depends on 1st nameserver only # ====================================================================== . `dirname $0`/inc_pluginfunctions tmpfile=/tmp/check_netstat_out_$$ infofile=/tmp/check_netstat_out_2_$$ myHost=$( hostname -f ) echo $myHost | cut -f 3- -d "." | grep "\." >/dev/null if [ $? -ne 0 ]; then ph.setStatus unknown ph.status "DNS check for [$myHost] - SKIP: hostname -f returned a FQDN with less than 2 dots" ph.exit fi # set default / override from command line params typeset -i iWarnLimit=` ph.getValueWithParam 300 w "$@"` typeset -i iCriticalLimit=` ph.getValueWithParam 1000 c "$@"` rm -f $tmpfile $infofile 2>/dev/null typeset -i iMax=0 typeset -i iTime=0 typeset -i iCounter=0 typeset -i iNotReachable=0 # ---------------------------------------------------------------------- # MAIN # ---------------------------------------------------------------------- # --- check param -h if [ "$1" = "-h" ]; then echo " usage: $0 [ -w value -c value -h ] -w Warning level -c Critical level -h this help " exit 0 fi for mydns in `grep ^nameserver /etc/resolv.conf | awk '{ print $2 } ' ` do iCounter=$iCounter+1 typeset -i iSrvMax=0 echo "" >>$infofile echo "---------- $iCounter - $mydns " >>$infofile # todo loop >/dev/tcp/${mydns}/53 >>$infofile 2>&1 if [ $? -ne 0 ]; then iNotReachable=$iNotReachable+1 test $iCounter -eq 1 && ph.setStatus critical echo "ERROR: ${mydns} is not reachable on tcp 53" >>$infofile else for i in `seq 5` do (time nslookup ${myHost} $mydns) >$tmpfile 2>&1 iTime=`cat $tmpfile | grep "^real.*m.*\..*s" | cut -f 2 -d "m" | sed "s#[\.s]##g" | sed "s#^0*##g" ` echo "$mydns #$i >>> $iTime ms" >>$infofile test $iTime -ge $iWarnLimit && cat $tmpfile | grep -vE "^(real|user|sys)" >> $infofile test $iTime -gt $iSrvMax && iSrvMax=$iTime done echo "max: $iSrvMax ms" >>$infofile # --- set status test $iCounter -eq 1 && ph.setStatusByLimit $iSrvMax $iWarnLimit $iCriticalLimit label=`echo $mydns | sed "s#\.#-#g" ` ph.perfadd "response-$label" "${iSrvMax}" test $iSrvMax -gt $iMax && iMax=$iSrvMax fi test $iCounter -eq 1 && (echo " ^"; echo " |"; echo " +--- 1st nameserver is relevant for total status of the check. Limits are warning=$iWarnLimit and critical=$iCriticalLimit") >>$infofile echo "" >>$infofile done ph.status "DNS check for $myHost - found maximum was $iMax ms - $iNotReachable of $iCounter nameservers not reachable" cat $infofile rm -f $tmpfile $infofile ph.exit # ----------------------------------------------------------------------