From c09c239625cfb8364d0e06052ba7b0d7ebe9d861 Mon Sep 17 00:00:00 2001 From: "Hahn Axel (hahn)" <axel.hahn@iml.unibe.ch> Date: Fri, 12 Nov 2021 13:48:04 +0100 Subject: [PATCH] update dns response time check --- check_dns_responsetime | 82 ++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/check_dns_responsetime b/check_dns_responsetime index 10cb136..deee32e 100755 --- a/check_dns_responsetime +++ b/check_dns_responsetime @@ -7,14 +7,35 @@ # # ---------------------------------------------------------------------- # 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=www.unibe.ch +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 @@ -33,44 +54,45 @@ if [ "$1" = "-h" ]; then exit 0 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 - for mydns in `grep ^nameserver /etc/resolv.conf | awk '{ print $2 } ' ` do + iCounter=$iCounter+1 typeset -i iSrvMax=0 echo "" >>$infofile - # echo "---------- `date` $mydns " >>$infofile + echo "---------- $iCounter - $mydns " >>$infofile # todo loop - for i in `seq 5` - do - # echo "" >>$infofile - # echo "---------- `date` -- $mydns - $i" >>$infofile - (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 >> $infofile - - test $iTime -gt $iSrvMax && iSrvMax=$iTime - done - - label=`echo $mydns | sed "s#\.#-#g" ` - ph.perfadd "response-$label" "${iSrvMax}" - test $iSrvMax -gt $iMax && iMax=$iSrvMax + >/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 -# --- set status -ph.setStatusByLimit $iMax $iWarnLimit $iCriticalLimit -ph.status "DNS check - found maximum was $iMax ms" +ph.status "DNS check for $myHost - found maximum was $iMax ms - $iNotReachable of $iCounter nameservers not reachable" cat $infofile rm -f $tmpfile $infofile -- GitLab