From: Michael Howe Date: Mon, 21 Dec 2015 20:57:10 +0000 (+0000) Subject: Make check_owntracks suitable for a nagios plugin X-Git-Tag: 0.13~1 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=3626883f4c30c43529b8204480f2813ac2f81788;p=packages%2Fn%2Fnagios-plugins-local.git Make check_owntracks suitable for a nagios plugin In particular: * add support for SSL * add support for command-line arguments * add a pause between the mqtt pub and the recorder check --- diff --git a/plugins/check_owntracks b/plugins/check_owntracks old mode 100644 new mode 100755 index e5067df..81ca821 --- a/plugins/check_owntracks +++ b/plugins/check_owntracks @@ -1,5 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +# From # 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 ' __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='', help='mqtt host to connect to (defaults to localhost)', dest='mqtt_hostname', default='localhost') +parser.add_argument('-P', '--mqtt-port', metavar='', help='mqtt port to connect to (defaults to 1883)', dest='mqtt_port', default=1883) +parser.add_argument('-H', '--recorder-hostname', metavar='', help='recorder host to connect to (defaults to localhost)', dest='recorder_hostname', default='localhost') +parser.add_argument('-p', '--recorder-port', metavar='', help='recorder port to connect to (defaults to 8083)', dest='recorder_port', default='8083') +parser.add_argument('-U', '--recorder-url', metavar='', help='url path to recorder (defaults to /)', dest='recorder_url', default='/') +parser.add_argument('-r', '--recorder-protocol', metavar='', help='protocol to access recorder (defaults to http)', dest='recorder_protocol', default='http') +parser.add_argument('-u', '--username', metavar='', help='mqtt username to use (defaults to none)', dest='username', default=None) +parser.add_argument('--password', metavar='', help='mqtt password to use (defaults to none)', dest='password', default=None) +parser.add_argument('-C', '--ca-certificate', metavar='', help='CA certificate for mqtt (defaults to none, disabling SSL)', dest='ca_path', default=None) +parser.add_argument('-w', '--warning', metavar='', help='number of seconds delay before warning (defaults to 10)', dest='warn_time', default=10, type=int) +parser.add_argument('-c', '--critical', metavar='', 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)