diff -r eb0545ec03e7 -r 00907acd732a fixbot/api.py --- a/fixbot/api.py Sat Nov 06 16:01:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,213 +0,0 @@ -from twisted.application import internet, service -from twisted.internet import protocol, reactor -from twisted.python import log, usage -from datetime import datetime -import sys - -from fixbot import buffer, config - -class ModuleInfo (object) : - """ - Some info about a module - """ - - # module's name - name = None - - def __str__ (self) : - return "Module %s:" % (self.name) - - def __repr__ (self) : - return "" % (self.name, ) - -class Event (object) : - # the ModuleInfo object - module = None - - # the event type as a string - type = None - - # event message as a string (up to 64k, although that won't fit onto IRC..) - msg = None - - # timestamp as a datetime.datetime - when = None - - def __init__ (self, module, type, msg) : - self.module = module - self.type = type - self.msg = msg - - self.when = datetime.now() - - def __str__ (self) : - return "[%s] %s" % (self.type, self.msg) - - def __repr__ (self) : - return "%s @ %s" % (self.type, self.when) - -CLIENT_COMMANDS = [ - "module_init", - "module_event", -] - -SERVER_COMMANDS = [ - "module_ok", -] - -class ServerProtocol (buffer.StreamProtocol, protocol.Protocol) : - RECV_COMMANDS = CLIENT_COMMANDS - SEND_COMMANDS = SERVER_COMMANDS - - VALID_STATES = [ - "wait_init", - "wait_event" - ] - - # proto state - state = None - - # module info - module = None - - def _assert (self, condition, msg) : - if not condition : - self.transport.loseConnection() - log.err("assert failed in APIProtocol for %s: %s" % (self.module, msg)) - - def connectionMade (self) : - log.msg("Client connected") - - def connectionLost (self, reason) : - log.msg("Connection lost: %s" % reason) - - if self.module : - self.factory.nexus.unregisterModule(self.module, reason.getErrorMessage()) - - def on_module_init (self, i) : - self._assert(not self.module, "module_init with non-None self.module") - - peer_secret = i.readVarLen('B') - - self._assert(peer_secret == self.factory.secret, "Mismatching API secrets!") - - m = ModuleInfo() - - m.name = i.readVarLen('B') - m.addr = self.transport.getPeer() - - log.msg("Got mod_init for %r" % m) - - self.factory.nexus.registerModule(m, self) - - self.module = m - - o = self.startCommand('module_ok') - - self.send(o) - - def on_module_event (self, i) : - self._assert(self.module, "module_event with None self.module!") - - event_type = i.readVarLen('B') - event_msg = i.readVarLen('H') - - e = Event(self.module, event_type, event_msg) - - self.factory.nexus.handleEvent(e) - - def logPrefix (self) : - if self.module : - return str(self.module) - else : - return super(ServerProtocol, self).logPrefix() - -class ClientProtocol (buffer.StreamProtocol, protocol.Protocol) : - RECV_COMMANDS = SERVER_COMMANDS - SEND_COMMANDS = CLIENT_COMMANDS - - def connectionMade (self) : - log.msg("Connected to API server, sending module init message") - - o = self.startCommand('module_init') - o.writeVarLen('B', self.factory.secret) - o.writeVarLen('B', self.factory.name) - - self.send(o) - - def sendEvent (self, event) : - o = self.startCommand('module_event') - o.writeVarLen('B', event.type) - o.writeVarLen('H', event.msg[:2**16]) - - self.send(o) - - def on_module_ok (self, i) : - log.msg("Registration OK") - - self.factory.connected(self) - - def logPrefix (self) : - return "module %s client" % (self.factory.name) - -class Module (ModuleInfo, protocol.ClientFactory) : - protocol = ClientProtocol - - def __init__ (self, config) : - self.connection = None - self.secret = config['api-secret'] - - def connected (self, connection) : - log.msg("Connected!") - self.connection = connection - - self.handleConnect() - - def disconnect (self) : - self.connection.transport.loseConnection() - - def sendEvent (self, type, msg) : - self.connection.sendEvent(self.buildEvent(type, msg)) - - def buildEvent (self, type, msg) : - return Event(self, type, msg) - - def handleConnect (self) : - """ - Do something - """ - - pass - -class ServerFactory (protocol.ServerFactory) : - protocol = ServerProtocol - - def __init__ (self, nexus, secret) : - self.nexus = nexus - self.secret = secret - -class ClientOptions (config.ConfigOptions) : - optParameters = [ - ( "api-server", "s", "127.0.0.1", "address of API server to connect to" ), - ( "api-port", "P", 34888, "port of API server to connect to", int ), - ( "api-secret", None, None, "secret key for API connections" ), - ] - - optFlags = [ - - ] - -def makeService (module_class, config) : - s = service.MultiService() - - # build factory - factory = module_class(config) - - # the API client - log.msg("Connecting to API server on [%s:%d]" % (config['api-server'], config['api-port'])) - api_client = internet.TCPClient(config['api-server'], config['api-port'], factory) - - api_client.setServiceParent(s) - - return s -