Skip to content

Commit 6816c89

Browse files
author
Mike Stegeman
committed
Handle unload properly and flush stdout.
1 parent 2aeb77d commit 6816c89

File tree

4 files changed

+53
-38
lines changed

4 files changed

+53
-38
lines changed

gateway_addon/adapter.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""High-level Adapter base class implementation."""
22

33
from .addon_manager_proxy import AddonManagerProxy
4-
from .ipc import IpcClient
54

65

76
class Adapter:
@@ -28,19 +27,20 @@ def __init__(self, _id, package_name, verbose=False):
2827
# False in it's constructor.
2928
self.ready = True
3029

31-
self.ipc_client = IpcClient(self.id, verbose=verbose)
32-
self.manager_proxy = AddonManagerProxy(self.ipc_client.plugin_socket,
33-
self.id,
34-
verbose=verbose)
30+
self.manager_proxy = AddonManagerProxy(self.id, verbose=verbose)
3531
self.manager_proxy.add_adapter(self)
3632

33+
def proxy_running(self):
34+
"""Return boolean indicating whether or not the proxy is running."""
35+
return self.manager_proxy.running
36+
3737
def close_proxy(self):
3838
"""Close the manager proxy."""
3939
self.manager_proxy.close()
4040

4141
def dump(self):
4242
"""Dump the state of the adapter to the log."""
43-
print('Adapter:', self.name, '- dump() not implemented')
43+
print('Adapter:', self.name, '- dump() not implemented', flush=True)
4444

4545
def get_id(self):
4646
"""
@@ -130,11 +130,13 @@ def start_pairing(self, timeout):
130130
131131
timeout -- Timeout in seconds at which to quit pairing
132132
"""
133-
print('Adapter:', self.name, 'id', self.id, 'pairing started')
133+
print('Adapter:', self.name, 'id', self.id, 'pairing started',
134+
flush=True)
134135

135136
def cancel_pairing(self):
136137
"""Cancel the pairing process."""
137-
print('Adapter:', self.name, 'id', self.id, 'pairing cancelled')
138+
print('Adapter:', self.name, 'id', self.id, 'pairing cancelled',
139+
flush=True)
138140

139141
def remove_thing(self, device_id):
140142
"""
@@ -145,7 +147,8 @@ def remove_thing(self, device_id):
145147
device = self.get_device(device_id)
146148
if device:
147149
print('Adapter:', self.name, 'id', self.id,
148-
'remove_thing(' + device.id + ')')
150+
'remove_thing(' + device.id + ')',
151+
flush=True)
149152

150153
def cancel_remove_thing(self, device_id):
151154
"""
@@ -156,8 +159,9 @@ def cancel_remove_thing(self, device_id):
156159
device = self.get_device(device_id)
157160
if device:
158161
print('Adapter:', self.name, 'id', self.id,
159-
'cancel_remove_thing(' + device.id + ')')
162+
'cancel_remove_thing(' + device.id + ')',
163+
flush=True)
160164

161165
def unload(self):
162166
"""Perform any necessary cleanup before adapter is shut down."""
163-
print('Adapter:', self.name, 'unloaded')
167+
print('Adapter:', self.name, 'unloaded', flush=True)

gateway_addon/addon_manager_proxy.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import json
55
import threading
66

7+
from .ipc import IpcClient
8+
79

810
class AddonManagerProxy:
911
"""
@@ -13,16 +15,15 @@ class AddonManagerProxy:
1315
to be handled by add-ons and sends back responses as appropriate.
1416
"""
1517

16-
def __init__(self, socket, plugin_id, verbose=False):
18+
def __init__(self, plugin_id, verbose=False):
1719
"""
1820
Initialize the object.
1921
20-
socket -- the IPC socket
2122
plugin_id -- ID of this plugin
2223
verbose -- whether or not to enable verbose logging
2324
"""
2425
self.adapter = None
25-
self.socket = socket
26+
self.ipc_client = IpcClient(plugin_id, verbose=verbose)
2627
self.plugin_id = plugin_id
2728
self.verbose = verbose
2829
self.running = True
@@ -35,7 +36,8 @@ def close(self):
3536
self.running = False
3637

3738
try:
38-
self.socket.close()
39+
self.ipc_client.manager_socket.close()
40+
self.ipc_client.plugin_socket.close()
3941
except NNError:
4042
pass
4143

@@ -46,12 +48,13 @@ def add_adapter(self, adapter):
4648
adapter -- the Adapter that was added
4749
"""
4850
if self.verbose:
49-
print('AddonManagerProxy: add_adapter:', adapter.id)
51+
print('AddonManagerProxy: add_adapter:', adapter.id, flush=True)
5052

5153
self.adapter = adapter
5254
self.send('addAdapter', {
5355
'adapterId': adapter.id,
54-
'name': adapter.name
56+
'name': adapter.name,
57+
'packageName': adapter.package_name,
5558
})
5659

5760
def handle_device_added(self, device):
@@ -61,7 +64,8 @@ def handle_device_added(self, device):
6164
device -- the Device that was added
6265
"""
6366
if self.verbose:
64-
print('AddonManagerProxy: handle_device_added:', device.id)
67+
print('AddonManagerProxy: handle_device_added:', device.id,
68+
flush=True)
6569

6670
device_dict = device.as_dict()
6771
device_dict['adapterId'] = device.adapter.id
@@ -74,7 +78,8 @@ def handle_device_removed(self, device):
7478
device -- the Device that was removed
7579
"""
7680
if self.verbose:
77-
print('AddonManagerProxy: handle_device_removed:', device.id)
81+
print('AddonManagerProxy: handle_device_removed:', device.id,
82+
flush=True)
7883

7984
self.send('handleDeviceRemoved', {
8085
'adapterId': device.adapter.id,
@@ -106,42 +111,44 @@ def send(self, msg_type, data):
106111
data['pluginId'] = self.plugin_id
107112

108113
try:
109-
self.socket.send(json.dumps({
114+
self.ipc_client.plugin_socket.send(json.dumps({
110115
'messageType': msg_type,
111116
'data': data,
112117
}))
113118
except NNError as e:
114-
print('AddonManagerProxy: Failed to send message: {}'.format(e))
119+
print('AddonManagerProxy: Failed to send message: {}'.format(e),
120+
flush=True)
115121

116122
def recv(self):
117123
"""Read a message from the IPC socket."""
118124
while self.running:
119125
try:
120-
msg = self.socket.recv()
126+
msg = self.ipc_client.plugin_socket.recv()
121127
except NNError as e:
122128
print('AddonManagerProxy: Error receiving message from '
123-
'socket: {}'.format(e))
129+
'socket: {}'.format(e), flush=True)
124130
break
125131

126132
if self.verbose:
127-
print('AddonMangerProxy: recv:', msg)
133+
print('AddonMangerProxy: recv:', msg, flush=True)
128134

129135
if not msg:
130136
break
131137

132138
if not self.adapter:
133139
print('AddonManagerProxy: No adapter added yet, ignoring '
134-
'message.')
140+
'message.', flush=True)
135141
continue
136142

137143
try:
138144
msg = json.loads(msg)
139145
except ValueError:
140-
print('AddonManagerProxy: Error parsing message as JSON')
146+
print('AddonManagerProxy: Error parsing message as JSON',
147+
flush=True)
141148
continue
142149

143150
if 'messageType' not in msg:
144-
print('AddonManagerProxy: Invalid message')
151+
print('AddonManagerProxy: Invalid message', flush=True)
145152
continue
146153

147154
msg_type = msg['messageType']
@@ -160,19 +167,20 @@ def recv(self):
160167
def unload_fn(proxy):
161168
proxy.adapter.unload()
162169
proxy.send('adapterUnloaded',
163-
{'adapterId', proxy.adapter.id})
170+
{'adapterId': proxy.adapter.id})
164171

165172
self.make_thread(unload_fn, args=(self,))
166173
continue
167174

168175
if msg_type == 'unloadPlugin':
169176
self.send('pluginUnloaded', {})
170-
continue
177+
self.close()
178+
break
171179

172180
# All messages from here on are assumed to require a valid deviceId
173181
if 'data' not in msg or 'deviceId' not in msg['data']:
174182
print('AddonManagerProxy: No deviceId present in message, '
175-
'ignoring.')
183+
'ignoring.', flush=True)
176184
continue
177185

178186
device_id = msg['data']['deviceId']

gateway_addon/ipc.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __init__(self, plugin_id, verbose=False):
2323
self.manager_socket.connect(_IPC_BASE + 'gateway.addonManager')
2424

2525
if verbose:
26-
print('IpcClient: Connected to server, registering...')
26+
print('IpcClient: Connected to server, registering...', flush=True)
2727

2828
try:
2929
self.manager_socket.send(json.dumps({
@@ -33,17 +33,20 @@ def __init__(self, plugin_id, verbose=False):
3333
}
3434
}))
3535
except NNError as e:
36-
print('IpcClient: Failed to send message: {}'.format(e))
36+
print('IpcClient: Failed to send message: {}'.format(e),
37+
flush=True)
3738
return
3839

3940
try:
4041
resp = self.manager_socket.recv()
4142
except NNError as e:
42-
print('IpcClient: Error receiving message: {}'.format(e))
43+
print('IpcClient: Error receiving message: {}'.format(e),
44+
flush=True)
4345
return
4446

4547
if verbose:
46-
print('IpcClient: Received manager message:', resp)
48+
print('IpcClient: Received manager message: {}'.format(resp),
49+
flush=True)
4750

4851
try:
4952
resp = json.loads(resp)
@@ -56,7 +59,7 @@ def __init__(self, plugin_id, verbose=False):
5659
_IPC_BASE + resp['data']['ipcBaseAddr'])
5760

5861
if verbose:
59-
print('IpcClient: Registered with PluginServer')
62+
print('IpcClient: Registered with PluginServer', flush=True)
6063
except ValueError:
61-
print('IpcClient: Unexpected registration reply from gateway:',
62-
resp)
64+
print('IpcClient: Unexpected registration reply from gateway: {}'
65+
.format(resp), flush=True)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
setup(
1515
name='gateway_addon',
16-
version='0.1.0',
16+
version='0.2.0',
1717
description='Bindings for Mozilla IoT Gateway add-ons',
1818
long_description=long_description,
1919
url='https://github.com/mozilla-iot/gateway-addon-python',

0 commit comments

Comments
 (0)