]> git.immae.eu Git - perso/Immae/Projets/Puppet.git/commitdiff
Use json for send_nrdp
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Wed, 23 Oct 2019 22:01:47 +0000 (00:01 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Wed, 23 Oct 2019 22:01:47 +0000 (00:01 +0200)
modules/profile/templates/monitoring/send_nrdp.sh.erb

index 41f58e5c5f40ba767bbc33db0a8e99c56a871deb..0e3890881cf7c9d84d1f453ee1b2c6bda739f37a 100755 (executable)
 #!/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
 
+TEMPLATE='{
+  "cmd": "submitcheck",
+  "token": $token,
+  "checkresult": [{
+    "hostname": $hostname,
+    "state": $state,
+    "output": $output,
+    "type": $type,
+    "servicename": $servicename
+  }]
+}'
 
-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
-}
-
-# Parse parameters
 url="<%= @naemon_url %>"
 token="<%= @naemon_token %>"
-
-while getopts "u:t:H:s:S:o:f:d:c:D:hv" option
+while getopts "u:t:H:s:S:o:" option
 do
   case $option in
     u) url=$OPTARG ;;
     t) token=$OPTARG ;;
-    H) host=$OPTARG ;;
-    s) service=$OPTARG ;;
-    S) State=$OPTARG ;;
+    H) hostname=$OPTARG ;;
+    s) servicename=$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"`
+if [ -n "$servicename" ]; then
+  checktype="service"
+else
+  checktype="host"
 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
+payload=$(jq -n \
+   --arg type "$checktype" \
+   --arg hostname "$hostname" \
+   --arg servicename "$servicename" \
+   --arg output "$output" \
+   --arg token "$token" \
+   --arg state "$state" \
+   "$TEMPLATE")
 
-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
+rslt=$(curl -f --silent --insecure -d "$payload" -H "Content-Type: application/json" "$url")
+ret=$?
 
-if [ $file ]; then
-    xml=`cat $file`
-    send_data "$xml"
+if [ $ret != 0 ];then
+  echo "ERROR: could not connect to NRDP server at $url"
+  exit 1
 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
+status=$(echo "$rslt" | jq -r .status)
+message=$(echo "$rslt" | jq -r .message)
 
-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"
+if [ "$status" != "ok" ];then
+  echo "ERROR: The NRDP Server said $message"
+  exit 2
 fi
+echo "Sent 1 checks to $url"