Propagate commands

This commit is contained in:
Ian Gulliver
2016-05-11 00:32:29 +00:00
parent 4b98a66dd0
commit bd320caee8

View File

@@ -58,6 +58,7 @@ class WebSockets(object):
def __init__(self): def __init__(self):
self.slaves = set() self.slaves = set()
self.masters = set() self.masters = set()
self.targets = {}
def __iter__(self): def __iter__(self):
return iter(self.slaves | self.masters) return iter(self.slaves | self.masters)
@@ -66,7 +67,7 @@ class WebSockets(object):
def Broadcast(targets, msg): def Broadcast(targets, msg):
msgstr = json.dumps(msg) msgstr = json.dumps(msg)
for target in targets: for target in targets:
target.send(msgstr, False) target.send(msgstr)
class BaseWSHandler(websocket.WebSocket): class BaseWSHandler(websocket.WebSocket):
@@ -76,10 +77,12 @@ class BaseWSHandler(websocket.WebSocket):
'data': { 'data': {
'image_types': list(image_types), 'image_types': list(image_types),
}, },
}), False) }))
def GetSlaveWSHandler(image_types, websockets): def GetSlaveWSHandler(image_types, websockets):
_hostname = None
class SlaveWSHandler(BaseWSHandler): class SlaveWSHandler(BaseWSHandler):
def opened(self): def opened(self):
super().opened(image_types) super().opened(image_types)
@@ -87,6 +90,8 @@ def GetSlaveWSHandler(image_types, websockets):
def closed(self, code, reason=None): def closed(self, code, reason=None):
websockets.slaves.remove(self) websockets.slaves.remove(self)
if self._hostname:
del websockets.targets[self._hostname]
def received_message(self, msg): def received_message(self, msg):
parsed = json.loads(str(msg)) parsed = json.loads(str(msg))
@@ -100,6 +105,10 @@ def GetSlaveWSHandler(image_types, websockets):
} }
websockets.Broadcast(websockets.masters, newmsg) websockets.Broadcast(websockets.masters, newmsg)
if 'hostname' in parsed['data']:
self._hostname = parsed['data']['hostname']
websockets.targets[self._hostname] = self
return SlaveWSHandler return SlaveWSHandler
@@ -113,7 +122,20 @@ def GetMasterWSHandler(image_types, websockets):
websockets.masters.remove(self) websockets.masters.remove(self)
def received_message(self, msg): def received_message(self, msg):
pass parsed = json.loads(str(msg))
if parsed['type'] == 'command':
target = parsed['target']
if target not in websockets.targets:
return
newmsg = {
'type': 'command',
'target': target,
'id': str(uuid.uuid4()),
'received': int(time.time()),
'client': self.peer_address,
'data': parsed['data'],
}
websockets.targets[target].send(json.dumps(newmsg))
return MasterWSHandler return MasterWSHandler