Enhance nagcollect to actually detect data
authorAlexander Barton <alex@barton.de>
Sun, 13 Dec 2009 22:13:46 +0000 (23:13 +0100)
committerAlexander Barton <alex@barton.de>
Sun, 13 Dec 2009 22:13:46 +0000 (23:13 +0100)
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
client/bin/nagcollect
client/etc/nagcollect.conf [new file with mode: 0644]
client/lib/Sys-Load.tst [new file with mode: 0644]

index cbf982c..c757d38 100644 (file)
--- 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-
index 1f845c7..6602c5a 100755 (executable)
@@ -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 <server-url> <key> <host> <status> <service> [<text>]"
+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 (file)
index 0000000..8dcedd7
--- /dev/null
@@ -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 (file)
index 0000000..c731f4b
--- /dev/null
@@ -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