fixbot/api/amp.py
changeset 64 8574aeff9b36
parent 62 e4db89a5f6bc
equal deleted inserted replaced
63:a849c00b63f8 64:8574aeff9b36
     1 from twisted.protocols import amp
     1 from twisted.protocols import amp
       
     2 from twisted.python import log
     2 
     3 
     3 from fixbot.module import ModuleInfo, Event
     4 from fixbot.module import ModuleInfo, Event
     4 
     5 
     5 class CmdModuleRegister (amp.Command) :
     6 class CmdModuleRegister (amp.Command) :
     6     """
     7     """
    19     arguments = [
    20     arguments = [
    20         ('type',    amp.String()),
    21         ('type',    amp.String()),
    21         ('msg',     amp.String()),
    22         ('msg',     amp.String()),
    22     ]
    23     ]
    23 
    24 
       
    25 class CmdModuleAbort (amp.Command) :
       
    26     """
       
    27         Module has failed and will now disconnect
       
    28     """
       
    29 
       
    30     arguments = [
       
    31         ('msg',     amp.String())   # string describing the error occuring
       
    32     ]
       
    33 
       
    34     requiresAnswer = False
       
    35 
    24 class ServerProtocol (amp.AMP) :
    36 class ServerProtocol (amp.AMP) :
    25     """
    37     """
    26         Nexus-side command handler
    38         Nexus-side command handler
    27     """
    39     """
    28 
    40 
    29     # the registered ModuleInfo
    41     # the registered ModuleInfo
    30     module = None
    42     module = None
    31     
    43     
       
    44     def connectionMade (self) :
       
    45         log.msg("Module connecting from: %s" % (self.transport.getPeer()))
       
    46 
       
    47 
       
    48     def connectionLost (self, reason) :
       
    49         log.err(reason, "Module lost")
       
    50         
       
    51         if self.module :
       
    52             # drop it
       
    53             self.factory.nexus.unregisterModule(self.module, reason.getErrorMessage())
       
    54 
       
    55 
    32     @CmdModuleRegister.responder
    56     @CmdModuleRegister.responder
    33     def on_ModuleRegister (self, name) :
    57     def on_ModuleRegister (self, name) :
    34         # construct the ModuleInfo
    58         # construct the ModuleInfo
    35         mi = ModuleInfo()
    59         mi = ModuleInfo()
    36         mi.name = name
    60         mi.name = name
       
    61 
       
    62         log.msg("Module registered: %s" % (mi))
    37         
    63         
    38         # register
    64         # register
    39         self.factory.nexus.registerModule(mi, self)
    65         self.factory.nexus.registerModule(mi, self)
    40         self.module = mi
    66         self.module = mi
    41 
    67 
    50         # publish
    76         # publish
    51         self.factory.nexus.handleEvent(e)
    77         self.factory.nexus.handleEvent(e)
    52 
    78 
    53         # ok
    79         # ok
    54         return {}
    80         return {}
       
    81     
       
    82     @CmdModuleAbort.responder
       
    83     def on_ModuleAbort (self, msg) :
       
    84         # unhook
       
    85         module = self.module
       
    86         self.module = None
    55 
    87 
       
    88         # report
       
    89         self.factory.nexus.unregisterModule(self.module, msg)
       
    90         
       
    91         # XXX: stop accepting commands etc?
    56 
    92 
    57 class ClientProtocol (amp.AMP) :
    93 class ClientProtocol (amp.AMP) :
    58     """
    94     """
    59         Module-side command sender/handler
    95         Module-side command sender/handler
    60     """
    96     """
    66         """
   102         """
    67         
   103         
    68         # register
   104         # register
    69         self.sendModuleRegister(self.factory.name).addCallback(self._ModuleRegisterOK)
   105         self.sendModuleRegister(self.factory.name).addCallback(self._ModuleRegisterOK)
    70     
   106     
       
   107     def connectionLost (self, reason) :
       
   108         """
       
   109             Disconnected from nexus, for whatever reason...
       
   110         """
       
   111         
       
   112         log.err(reason, "API connection lost")
       
   113 
       
   114         # XXX: was this expected? Reconnect?
    71 
   115 
    72     def sendModuleRegister (self, name) :
   116     def sendModuleRegister (self, name) :
    73         """
   117         """
    74             Register with given module name
   118             Register with given module name
    75         """
   119         """
    90             Broadcast event to nexus
   134             Broadcast event to nexus
    91         """
   135         """
    92         
   136         
    93         self.callRemote(CmdModuleEvent, type=event.type, msg=event.msg)
   137         self.callRemote(CmdModuleEvent, type=event.type, msg=event.msg)
    94 
   138 
       
   139     def sendModuleAbort (self, msg) :
       
   140         """
       
   141             Send CmdModuleAbort - no response is expected
       
   142         """
    95 
   143 
       
   144         self.callRemote(CmdModuleAbort, msg=msg)
       
   145 
       
   146 
       
   147     def abort (self, msg) :
       
   148         """
       
   149             Send abort message and drop connection
       
   150         """
       
   151 
       
   152         # disconnect. This should leave the transport to flush buffers, and then call connectionLost
       
   153         # should also stop us from sending any more commands
       
   154         self.transport.loseConnection()
       
   155