Split master and slave websockets. Pass through reports.
This commit is contained in:
@@ -28,6 +28,11 @@ parser.add_argument(
|
|||||||
dest='https_client_key',
|
dest='https_client_key',
|
||||||
action='store',
|
action='store',
|
||||||
required=True)
|
required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
'--image-type',
|
||||||
|
dest='image_type',
|
||||||
|
action='store',
|
||||||
|
required=True)
|
||||||
FLAGS = parser.parse_args()
|
FLAGS = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +47,7 @@ class Client(threadedclient.WebSocketClient):
|
|||||||
'data': {
|
'data': {
|
||||||
'hostname': socket.gethostname(),
|
'hostname': socket.gethostname(),
|
||||||
'uptime_seconds': self._Uptime(),
|
'uptime_seconds': self._Uptime(),
|
||||||
|
'image_type': FLAGS.image_type,
|
||||||
},
|
},
|
||||||
}), False)
|
}), False)
|
||||||
time.sleep(5.0)
|
time.sleep(5.0)
|
||||||
@@ -50,6 +56,11 @@ class Client(threadedclient.WebSocketClient):
|
|||||||
with open('/proc/uptime', 'r') as fh:
|
with open('/proc/uptime', 'r') as fh:
|
||||||
return int(float(fh.readline().split(' ', 1)[0]))
|
return int(float(fh.readline().split(' ', 1)[0]))
|
||||||
|
|
||||||
|
def received_message(self, msg):
|
||||||
|
parsed = json.loads(str(msg))
|
||||||
|
if parsed['type'] == 'image_types':
|
||||||
|
assert FLAGS.image_type in parsed['data']['image_types']
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
ssl_options = {
|
ssl_options = {
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import pyinotify
|
|||||||
import ssl
|
import ssl
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
|
import uuid
|
||||||
from ws4py import websocket
|
from ws4py import websocket
|
||||||
from ws4py.server import geventserver
|
from ws4py.server import geventserver
|
||||||
from ws4py.server import wsgiutils
|
from ws4py.server import wsgiutils
|
||||||
@@ -58,11 +60,17 @@ class WebSockets(object):
|
|||||||
self.masters = set()
|
self.masters = set()
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return iter(self.slaves + self.masters)
|
return iter(self.slaves | self.masters)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def Broadcast(targets, msg):
|
||||||
|
msgstr = json.dumps(msg)
|
||||||
|
for target in targets:
|
||||||
|
target.send(msgstr, False)
|
||||||
|
|
||||||
|
|
||||||
class BaseWSHandler(websocket.WebSocket):
|
class BaseWSHandler(websocket.WebSocket):
|
||||||
def opened(self):
|
def opened(self, image_types):
|
||||||
self.send(json.dumps({
|
self.send(json.dumps({
|
||||||
'type': 'image_types',
|
'type': 'image_types',
|
||||||
'data': {
|
'data': {
|
||||||
@@ -74,29 +82,38 @@ class BaseWSHandler(websocket.WebSocket):
|
|||||||
def GetSlaveWSHandler(image_types, websockets):
|
def GetSlaveWSHandler(image_types, websockets):
|
||||||
class SlaveWSHandler(BaseWSHandler):
|
class SlaveWSHandler(BaseWSHandler):
|
||||||
def opened(self):
|
def opened(self):
|
||||||
super().opened(self)
|
super().opened(image_types)
|
||||||
websockets.slave.add(self)
|
websockets.slaves.add(self)
|
||||||
|
|
||||||
def closed(self, code, reason=None):
|
def closed(self, code, reason=None):
|
||||||
websockets.slave.remove(self)
|
websockets.slaves.remove(self)
|
||||||
|
|
||||||
def received_message(self, msg):
|
def received_message(self, msg):
|
||||||
print('from slave:', json.loads(str(msg)))
|
parsed = json.loads(str(msg))
|
||||||
|
if parsed['type'] == 'report':
|
||||||
|
newmsg = {
|
||||||
|
'type': 'report',
|
||||||
|
'id': str(uuid.uuid4()),
|
||||||
|
'received': int(time.time()),
|
||||||
|
'client': self.peer_address,
|
||||||
|
'data': parsed['data'],
|
||||||
|
}
|
||||||
|
websockets.Broadcast(websockets.masters, newmsg)
|
||||||
|
|
||||||
return SlaveWSHandler
|
return SlaveWSHandler
|
||||||
|
|
||||||
|
|
||||||
def GetMasterWSHandler(image_types, websockets):
|
def GetMasterWSHandler(image_types, websockets):
|
||||||
class MasterWSHandler(websocket.WebSocket):
|
class MasterWSHandler(BaseWSHandler):
|
||||||
def opened(self):
|
def opened(self):
|
||||||
super().opened(self)
|
super().opened(image_types)
|
||||||
websockets.master.add(self)
|
websockets.masters.add(self)
|
||||||
|
|
||||||
def closed(self, code, reason=None):
|
def closed(self, code, reason=None):
|
||||||
websockets.master.remove(self)
|
websockets.masters.remove(self)
|
||||||
|
|
||||||
def received_message(self, msg):
|
def received_message(self, msg):
|
||||||
print('from master:', json.loads(str(msg)))
|
pass
|
||||||
|
|
||||||
return MasterWSHandler
|
return MasterWSHandler
|
||||||
|
|
||||||
@@ -109,13 +126,12 @@ class INotifyHandler(pyinotify.ProcessEvent):
|
|||||||
if event.name != 'manifest.json':
|
if event.name != 'manifest.json':
|
||||||
return
|
return
|
||||||
image_type = os.path.basename(event.path)
|
image_type = os.path.basename(event.path)
|
||||||
for websocket in self._websockets:
|
self._websockets.Broadcast(self._websockets, {
|
||||||
websocket.send(json.dumps({
|
'type': 'new_manifest',
|
||||||
'type': 'new_manifest',
|
'data': {
|
||||||
'data': {
|
'image_type': image_type,
|
||||||
'image_type': image_type,
|
},
|
||||||
},
|
})
|
||||||
}), False)
|
|
||||||
|
|
||||||
|
|
||||||
class HTTPRequestHandler(object):
|
class HTTPRequestHandler(object):
|
||||||
|
|||||||
Reference in New Issue
Block a user