#!/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"
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
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"
"tst" : tics,
}
- topic = "nop/ping/ping"
+# topic = "nop/ping/ping"
payload = json.dumps(location)
try:
**params)
except Exception, e:
status = CRITICAL
- msg = msg + " " + str(e)
+ msg = msg + " mqtt failed: " + str(e)
return status, msg
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
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)