From 62bcc93047f677f322422fb1c9a0fab3f1923008 Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Thu, 29 Aug 2013 09:19:44 -0400 Subject: Changing to web based manager --- .gitignore | 1 + mfiapi.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ server.py | 46 +++++++++++++++++------------------------ templates/index.html | 18 ++++++---------- 4 files changed, 84 insertions(+), 39 deletions(-) create mode 100644 .gitignore create mode 100644 mfiapi.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/mfiapi.py b/mfiapi.py new file mode 100644 index 0000000..31f0330 --- /dev/null +++ b/mfiapi.py @@ -0,0 +1,58 @@ +import json +import urllib2 +import urllib +from cookielib import CookieJar + +def bool_to_bin(value): + return 1 if value == True else 0 + + +def bin_to_bool(value): + return True if int(value) == 1 else False + + +class MFiAPI(object): + + def __init__(self, host): + self.host = host + self.opener = urllib2.build_opener( + urllib2.HTTPCookieProcessor(CookieJar())) + + def _make_url(self, suffix): + return 'https://{}/{}'.format(self.host, suffix) + + def login(self, username, password): + form_data = urllib.urlencode({ + 'username' : username, + 'password': password, + 'login': 'login' + }) + + self.opener.open(self._make_url('login'), form_data) + + def get_sensor_data(self): + resp = self.opener.open(self._make_url('api/v1.0/list/sensors')) + return json.load(resp)['data'] + + def port_status(self): + data = self.get_sensor_data() + return dict((i['label'], bin_to_bool(i['output_val'])) for i in data) + + def set_port(self, mac, port, value): + data = urllib.urlencode({ "json": json.dumps({ + "mac": mac, + "val": bool_to_bin(value), + "port": int(port), + "cmd": "mfi-output" + }) + }) + + self.opener.open(self._make_url("api/v1.0/cmd/devmgr"), data) + + def toggle_port(self, name): + mac, port, status = None, None, None + + for data in self.get_sensor_data(): + if data['label'] == name: + set_to = not bin_to_bool(data['output_val']) + self.set_port(data['mac'], data['port'], set_to) diff --git a/server.py b/server.py index 766cc5f..4159736 100644 --- a/server.py +++ b/server.py @@ -6,49 +6,41 @@ import tornado.options import tornado.process import tornado.template import tornado.httpserver +from mfiapi import MFiAPI from tornado.options import define, options define("port", default=8888, help="run on the given port", type=int) -STATUSES = { - 'relay1': True, # Fan - 'relay2': False, # Light - 'relay3': False, -} - - -# for relay in STATUSES.keys(): -# caller = subprocess.Popen(["ssh","admin@10.0.1.15", -# "cat /proc/power/{}".format(relay)], stdout=subprocess.PIPE) -# output = caller.communicate()[0] -# STATUSES[relay] = output.startswith("1") - - class PowerStatusHandler(tornado.web.RequestHandler): - def get(self): - self.finish(STATUSES) + def __init__(self, *args, **kwargs): + self.api = MFiAPI('172.16.0.38:6443') + super(PowerStatusHandler, self).__init__(*args, **kwargs) - @tornado.web.asynchronous - def _trigger_relay(self, relay, value): - STATUSES[relay] = value - value = 1 if value is True else 0 - tornado.process.Subprocess(["ssh","admin@10.0.1.15", - "echo {} > /proc/power/{}".format(value, relay)], - stdout=tornado.process.Subprocess.STREAM) + def get(self): + self.api.login('admin', 'password') + self.finish(self.api.port_status()) def post(self): - for key, value in self.request.arguments.items(): - self._trigger_relay(key, value[0] == "on") + self.api.login('admin', 'password') - self.finish(STATUSES) + for key, value in self.request.arguments.items(): + self.api.toggle_port(key) class IndexHandler(tornado.web.RequestHandler): + def __init__(self, *args, **kwargs): + self.api = MFiAPI('172.16.0.38:6443') + super(IndexHandler, self).__init__(*args, **kwargs) + def get(self): - self.render("index.html") + self.api.login('admin', 'password') + + ports = [(port, port.replace(" ", "_").replace("'", "-")) for port in self.api.port_status().keys()] + + self.render("index.html", ports=ports) class Application(tornado.web.Application): diff --git a/templates/index.html b/templates/index.html index dba7d79..6903a10 100644 --- a/templates/index.html +++ b/templates/index.html @@ -13,12 +13,13 @@ $.ajax("/power-status/").done(function(data) { for (key in data) { var value = data[key] ? "on" : "off"; + var key = key.replace("'", "-").replace(" ", "_"); $("#"+key).val(value).slider("refresh"); } }); $("select[data-role=slider]").on("change", function() { var data = {}; - data[this.name] = $(this).val(); + data[$(this).attr("data-name")] = $(this).val(); $.ajax({ url: "/power-status/", data: data, type: "POST" }); }); }); @@ -32,24 +33,17 @@
+ {% for name, id in ports %}
- - -
-
-
-
- -
+ {% end %}
-- cgit v1.2.3