X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/fbb90886873a6430d44ba2c9e1cfc8ab9d7f14c4..70672dbd46126ba2b5a60a034c0a8a13385d4510:/pymindaemon.py diff --git a/pymindaemon.py b/pymindaemon.py index 1ddef6c..b440c52 100644 --- a/pymindaemon.py +++ b/pymindaemon.py @@ -10,10 +10,12 @@ command-line. import signal import socket -from dispatcher import Dispatcher -from eventloop import EventLoop, LoopInterruptedError -class PyminDaemon(EventLoop): +import dispatcher +import eventloop +import serializer + +class PyminDaemon(eventloop.EventLoop): r"""PyminDaemon(bind_addr, routes) -> PyminDaemon instance This class is well suited to run as a single process. It handles @@ -31,7 +33,7 @@ class PyminDaemon(EventLoop): >>> PyminDaemon(('', 9999), dict(test=test_handler)).run() """ - def __init__(self, bind_addr, routes): + def __init__(self, routes=dict(), bind_addr=('', 9999)): r"""Initialize the PyminDaemon object. See PyminDaemon class documentation for more info. @@ -41,9 +43,9 @@ class PyminDaemon(EventLoop): sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(bind_addr) # Create EventLoop - EventLoop.__init__(self, sock) + eventloop.EventLoop.__init__(self, sock) # Create Dispatcher - self.dispatcher = Dispatcher(routes) + self.dispatcher = dispatcher.Dispatcher(routes) # Signal handling def quit(signum, frame): print "Shuting down ..." @@ -58,31 +60,42 @@ class PyminDaemon(EventLoop): def handle(self): r"handle() -> None :: Handle incoming events using the dispatcher." (msg, addr) = self.file.recvfrom(65535) - result = self.dispatcher.dispatch(msg) + try: + result = self.dispatcher.dispatch(msg) + if result is not None: + result = serializer.serialize(result) + response = u'OK ' + except dispatcher.Error, e: + result = unicode(e) + u'\n' + response = u'ERROR ' + except Exception, e: + import traceback + result = u'Internal server error\n' + traceback.print_exc() # TODO logging! + response = u'ERROR ' if result is None: - msg = 'OK 0' + response += u'0\n' else: - msg = 'OK %d\n%s' % (len(str(result)), result) - self.file.sendto(msg, addr) - #try: - # d.dispatch(msg) - #except dis.BadRouteError, inst: - # sock.sendto('Bad route from : ' + inst.cmd + '\n', addr) - #except dis.CommandNotFoundError, inst: - # sock.sendto('Command not found : ' + inst.cmd + '\n', addr) + response += u'%d\n%s' % (len(result), result) + self.file.sendto(response, addr) def run(self): r"run() -> None :: Run the event loop (shortcut to loop())" try: return self.loop() - except LoopInterruptedError, e: + except eventloop.LoopInterruptedError, e: pass if __name__ == '__main__': - @handler + @handler(u"Print all the arguments, return nothing.") def test_handler(*args): print 'test:', args - PyminDaemon(('', 9999), dict(test=test_handler)).run() + @handler(u"Echo the message passed as argument.") + def echo_handler(message): + print 'echo:', message + return message + + PyminDaemon(dict(test=test_handler, echo=echo_handler)).run()