nagios: add check_rdns
[shutils.git] / nagios / plugins / check_rdns
diff --git a/nagios/plugins/check_rdns b/nagios/plugins/check_rdns
new file mode 100755 (executable)
index 0000000..5310cb5
--- /dev/null
@@ -0,0 +1,141 @@
+#!/bin/sh
+
+# Copyright (c) 2013 Stefan Huber <shuber@sthu.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+. $(dirname $0)/utils.sh
+
+
+PROGNAME=$(basename $0)
+REVISION="0.1"
+
+usage() {
+
+    cat <<EOF
+check_rdns v$REVISION
+Copyright (c) 2013 Stefan Huber <shuber@sthu.org>
+    
+Usage: $PROGNAME -H ip-address [OPTIONS]
+
+Arguments:
+    -H, --address IP-address    The ip-addres on which reverse-DNS is performed.
+
+Options:
+    -h, --help                  Print this text.
+    -a, --expect=HOST           The expected result.
+    -s, --server=HOST           The DNS server to contact.
+    -t, --timeout=SEC           Seconds before lookup times out. (Default: 10)
+    -w, --warning=MSEC          Return warning if lookup time exceeds value.
+    -c, --critical=MSEC         Return critical if lookup time exceeds value.
+    -V, --version               Print version info.
+EOF
+}
+
+
+TEMP=`getopt -o "H:a:c:hs:t:w:V" --long "help,address:,expect:,critical:,server:,timeout:,warning:,version" -n "$0" -- "$@"`
+eval set - "$TEMP"
+
+ADDRESS=
+EXPECT=
+SERVER=
+TIMEOUT=10
+WARNING=
+CRITICAL=
+
+while true; do
+    case "$1" in
+        -h | --help )
+            usage
+            exit $STATE_OK ;;
+        -V | --version )
+            echo "$PROGNAME v$REVISION"
+            exit $STATE_OK ;;
+        -H | --address )
+            ADDRESS="$2"; shift 2 ;;
+        -a | --expect )
+            EXPECT="$2"; shift 2 ;;
+        -s | --server )
+            SERVER="$2"; shift 2 ;;
+        -t | --timeout )
+            TIMEOUT="$2"; shift 2 ;;
+        -w | --warning )
+            WARNING="$2"; shift 2 ;;
+        -c | --critical )
+            CRITICAL="$2"; shift 2 ;;
+        -- | *)
+            break ;;
+    esac
+done
+
+if [ -z "$ADDRESS" ]; then
+    echo "Error: No address given."
+    usage
+    exit $STATE_CRITICAL
+fi
+
+DIGOPTS="+time=$TIMEOUT +noquestion +noauthority -t PTR"
+[ -z "$SERVER" ] || DIGOPTS="@$SERVER $DIGOPTS"
+
+RESULT=$(dig $DIGOPTS -x "$ADDRESS"):
+DIGSTATUS=$?
+
+if [ $DIGSTATUS != "0" ]; then
+    echo "DNS failed: dig exit code $DIGSTATUS |"
+    exit $STATUS_CRITICAL
+fi
+
+# Get the actual result
+HOST=$(echo "$RESULT" | grep -m 1 -o "[[:space:]]IN[[:space:]]*PTR[[:space:]].*\.$" | awk '{ print $3 }' )
+if [ -z "$HOST" ]; then
+    echo "DNS failed: reverse DNS gave no answer. |"
+    exit $STATUS_CRITICAL
+fi
+
+
+# Get the query time in msec
+QUERYTIME=$(echo "$RESULT" | grep -m 1 "Query time:" | cut -d ":" -f 2 | awk '{ print $1 }')
+
+
+MATCHED=
+if [ -n "$EXPECT" ]; then
+    if [ "$EXPECT" != "$HOST" ]; then
+        echo "DNS critical - query result \"$HOST\" != \"$EXPECT\", query time: $QUERYTIME msec |"
+        exit $STATUS_CRITICAL
+    else
+        MATCHED=" (match ok)"
+    fi
+fi
+
+if [ -n "$CRITICAL" ] && [ "$QUERYTIME" -gt "$CRITICAL" ]; then
+    echo "DNS critical - query time $QUERYTIME msec too large ($CRITICAL msec), query result: \"$HOST\"$MATCHED |"
+    exit $STATUS_CRITICAL
+fi
+
+if [ -n "$WARNING" ] && [ "$QUERYTIME" -gt "$WARNING" ]; then
+    echo "DNS warning - query time $QUERYTIME msec too large ($WARNING msec), query result: \"$HOST\"$MATCHED |"
+    exit $STATUS_WARNING
+fi
+
+echo "DNS ok - query time $QUERYTIME msec, query result: \"$HOST\"$MATCHED |"
+exit $STATUS_OK
+