Mercurial > code > home > repos > homeauto
changeset 979:76bb0bf74bd1
new index page. fix dhcp scanner errors
Ignore-this: 33916e53dc23d5ca84ea74e3755a2ae7
darcs-hash:20150503015215-312f9-4cce43fd81896ba82f86e019f899e318086d9528
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sat, 02 May 2015 18:52:15 -0700 |
parents | e9ed6159b5fa |
children | 2f1cb8b5950a |
files | service/dhcpleases/dhcpleases.py service/dhcpleases/index.html service/dhcpleases/pydeps |
diffstat | 3 files changed, 119 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/service/dhcpleases/dhcpleases.py Fri Apr 17 02:00:15 2015 -0700 +++ b/service/dhcpleases/dhcpleases.py Sat May 02 18:52:15 2015 -0700 @@ -2,6 +2,7 @@ statements about dhcp leases (and maybe live-host pings) """ import sys +import datetime sys.path.append("/my/site/magma") from stategraph import StateGraph from rdflib import URIRef, Namespace, Literal, RDF, RDFS, XSD @@ -19,10 +20,14 @@ class GraphHandler(cyclone.web.RequestHandler): def get(self): + pruneExpired = bool(self.get_argument('pruneExpired', '')) g = StateGraph(ctx=DEV['dhcp']) + now = datetime.datetime.now() for mac, lease in IscDhcpLeases('/var/lib/dhcp/dhcpd.leases' ).get_current().items(): + if pruneExpired and lease.end < now: + continue uri = URIRef("http://bigasterisk.com/dhcpLease/%s" % lease.ethernet) g.add((uri, RDF.type, ROOM['DhcpLease'])) @@ -36,10 +41,10 @@ g.add((mac, ROOM['macAddress'], Literal(lease.ethernet))) if lease.hostname: g.add((mac, ROOM['dhcpHostname'], Literal(lease.hostname))) - - self.set_header('Content-type', 'application/x-trig') + + self.set_header('Content-Type', 'application/x-trig') self.write(g.asTrig()) - + if __name__ == '__main__': config = { 'servePort' : 9073, @@ -49,10 +54,14 @@ #log.setLevel(10) #log.setLevel(logging.DEBUG) - reactor.listenTCP(config['servePort'], - cyclone.web.Application( - [ - (r'/graph', GraphHandler), - ], - )) + reactor.listenTCP( + config['servePort'], + cyclone.web.Application( + [ + (r"/()", cyclone.web.StaticFileHandler, + {"path": ".", "default_filename": "index.html"}), + + (r'/graph', GraphHandler), + ], + )) reactor.run()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/dhcpleases/index.html Sat May 02 18:52:15 2015 -0700 @@ -0,0 +1,100 @@ +<!doctype html> +<html> + <head> + <title>dhcp leases</title> + <meta charset="utf-8" /> + <script src="/lib/polymer/0.8/webcomponentsjs/webcomponents-lite.min.js"></script> + <script src="/lib/underscore-1.5.2.min.js"></script> + <script src="/lib/n3/0.4.2/n3-browser-drewp.js"></script> + <link rel="import" href="/lib/polymer/0.8/iron-ajax/iron-ajax.html"> + </head> + <body> + + <script> + Polymer({ + is: "trig-store", + prefixes: { + room: 'http://projects.bigasterisk.com/room/', + rdfs: 'http://www.w3.org/2000/01/rdf-schema#' + }, + properties: { + trigInput: { + type: String, + observer: 'trigInputChanged' + }, + store: { + // set to a new store each time trig is updated + type: Object, + default: N3.Store(), + notify: true + } + }, + trigInputChanged: function(trig, _old) { + var newStore = N3.Store(); + newStore.addPrefixes(this.prefixes); + var parser = N3.Parser({format: 'TriG'}); + parser.parse(trig, function(error, triple, prefixes) { + if (error !== null) { + console.log(error); + return; + } + newStore.addTriple(triple); + }.bind(this)); + console.log("filled store with", newStore.size, "triples"); + this.store = newStore; + + } + }) + </script> + + <h1>Active dhcp leases</h1> + + <dom-module id="dhcp-table"> + <template> + <iron-ajax auto url="graph" + params='{"pruneExpired": "true"}' + handle-as="text" + last-response="{{ajaxResponse}}"></iron-ajax> + <trig-store id="ts" trig-input="{{ajaxResponse}}"></trig-store> + + <table> + <template is="x-repeat" items="{{devices}}"> + <tr><td>{{item.dhcpHostname}}</td> <td>{{item.ip}}</td></tr> + </template> + </table> + </template> + </dom-module> + + <script> + Polymer({ + is: "dhcp-table", + ready: function() { + this.$.ts.addEventListener('store-changed', this.storeChanged.bind(this)); + this.devices = []; + }, + storeChanged: function(ev) { + var store = ev.detail.value; + var find = function(s, p, o) { return store.findAllGraphs(s, p, o); }; + var findOne = function(s, p, o) { + var rows = find(s, p, o); + return rows[0]; + }; + + this.devices = []; + + find(null, "room:dhcpHostname", null).forEach(function(row) { + var out = {dhcpHostname: N3.Util.getLiteralValue(row.object)} + var lease = findOne(null, "room:ethernetAddress", + row.subject).subject; + var ip = findOne(lease, "room:assignedIp", null).object; + out.ip = N3.Util.getLiteralValue( + findOne(ip, "rdfs:label", null).object); + this.devices.push(out); + }.bind(this)); + this.devices = _.sortBy(this.devices, 'dhcpHostname'); + } + }); + </script> + <dhcp-table></dhcp-table> + </body> +</html>
--- a/service/dhcpleases/pydeps Fri Apr 17 02:00:15 2015 -0700 +++ b/service/dhcpleases/pydeps Sat May 02 18:52:15 2015 -0700 @@ -1,4 +1,4 @@ cyclone==1.1 -isc-dhcp-leases==0.2.1 python-dateutil==2.4.1 rdflib==4.2.0 +https://github.com/drewp/python-isc-dhcp-leases/archive/master.zip \ No newline at end of file