Mercurial > code > home > repos > homeauto
view service/dhcpleases/dhcpleases.py @ 480:53ceedcc2809
dhcpleases partial rewrite
Ignore-this: 6a2b95612f0e3a2348397f2f068e5f58
author | drewp@bigasterisk.com |
---|---|
date | Sat, 20 Apr 2019 23:59:04 -0700 |
parents | 572580b50de3 |
children | f372e9d358d2 |
line wrap: on
line source
""" statements about dhcp leases (and maybe live-host pings) also read 'arp -an' and our dns list """ import sys import datetime sys.path.append("/my/site/magma") from stategraph import StateGraph from rdflib import URIRef, Namespace, Literal, RDF, RDFS, XSD, ConjunctiveGraph from dateutil.tz import tzlocal import cyclone.web from twisted.internet import reactor, task from isc_dhcp_leases.iscdhcpleases import IscDhcpLeases sys.path.append("/my/proj/homeauto/lib") from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler sys.path.append("/my/proj/rdfdb") from rdfdb.patch import Patch DEV = Namespace("http://projects.bigasterisk.com/device/") ROOM = Namespace("http://projects.bigasterisk.com/room/") def timeLiteral(dt): return Literal(dt.replace(tzinfo=tzlocal()).isoformat(), datatype=XSD.dateTime) def update(masterGraph): g = ConjunctiveGraph() ctx = DEV['dhcp'] now = datetime.datetime.now() for mac, lease in IscDhcpLeases('/var/lib/dhcp/dhcpd.leases' ).get_current().items(): uri = URIRef("http://bigasterisk.com/dhcpLease/%s" % lease.ethernet) g.add((uri, RDF.type, ROOM['DhcpLease'], ctx)) g.add((uri, ROOM['leaseStartTime'], timeLiteral(lease.start), ctx)) g.add((uri, ROOM['leaseEndTime'], timeLiteral(lease.end), ctx)) if lease.end < now: g.add((uri, RDF.type, ROOM['ExpiredLease'], ctx)) ip = URIRef("http://bigasterisk.com/localNet/%s/" % lease.ip) g.add((uri, ROOM['assignedIp'], ip, ctx)) g.add((ip, RDFS.label, Literal(lease.ip), ctx)) mac = URIRef("http://bigasterisk.com/mac/%s" % lease.ethernet) g.add((uri, ROOM['ethernetAddress'], mac, ctx)) g.add((mac, ROOM['macAddress'], Literal(lease.ethernet), ctx)) if lease.hostname: g.add((mac, ROOM['dhcpHostname'], Literal(lease.hostname), ctx)) masterGraph.setToGraph(g) if __name__ == '__main__': config = { 'servePort' : 9073, } from twisted.python import log as twlog twlog.startLogging(sys.stdout) #log.setLevel(10) #log.setLevel(logging.DEBUG) masterGraph = PatchableGraph() task.LoopingCall(update, masterGraph).start(1) reactor.listenTCP( config['servePort'], cyclone.web.Application( [ (r"/()", cyclone.web.StaticFileHandler, {"path": ".", "default_filename": "index.html"}), (r'/graph', CycloneGraphHandler, {'masterGraph': masterGraph}), (r'/graph/events', CycloneGraphEventsHandler, {'masterGraph': masterGraph}), ], masterGraph=masterGraph )) reactor.run()