Mercurial > code > home > repos > light9
view bin/subserver @ 925:e668f93460d4
some 2012 chase data copied to 2013
Ignore-this: a74572e18646ece650058d0b595d989a
author | drewp@bigasterisk.com |
---|---|
date | Tue, 11 Jun 2013 05:49:36 +0000 |
parents | 8b95d2865643 |
children | dd896321faee |
line wrap: on
line source
#!bin/python """ live web display of all existing subs with pictures, mainly for dragging them into CC """ from run_local import log from twisted.internet import reactor import twisted.internet.error import sys, optparse, logging, json, os, subprocess import cyclone.web, cyclone.httpclient, cyclone.websocket from light9.rdfdb.syncedgraph import SyncedGraph from rdflib import RDF from light9.namespaces import L9 import pyjade.utils try: import sys sys.path.append("../homeauto/lib") sys.path.append("/home/drewp/projects/homeauto/lib") from cycloneerr import PrettyErrorHandler except ImportError: class PrettyErrorHandler(object): pass liveClients = set() def sendToLiveClients(d=None, asJson=None): j = asJson or json.dumps(d) for c in liveClients: c.sendMessage(j) class Live(cyclone.websocket.WebSocketHandler): def connectionMade(self, *args, **kwargs): log.info("websocket opened") liveClients.add(self) self.settings.onNewClient() def connectionLost(self, reason): log.info("websocket closed") liveClients.remove(self) def messageReceived(self, message): log.info("got message %s" % message) self.sendMessage(message) class Static(PrettyErrorHandler, cyclone.web.StaticFileHandler): def get(self, path, *args, **kw): if path == '': return self.respondStaticJade("light9/subserver/index.jade") if path == 'gui.js': return self.responseStaticCoffee('light9/subserver/gui.coffee') oddlyPlaced = { "websocket.js": "light9/rdfdb/web/websocket.js", "jquery-1.7.2.min.js": "light9/rdfdb/web/lib/jquery-1.7.2.min.js", } if path in oddlyPlaced: self.write(open(oddlyPlaced[path]).read()) return cyclone.web.StaticFileHandler.get(self, path, *args, **kw) def respondStaticJade(self, src): html = pyjade.utils.process(open(src).read()) self.write(html) def responseStaticCoffee(self, src): self.write(subprocess.check_output([ '/usr/bin/coffee', '--compile', '--print', src])) if __name__ == "__main__": parser = optparse.OptionParser() parser.add_option("-v", "--verbose", action="store_true", help="logging.DEBUG") (options, args) = parser.parse_args() log.setLevel(logging.DEBUG if options.verbose else logging.INFO) graph = SyncedGraph("subserver") d = {} def updateSubs(): subs = [] for sub in graph.subjects(RDF.type, L9['Submaster']): rec = {'uri' : sub} rec['isLocal'] = graph.contains((sub, RDF.type, L9['LocalSubmaster'])) rec['label'] = graph.label(sub) subs.append(rec) d.clear() d.update({'subs': subs}) sendToLiveClients(d=d) def onNewClient(): sendToLiveClients(d=d) graph.addHandler(updateSubs) port = 8052 reactor.listenTCP(port, cyclone.web.Application(handlers=[ (r'/live', Live), (r'/(.*)', Static, {"path" : "light9/subserver", "default_filename" : "index.jade"}), ], debug=True, graph=graph, onNewClient=onNewClient)) log.info("serving on %s" % port) reactor.run()