diff -r a849c00b63f8 -r 8574aeff9b36 fixbot/api/amp.py --- a/fixbot/api/amp.py Sat Feb 20 22:32:18 2010 +0200 +++ b/fixbot/api/amp.py Sat Feb 20 23:06:43 2010 +0200 @@ -1,4 +1,5 @@ from twisted.protocols import amp +from twisted.python import log from fixbot.module import ModuleInfo, Event @@ -21,6 +22,17 @@ ('msg', amp.String()), ] +class CmdModuleAbort (amp.Command) : + """ + Module has failed and will now disconnect + """ + + arguments = [ + ('msg', amp.String()) # string describing the error occuring + ] + + requiresAnswer = False + class ServerProtocol (amp.AMP) : """ Nexus-side command handler @@ -29,11 +41,25 @@ # the registered ModuleInfo module = None + def connectionMade (self) : + log.msg("Module connecting from: %s" % (self.transport.getPeer())) + + + def connectionLost (self, reason) : + log.err(reason, "Module lost") + + if self.module : + # drop it + self.factory.nexus.unregisterModule(self.module, reason.getErrorMessage()) + + @CmdModuleRegister.responder def on_ModuleRegister (self, name) : # construct the ModuleInfo mi = ModuleInfo() mi.name = name + + log.msg("Module registered: %s" % (mi)) # register self.factory.nexus.registerModule(mi, self) @@ -52,7 +78,17 @@ # ok return {} + + @CmdModuleAbort.responder + def on_ModuleAbort (self, msg) : + # unhook + module = self.module + self.module = None + # report + self.factory.nexus.unregisterModule(self.module, msg) + + # XXX: stop accepting commands etc? class ClientProtocol (amp.AMP) : """ @@ -68,6 +104,14 @@ # register self.sendModuleRegister(self.factory.name).addCallback(self._ModuleRegisterOK) + def connectionLost (self, reason) : + """ + Disconnected from nexus, for whatever reason... + """ + + log.err(reason, "API connection lost") + + # XXX: was this expected? Reconnect? def sendModuleRegister (self, name) : """ @@ -92,4 +136,20 @@ self.callRemote(CmdModuleEvent, type=event.type, msg=event.msg) + def sendModuleAbort (self, msg) : + """ + Send CmdModuleAbort - no response is expected + """ + self.callRemote(CmdModuleAbort, msg=msg) + + + def abort (self, msg) : + """ + Send abort message and drop connection + """ + + # disconnect. This should leave the transport to flush buffers, and then call connectionLost + # should also stop us from sending any more commands + self.transport.loseConnection() +