]> git.michaelhowe.org Git - packages/n/nagios-plugins-local.git/commitdiff
Make check_owntracks suitable for a nagios plugin
authorMichael Howe <michael@michaelhowe.org>
Mon, 21 Dec 2015 20:57:10 +0000 (20:57 +0000)
committerMichael Howe <michael@michaelhowe.org>
Mon, 21 Dec 2015 20:57:10 +0000 (20:57 +0000)
In particular:
* add support for SSL
* add support for command-line arguments
* add a pause between the mqtt pub and the recorder check

plugins/check_owntracks [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index e5067df..81ca821
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
+# From <https://github.com/owntracks/recorder/tree/master/contrib/ot-ping.py>
 
 # ot-ping.py
 # send a "pingping" to the OwnTracks Recorder via MQTT with "now"
@@ -13,16 +14,40 @@ import time
 import os
 import sys
 import requests
+import ssl
+import time
+import argparse
 
 __author__    = 'Jan-Piet Mens <jpmens()gmail.com>'
 __copyright__ = 'Copyright 2015 Jan-Piet Mens'
 __license__ = 'MIT'
 
-hostname    = 'localhost'
-port        = 1883
-username    = None
-password    = None
-tls         = None
+parser = argparse.ArgumentParser()
+parser.add_argument('-M', '--mqtt-hostname', metavar='<mqtt_hostname>', help='mqtt host to connect to (defaults to localhost)', dest='mqtt_hostname', default='localhost')
+parser.add_argument('-P', '--mqtt-port', metavar='<mqtt_port>', help='mqtt port to connect to (defaults to 1883)', dest='mqtt_port', default=1883)
+parser.add_argument('-H', '--recorder-hostname', metavar='<recorder_hostname>', help='recorder host to connect to (defaults to localhost)', dest='recorder_hostname', default='localhost')
+parser.add_argument('-p', '--recorder-port', metavar='<recorder_port>', help='recorder port to connect to (defaults to 8083)', dest='recorder_port', default='8083')
+parser.add_argument('-U', '--recorder-url', metavar='<recorder_url>', help='url path to recorder (defaults to /)', dest='recorder_url', default='/')
+parser.add_argument('-r', '--recorder-protocol', metavar='<recorder_protocol>', help='protocol to access recorder (defaults to http)', dest='recorder_protocol', default='http')
+parser.add_argument('-u', '--username', metavar='<username>', help='mqtt username to use (defaults to none)', dest='username', default=None)
+parser.add_argument('--password', metavar='<password>', help='mqtt password to use (defaults to none)', dest='password', default=None)
+parser.add_argument('-C', '--ca-certificate', metavar='<ca_certificate>', help='CA certificate for mqtt (defaults to none, disabling SSL)', dest='ca_path', default=None)
+parser.add_argument('-w', '--warning', metavar='<warning_seconds>', help='number of seconds delay before warning (defaults to 10)', dest='warn_time', default=10, type=int)
+parser.add_argument('-c', '--critical', metavar='<critical_seconds>', help='number of seconds delay before critical (defaults to 60)', dest='crit_time', default=60, type=int)
+args = parser.parse_args()
+
+tls = None
+
+if args.ca_path is not None:
+    # Use the best SSL version we can get.  python on wheezy only supports
+    # PROTOCOL_TLSv1, while python on jessie supports TLS 1.2
+    try:
+        tls_version = ssl.PROTOCOL_TLSv1_2
+    except AttributeError:
+        tls_version = ssl.PROTOCOL_TLSv1
+
+    tls     = { 'ca_certs' : args.ca_path, 'tls_version': tls_version }
+
 qos         = 0
 retain      = 0
 
@@ -38,18 +63,18 @@ def pingping(tics):
     msg = "MQTT publish"
 
     params = {
-            'hostname'  : hostname,
-            'port'      : port,
+            'hostname'  : args.mqtt_hostname,
+            'port'      : args.mqtt_port,
             'qos'       : qos,
             'retain'    : retain,
             'client_id' : "ot-recorder-ping-ping-%s" % os.getpid(),
     }
     auth = None
 
-    if username is not None:
+    if args.username is not None:
         auth = {
-            'username' : username,
-            'password' : password
+            'username' : args.username,
+            'password' : args.password
         }
 
     topic = "owntracks/ping/ping"
@@ -62,7 +87,7 @@ def pingping(tics):
         "tst"       : tics,
     }
 
-    topic = "nop/ping/ping"
+#    topic = "nop/ping/ping"
     payload = json.dumps(location)
 
     try:
@@ -72,7 +97,7 @@ def pingping(tics):
                 **params)
     except Exception, e:
         status = CRITICAL
-        msg = msg + " " + str(e)
+        msg = msg + " mqtt failed: " + str(e)
 
     return status, msg
 
@@ -89,14 +114,14 @@ def check_response(url, tics):
         r = requests.post(url + "/api/0/last", params= { 'user' : 'ping', 'device' : 'ping' })
         data = json.loads(r.text)[0]    # Return is an array
     except Exception, e:
-        return CRITICAL, str(e)
+        return CRITICAL, "check_response failed: " + str(e)
 
     tst = data['tst']
     diff = tics - tst
 
-    if diff > 10:
+    if diff > args.warn_time:
         status = WARNING
-    if diff > 60:
+    if diff > args.crit_time:
         status = CRITICAL
 
     msg = msg + " %d seconds difference" % diff
@@ -110,7 +135,11 @@ if __name__ == '__main__':
         print "%s ot-recorder pingping failed: %s" % (codes[status], msg)
         sys.exit(status)
 
-    status, msg = check_response('http://127.0.0.1:8085', tics)
+    # pause for a moment to give mqtt a chance to catch up
+    time.sleep( min( args.warn_time / 4, 2 ) )
+
+    recorder_full_url = "%s://%s:%s%s" % ( args.recorder_protocol, args.recorder_hostname, args.recorder_port, args.recorder_url )
+    status, msg = check_response(recorder_full_url, tics)
 
     print "%s %s" % (codes[status], msg)
     sys.exit(status)