]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - modules/private/monitoring/plugins/send_nrdp.sh
Add monitoring modules via naemon
[perso/Immae/Config/Nix.git] / modules / private / monitoring / plugins / send_nrdp.sh
diff --git a/modules/private/monitoring/plugins/send_nrdp.sh b/modules/private/monitoring/plugins/send_nrdp.sh
new file mode 100755 (executable)
index 0000000..27e47b4
--- /dev/null
@@ -0,0 +1,267 @@
+#!/bin/bash
+#
+# check_nrdp.sh
+#
+# Copyright (c) 2010-2017 - Nagios Enterprises, LLC.
+# Written by: Scott Wilkerson (nagios@nagios.org)
+#
+# 2017-09-25 Troy Lea aka BOX293
+#  - Fixed script not working with arguments when run as a cron job
+#    or if being used as a nagios command like obsessive compulsive.
+#     ... "if [ ! -t 0 ]" was the reason why.
+# 2017-12-08 Jørgen van der Meulen (Conclusion Xforce)
+#  - Fixed typo in NRDP abbreviation
+
+
+PROGNAME=$(basename $0)
+RELEASE="Revision 0.6.1"
+
+print_release() {
+    echo "$RELEASE"
+}
+
+print_usage() {
+    echo ""
+    echo "$PROGNAME $RELEASE - Send NRDP script for Nagios"
+    echo ""
+    echo "Usage: send_nrdp.sh -u URL -t token [options]"
+    echo ""
+    echo "Usage: $PROGNAME -h display help"
+    echo ""
+}
+
+print_help() {
+        print_usage
+        echo ""
+        echo "This script is used to send NRDP data to a Nagios server"
+        echo ""
+        echo "Required:"
+        echo "    -u","    URL of NRDP server.  Usually http://<IP_ADDRESS>/nrdp/"
+        echo "    -t","    Shared token.  Must be the same token set in NRDP Server"
+        echo ""
+        echo "Options:"
+        echo "    Single Check:"
+        echo "        -H    host name"
+        echo "        -s    service name"
+        echo "        -S    State"
+        echo "        -o     output"
+        echo ""
+        echo "    STDIN:"
+        echo "        [-d    delimiter] (default -d \"\\t\")"
+        echo "        With only the required parameters $PROGNAME is capable of"
+        echo "        processing data piped to it either from a file or other"
+        echo "        process.  By default, we use \t as the delimiter however this"
+        echo "        may be specified with the -d option data should be in the"
+        echo "        following formats one entry per line."
+        echo "        For Host checks:"
+        echo "        hostname    State    output"
+        echo "        For Service checks"
+        echo "        hostname    servicename    State    output"
+        echo ""
+        echo "    File:"
+        echo "        -f /full/path/to/file"
+        echo "        This file will be sent to the NRDP server specified in -u"
+        echo "        The file should be an XML file in the following format"
+        echo "        ##################################################"
+        echo ""
+        echo "        <?xml version='1.0'?>"
+        echo "        <checkresults>"
+        echo "          <checkresult type=\"host\" checktype=\"1\">"
+        echo "            <hostname>YOUR_HOSTNAME</hostname>"
+        echo "            <state>0</state>"
+        echo "            <output>OK|perfdata=1.00;5;10;0</output>"
+        echo "          </checkresult>"
+        echo "          <checkresult type=\"service\" checktype=\"1\">"
+        echo "            <hostname>YOUR_HOSTNAME</hostname>"
+        echo "            <servicename>YOUR_SERVICENAME</servicename>"
+        echo "            <state>0</state>"
+        echo "            <output>OK|perfdata=1.00;5;10;0</output>"
+        echo "          </checkresult>"
+        echo "        </checkresults>"
+        echo "        ##################################################"
+        echo ""
+        echo "    Directory:"
+        echo "        -D /path/to/temp/dir"
+        echo "        This is a directory that contains XML files in the format"
+        echo "        above.  Additionally, if the -d flag is specified, $PROGNAME"
+        echo "        will create temp files here if the server could not be reached."
+        echo "        On additional calls with the same -D path, if a connection to"
+        echo "        the server is successful, all temp files will be sent."
+        exit 0
+}
+
+send_data() {
+    pdata="token=$token&cmd=submitcheck"
+    if [ $file ]; then
+        fdata="--data-urlencode XMLDATA@$file"
+        rslt=`curl -f --silent --insecure -d "$pdata" $fdata "$url/"`
+    else
+        pdata="$pdata&XMLDATA=$1"
+        rslt=`curl -f --silent --insecure -d "$pdata" "$url/"`
+    fi
+    
+    ret=$?
+
+    status=`echo $rslt | sed -n 's|.*<status>\(.*\)</status>.*|\1|p'`
+    message=`echo $rslt | sed -n 's|.*<message>\(.*\)</message>.*|\1|p'`
+    if [ $ret != 0 ];then
+        echo "ERROR: could not connect to NRDP server at $url"
+        # verify we are not processing the directory already and then write to the directory
+        if [ ! "$2" ] && [ $directory ];then
+            if [ ! -d "$directory" ];then
+                mkdir -p "$directory"
+            fi
+            # This is where we write to the tmp directory
+            echo $xml > `mktemp $directory/nrdp.XXXXXX`
+        fi
+        exit 1
+    fi
+    
+    if [ "$status" != "0" ];then
+        # This means we couldn't connect to NRPD server
+        echo "ERROR: The NRDP Server said $message"
+        # verify we are not processing the directory already and then write to the directory
+        if [ ! "$2" ] && [ $directory ];then
+            if [ ! -d "$directory" ];then
+                mkdir -p "$directory"
+            fi
+            # This is where we write to the tmp directory
+            echo $xml > `mktemp $directory/nrdp.XXXXXX`
+        fi
+        
+        exit 2
+    fi
+    
+    # If this was a directory call and was successful, remove the file
+    if [ $2 ] && [ "$status" == "0" ];then
+        rm -f "$2"
+    fi
+
+    # If we weren't successful error
+    if [ $ret != 0 ];then
+        echo "exited with error "$ret
+        exit $ret
+    fi
+}
+
+while getopts "u:t:H:s:S:o:f:d:c:D:hv" option
+do
+  case $option in
+    u) url=$OPTARG ;;
+    t) token=$OPTARG ;;
+    H) host=$OPTARG ;;
+    s) service=$OPTARG ;;
+    S) State=$OPTARG ;;
+    o) output=$OPTARG ;;
+    f) file=$OPTARG ;;
+    d) delim=$OPTARG ;;
+    c) checktype=$OPTARG ;;
+    D) directory=$OPTARG ;;
+    h) print_help 0;;
+    v) print_release
+        exit 0 ;;
+  esac
+done
+
+if [ ! $checktype ]; then
+ checktype=1
+fi
+if [ ! $delim ]; then
+ delim=`echo -e "\t"`
+fi
+
+if [ "x$url" == "x" -o "x$token" == "x" ]
+then
+  echo "Usage: send_nrdp -u url -t token"
+  exit 1
+fi
+# detecting curl 
+if [[ `which curl` =~ "/curl" ]]
+ then curl=1; 
+fi
+
+if [[ ! $curl ]];
+then
+  echo "Either curl or wget are required to run $PROGNAME"
+  exit 1
+fi
+
+checkcount=0
+
+if [ $host ]; then
+    xml=""
+    # we are not getting piped results
+    if [ "$host" == "" ] || [ "$State" == "" ]; then
+        echo "You must provide a host -H and State -S"
+        exit 2
+    fi
+    if [ "$service" != "" ]; then
+        xml="$xml<checkresult type='service' checktype='$checktype'><servicename>$service</servicename>"
+    else
+        xml="$xml<checkresult type='host' checktype='$checktype'>"
+    fi
+    
+    # urlencode XML special chars
+    output=${output//&/%26}
+    output=${output//</%3C}
+    output=${output//>/%3E}
+    
+    xml="$xml<hostname>$host</hostname><state>$State</state><output><![CDATA["$output"]]></output></checkresult>"
+    checkcount=1
+fi
+
+ # If only url and token have been provided then it is assumed that data is being piped
+########################
+if [[ ! $host && ! $State && ! $file && ! $directory ]]; then
+    xml=""
+    # we know we are being piped results
+    IFS=$delim
+    
+    while read -r line ; do
+        arr=($line)
+        if [ ${#arr[@]} != 0 ];then
+            if [[ ${#arr[@]} < 3 ]] || [[ ${#arr[@]} > 4 ]];then
+                echo "ERROR: STDIN must be either 3 or 4 fields long, I found "${#arr[@]}
+            else
+                if [ ${#arr[@]} == 4 ]; then
+                    xml="$xml<checkresult type='service' checktype='$checktype'>
+                    <servicename>${arr[1]}</servicename>
+                    <hostname>${arr[0]}</hostname>
+                    <state>${arr[2]}</state>
+                    <output>${arr[3]}</output>"
+                else
+                    xml="$xml<checkresult type='host' checktype='$checktype'>
+                    <hostname>${arr[0]}</hostname>
+                    <state>${arr[1]}</state>
+                    <output>${arr[2]}</output>"
+                fi
+                
+                xml="$xml</checkresult>"
+                checkcount=$[checkcount+1]
+            fi
+        fi
+    done
+    IFS=" "
+fi
+
+if [ $file ]; then
+    xml=`cat $file`
+    send_data "$xml"
+fi
+
+if [ $directory ]; then
+    #echo "Processing directory..."
+    for f in `ls $directory`
+    do
+      #echo "Processing $f file..."
+      # take action on each file. $f store current file name
+      xml=`cat $directory/$f`
+      send_data "$xml" "$directory/$f"
+    done
+fi
+
+if [ "x$file" == "x" ] && [ "x$directory" == "x" ]; then
+    xml="<?xml version='1.0'?><checkresults>$xml</checkresults>"
+    send_data "$xml"
+    echo "Sent $checkcount checks to $url"
+fi