terom@62: from twisted.protocols import amp terom@64: from twisted.python import log terom@62: terom@62: from fixbot.module import ModuleInfo, Event terom@62: terom@62: class CmdModuleRegister (amp.Command) : terom@62: """ terom@62: Register module terom@62: """ terom@62: terom@62: arguments = [ terom@62: ('name', amp.String()), terom@62: ] terom@62: terom@62: class CmdModuleEvent (amp.Command) : terom@62: """ terom@62: Broadcast event terom@62: """ terom@62: terom@62: arguments = [ terom@62: ('type', amp.String()), terom@62: ('msg', amp.String()), terom@62: ] terom@62: terom@64: class CmdModuleAbort (amp.Command) : terom@64: """ terom@64: Module has failed and will now disconnect terom@64: """ terom@64: terom@64: arguments = [ terom@64: ('msg', amp.String()) # string describing the error occuring terom@64: ] terom@64: terom@64: requiresAnswer = False terom@64: terom@62: class ServerProtocol (amp.AMP) : terom@62: """ terom@62: Nexus-side command handler terom@62: """ terom@62: terom@62: # the registered ModuleInfo terom@62: module = None terom@62: terom@64: def connectionMade (self) : terom@64: log.msg("Module connecting from: %s" % (self.transport.getPeer())) terom@64: terom@64: terom@64: def connectionLost (self, reason) : terom@64: log.err(reason, "Module lost") terom@64: terom@64: if self.module : terom@64: # drop it terom@64: self.factory.nexus.unregisterModule(self.module, reason.getErrorMessage()) terom@64: terom@64: terom@62: @CmdModuleRegister.responder terom@62: def on_ModuleRegister (self, name) : terom@62: # construct the ModuleInfo terom@62: mi = ModuleInfo() terom@62: mi.name = name terom@64: terom@64: log.msg("Module registered: %s" % (mi)) terom@62: terom@62: # register terom@62: self.factory.nexus.registerModule(mi, self) terom@62: self.module = mi terom@62: terom@62: # ok terom@62: return {} terom@62: terom@62: @CmdModuleEvent.responder terom@62: def on_ModuleEvent (self, type, msg) : terom@62: # as Event terom@62: e = Event(self.module, type, msg) terom@62: terom@62: # publish terom@62: self.factory.nexus.handleEvent(e) terom@62: terom@62: # ok terom@62: return {} terom@64: terom@64: @CmdModuleAbort.responder terom@64: def on_ModuleAbort (self, msg) : terom@64: # unhook terom@64: module = self.module terom@64: self.module = None terom@62: terom@64: # report terom@64: self.factory.nexus.unregisterModule(self.module, msg) terom@64: terom@64: # XXX: stop accepting commands etc? terom@62: terom@62: class ClientProtocol (amp.AMP) : terom@62: """ terom@62: Module-side command sender/handler terom@62: """ terom@62: terom@62: terom@62: def connectionMade (self) : terom@62: """ terom@62: Connected to nexus, send ModuleRegister terom@62: """ terom@62: terom@62: # register terom@62: self.sendModuleRegister(self.factory.name).addCallback(self._ModuleRegisterOK) terom@62: terom@64: def connectionLost (self, reason) : terom@64: """ terom@64: Disconnected from nexus, for whatever reason... terom@64: """ terom@64: terom@64: log.err(reason, "API connection lost") terom@64: terom@64: # XXX: was this expected? Reconnect? terom@62: terom@62: def sendModuleRegister (self, name) : terom@62: """ terom@62: Register with given module name terom@62: """ terom@62: terom@62: return self.callRemote(CmdModuleRegister, name=name) terom@62: terom@62: terom@62: def _ModuleRegisterOK (self, ret) : terom@62: """ terom@62: Registered with nexus, commence operation terom@62: """ terom@62: terom@62: self.factory._onRegistered(self) terom@62: terom@62: terom@62: def sendEvent (self, event) : terom@62: """ terom@62: Broadcast event to nexus terom@62: """ terom@62: terom@62: self.callRemote(CmdModuleEvent, type=event.type, msg=event.msg) terom@62: terom@64: def sendModuleAbort (self, msg) : terom@64: """ terom@64: Send CmdModuleAbort - no response is expected terom@64: """ terom@62: terom@64: self.callRemote(CmdModuleAbort, msg=msg) terom@64: terom@64: terom@64: def abort (self, msg) : terom@64: """ terom@64: Send abort message and drop connection terom@64: """ terom@64: terom@64: # disconnect. This should leave the transport to flush buffers, and then call connectionLost terom@64: # should also stop us from sending any more commands terom@64: self.transport.loseConnection() terom@64: