From 7b1304e3b17b0d514fe0889b0e3775768268a706 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sun, 13 Dec 2009 23:13:46 +0100 Subject: [PATCH] Enhance nagcollect to actually detect data nagcollect now executes test scripts and submits the result to the NagCollect webservice. The only test script implemented at the moment is "Sys-Load.tst" which tests the system load. In addition, nagcollect is able to download new or updated test scripts from the NagCollect webservice server. --- Makefile | 23 +++++++++--- client/bin/nagcollect | 75 +++++++++++++++++++++++++++++++++----- client/etc/nagcollect.conf | 14 +++++++ client/lib/Sys-Load.tst | 22 +++++++++++ 4 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 client/etc/nagcollect.conf create mode 100644 client/lib/Sys-Load.tst diff --git a/Makefile b/Makefile index cbf982c..c757d38 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,7 @@ install: install-all: install-server install-client install-server: - install -d -o nagios -g nagios -m 750 \ - /var/lib/nagios3/collect + install -d -o nagios -g nagios -m 750 /var/lib/nagios3/collect [ -r /etc/nagios3/system.cfg ] || \ install -D -o nagios -g root -m 640 -p \ server/etc/system.cfg /etc/nagios3/system.cfg @@ -28,11 +27,25 @@ install-server: server/web/nagcollect.php /var/www/nagcollect.php install-client: - install -d -o 0 -g 0 -m 755 \ - /usr/local/sbin + install -d -o 0 -g 0 -m 755 /usr/local/sbin install -c -o 0 -g 0 -m 755 -p \ client/bin/nagcollect /usr/local/sbin/nagcollect + install -d -o 0 -g 0 -m 755 /usr/local/etc + [ -r /usr/local/etc/nagcollect.conf ] || \ + install -o 0 -g 0 -m 600 -p \ + client/etc/nagcollect.conf /usr/local/etc/nagcollect.conf + install -d -o 0 -g 0 -m 755 /usr/local/lib/nagcollect + (cd client/lib; find . -name '*.tst' | \ + while read x; do \ + install -d -o 0 -g 0 -m 755 `dirname "/usr/local/lib/nagcollect/$$x"`; \ + install -o 0 -g 0 -m 644 "$$x" "/usr/local/lib/nagcollect/$$x"; \ + done \ + ) -.PHONY: all install-server install-client +nagcollecttestscripts: + tar -czvf nagcollecttestscripts.tgz -C client/lib . + +.PHONY: all install install-all install-server install-client \ + nagcollecttestscripts # -eof- diff --git a/client/bin/nagcollect b/client/bin/nagcollect index 1f845c7..6602c5a 100755 --- a/client/bin/nagcollect +++ b/client/bin/nagcollect @@ -4,17 +4,74 @@ # Copyright (c)2009 Alexander Barton, alex@barton.de # -if [ "$1" = "--help" -o "$1" = "-h" -o $# -lt 5 -o $# -gt 6 ]; then - echo "Usage: $0 []" +NAME=`basename "$0"` +MAXTIME=300 + +function Msg() +{ + echo $* +} + +function Error() +{ + logger -t "$NAME" "$*" + echo $* exit 1 +} + +function refreshTestScripts() +{ + tmp=`mktemp /tmp/nagcollect.XXXXXX` + Msg "Downloading scripts from ${SERVER_URL} ..." + curl --insecure --fail --output "$tmp" --silent --max-time $MAXTIME \ + "${SERVER_URL}/nagcollecttestscripts.tgz" ; r=$? + if [ $r -eq 0 ]; then + # Update local test scripts + Msg "Extracting scripts ..." + mkdir -p /usr/local/lib/nagcollect + tar xzf "$tmp" -C /usr/local/lib/nagcollect ; r=$? + fi + rm -f "$tmp" + return $r +} + +function submitService() +{ + curl --insecure --fail --output /dev/null --silent --max-time $MAXTIME \ + --data-urlencode "key=$CLIENT_KEY" \ + --data-urlencode "host=$CLIENT_ID" \ + --data-urlencode "service=$1" \ + --data-urlencode "status=$2" \ + --data-urlencode "text=$3" \ + "${SERVER_URL}/nagcollect.php" ; r=$? + return $r +} + +[ -r "/usr/local/etc/nagcollect.conf" ] && . /usr/local/etc/nagcollect.conf +[ -r "/etc/nagcollect.conf" ] && . /etc/nagcollect.conf + +[ -n "$SERVER_URL" -a -n "$CLIENT_KEY" -a -n "$CLIENT_ID" ] || \ + Error "Configuration invalid, check SERVER_URL, CLIENT_KEY and CLIENT_ID variables!" + +if [ "$AUTOUPDATE" = 1 ]; then + Msg "Updating local test scripts:" + refreshTestScripts || \ + Error "Failed to refresh test scripts from \"$SERVER_URL\" ($?)!" fi -curl --insecure --include \ - --data-urlencode "key=$2" \ - --data-urlencode "host=$3" \ - --data-urlencode "status=$4" \ - --data-urlencode "service=$5" \ - --data-urlencode "text=$6" \ - "$1" +Msg "Running test scripts:" + +ls -1 \ + /usr/local/lib/nagcollect/*.tst \ + /usr/local/lib/nagcollect/`uname`/*.tst \ + 2>/dev/null | while read tst; do + [ -r "$tst" ] || continue + SERVICE=""; STATUS=""; TEXT="" + Msg "Checking \"$tst\" ..." + . "$tst" + [ -n "$SERVICE" -a -n "$STATUS" ] || continue + submitService "$SERVICE" "$STATUS" "$TEXT" + Msg "RESULT: $SERVICE=$STATUS \"$TEXT\" ($?)" +done # -eof- diff --git a/client/etc/nagcollect.conf b/client/etc/nagcollect.conf new file mode 100644 index 0000000..8dcedd7 --- /dev/null +++ b/client/etc/nagcollect.conf @@ -0,0 +1,14 @@ +# [/usr/local]/etc/nagcollect.conf +# Configuration file read by NagCollect tools + +# HTTP[s] URL of the NagCollect server, including the trailing '/': +SERVER_URL="" + +# Client key as configured on the server +CLIENT_KEY="" + +# Client ID to use in Nagios, must be unique! +CLIENT_ID="" + +# Auto-update local test scripts? [1=yes] +AUTOUPDATE=1 diff --git a/client/lib/Sys-Load.tst b/client/lib/Sys-Load.tst new file mode 100644 index 0000000..c731f4b --- /dev/null +++ b/client/lib/Sys-Load.tst @@ -0,0 +1,22 @@ +# NagCollect -- Nagios Data Collector for Passive Checks +# Copyright (c)2009 Alexander Barton, alex@barton.de + +SERVICE="Sys-Load_p" + +uptime=`LC_ALL=C uptime` +load=${uptime##*:} + +load01=`echo $load | cut -d' ' -f1 | cut -d'.' -f1` +load05=`echo $load | cut -d' ' -f2 | cut -d'.' -f1` +load15=`echo $load | cut -d' ' -f3 | cut -d'.' -f1` + +if [ $load01 -ge 8 -o $load05 -ge 6 -o $load15 -ge 3 ]; then + STATUS=2 + TEXT="ERROR - Load average: $load" +elif [ $load01 -ge 4 -o $load05 -ge 3 -o $load15 -ge 1 ]; then + STATUS=1 + TEXT="WARNING - Load average: $load" +else + STATUS=0 + TEXT="OK - Load average: $load" +fi \ No newline at end of file -- 2.39.2