From 647001546a59fb844540c20cd8de496e2c3d3681 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Thu, 17 Apr 2014 12:36:34 -0400 Subject: [PATCH] Support ssl listener for socketio service, add such service to setup playbook, add handler for external notifications, implement basic namespaces for other supported events --- .../commands/run_socketio_service.py | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/awx/main/management/commands/run_socketio_service.py b/awx/main/management/commands/run_socketio_service.py index ea9000d3d8..61112ea1a7 100644 --- a/awx/main/management/commands/run_socketio_service.py +++ b/awx/main/management/commands/run_socketio_service.py @@ -35,7 +35,18 @@ class TestNamespace(BaseNamespace): def recv_connect(self): print("Received client connect for test namespace from %s" % str(self.environ['REMOTE_ADDR'])) - #print("Env: " + str(self.environ)) + self.emit('connect', True) + +class JobNamespace(BaseNamespace): + + def recv_connect(self): + print("Received client connect for job namespace from %s" % str(self.environ['REMOTE_ADDR'])) + self.emit('connect', True) + +class JobEventNamespace(BaseNamespace): + + def recv_connect(self): + print("Received client connect for job event namespace from %s" % str(self.environ['REMOTE_ADDR'])) self.emit('connect', True) class TowerSocket(object): @@ -51,6 +62,17 @@ class TowerSocket(object): start_response('404 Not Found', []) return ['

Not Found

'] +def notification_handler(bind_port, server): + handler_context = zmq.Context() + handler_socket = handler_context.socket(zmq.PULL) + handler_socket.bind(bind_port) + + while True: + message = handler_socket.recv_json() + packet = dict(type='event', name=message['event'], endpoint=message['endpoint'], args=message) + for session_id, socket in server.sockets.iteritems(): + socket.send_packet(packet) + class Command(NoArgsCommand): ''' SocketIO event emitter Tower service @@ -80,9 +102,16 @@ class Command(NoArgsCommand): self.init_logging() socketio_listen_port = settings.SOCKETIO_LISTEN_PORT socketio_notification_port = settings.SOCKETIO_NOTIFICATION_PORT + try: - print 'Listening on port http://0.0.0.0:' + str(socketio_listen_port) - server = SocketIOServer(('0.0.0.0', socketio_listen_port), TowerSocket(), resource='socket.io') + if os.path.exists('/etc/awx/awx.cert') and os.path.exists('/etc/awx/awx.key'): + print 'Listening on port https://0.0.0.0:' + str(socketio_listen_port) + server = SocketIOServer(('0.0.0.0', socketio_listen_port), TowerSocket(), resource='socket.io', + keyfiles='/etc/awx/awx.key', certfile='/etc/awx/awx.cert') + else: + print 'Listening on port http://0.0.0.0:' + str(socketio_listen_port) + server = SocketIOServer(('0.0.0.0', socketio_listen_port), TowerSocket(), resource='socket.io') + gevent.spawn(notification_handler, socketio_notification_port, server) server.serve_forever() except KeyboardInterrupt: pass