From b11f0e174bc8450657c358a395f27a830dcad801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Thu, 24 Oct 2019 00:34:39 +0200 Subject: Use json for monitoring plugin --- modules/private/monitoring/default.nix | 2 +- modules/private/monitoring/plugins/send_nrdp.sh | 288 ++++-------------------- 2 files changed, 40 insertions(+), 250 deletions(-) (limited to 'modules/private') diff --git a/modules/private/monitoring/default.nix b/modules/private/monitoring/default.nix index d9805ef..902b2b1 100644 --- a/modules/private/monitoring/default.nix +++ b/modules/private/monitoring/default.nix @@ -8,7 +8,7 @@ let patchShebangs $out wrapProgram $out/check_command --prefix PATH : ${config.security.wrapperDir} wrapProgram $out/send_nrdp.sh --prefix PATH : ${lib.makeBinPath [ - pkgs.curl pkgs.which pkgs.coreutils + pkgs.curl pkgs.jq ]} wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [ pkgs.gnugrep pkgs.gawk pkgs.procps-ng diff --git a/modules/private/monitoring/plugins/send_nrdp.sh b/modules/private/monitoring/plugins/send_nrdp.sh index 27e47b4..c83c8cb 100755 --- a/modules/private/monitoring/plugins/send_nrdp.sh +++ b/modules/private/monitoring/plugins/send_nrdp.sh @@ -1,267 +1,57 @@ #!/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:///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 " " - echo " " - echo " " - echo " YOUR_HOSTNAME" - echo " 0" - echo " OK|perfdata=1.00;5;10;0" - echo " " - echo " " - echo " YOUR_HOSTNAME" - echo " YOUR_SERVICENAME" - echo " 0" - echo " OK|perfdata=1.00;5;10;0" - echo " " - echo " " - 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|.*\(.*\).*|\1|p'` - message=`echo $rslt | sed -n 's|.*\(.*\).*|\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 +TEMPLATE='{ + "cmd": "submitcheck", + "token": $token, + "checkresult": [{ + "hostname": $hostname, + "state": $state, + "output": $output, + "type": $type, + "servicename": $servicename + }] +}' + +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$service" - else - xml="$xml" - fi - - # urlencode XML special chars - output=${output//&/%26} - output=${output///%3E} - - xml="$xml$host$State" - 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 - ${arr[1]} - ${arr[0]} - ${arr[2]} - ${arr[3]}" - else - xml="$xml - ${arr[0]} - ${arr[1]} - ${arr[2]}" - fi - - xml="$xml" - 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" - 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" -- cgit v1.2.3