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 |