view bin/subserver @ 939:331e67fa1492

asco try to print gst error messages. untested Ignore-this: 137d6b933ed8a2502f7281e3a0ab5754
author drewp@bigasterisk.com
date Wed, 12 Jun 2013 23:48:32 +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()