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