From 99def63a4f8569475b9de43e8e9c15c5ba7c4ef5 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Thu, 10 Dec 2015 22:10:33 +0100 Subject: [PATCH] Intial commit --- .gitignore | 3 +++ settings.py | 9 +++++++ upsc_to_logstash.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 .gitignore create mode 100644 settings.py create mode 100755 upsc_to_logstash.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c50c2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.swp +*.pyc +local_settings.py diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..e557dff --- /dev/null +++ b/settings.py @@ -0,0 +1,9 @@ + +LOGSTASH_URL = 'http://es.example.com:8080' +LOGSTASH_USER = 'nutuser' +LOGSTASH_PASSWORD = '' + +try: + from local_settings import * +except ImportError: + pass diff --git a/upsc_to_logstash.py b/upsc_to_logstash.py new file mode 100755 index 0000000..1332044 --- /dev/null +++ b/upsc_to_logstash.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# Nikolai Kristiansen +import json +import sys +import subprocess +from collections import OrderedDict +import datetime +import requests + +import settings + +def to_python(status): + integer_fields = [ + "driver.parameter.pollinterval", + "ups.delay.shutdown", + "ups.delay.start", + "ups.load" + ] + float_fields = [ + "battery.voltage", + "battery.voltage.high", + "battery.voltage.low", + "input.frequency", + "input.voltage", + "input.voltage.fault", + "output.voltage", + "ups.temperature" + ] + for k,v in status.items(): + if k in integer_fields: + v = int(v) + elif k in float_fields: + v = float(v) + + status[k] = v + + return status + +def get_status(psu_label): + cmd = ['upsc', psu_label] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout,stderr = p.communicate() + + lines = stdout.strip().split('\n') + kvs = [l.split(': ') for l in lines] + status = to_python(OrderedDict(kvs)) + + return status + +if __name__ == '__main__': + + if len(sys.argv) != 2: + print("Invalid num args.") + print("Usage: argv[0] psu_label") + exit(1) + + output = { + 'poll_date': datetime.datetime.utcnow().isoformat(), + 'status': get_status(sys.argv[1]) + } + json_output = json.dumps(output, indent=4) + r = requests.post( + settings.LOGSTASH_URL, + data=json_output, headers={'content-type':'application/json'}, + auth=(settings.LOGSTASH_USER, settings.LOGSTASH_PASSWORD) + )