Propagate commands
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user