blob: 41f58e5c5f40ba767bbc33db0a8e99c56a871deb (
plain) (
tree)
|
|
#!/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
}
# Parse parameters
url="<%= @naemon_url %>"
token="<%= @naemon_token %>"
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
|