diff options
| author | 2018-05-25 14:21:10 +0200 | |
|---|---|---|
| committer | 2018-05-25 14:21:10 +0200 | |
| commit | 85dbc20a80a2b4c233708be1460da7909e205388 (patch) | |
| tree | 36d98fca1d490ffe4af0b07defe979389fbe5390 | |
| parent | generate new queue based on session id to lock user to their own event chain (diff) | |
lint
| -rw-r--r-- | Pipfile | 2 | ||||
| -rw-r--r-- | Pipfile.lock | 31 | ||||
| -rw-r--r-- | config.py | 4 | ||||
| -rw-r--r-- | rmq/consumer.py | 11 | ||||
| -rw-r--r-- | rmq/publisher.py | 21 | ||||
| -rw-r--r-- | snekbox.py | 23 | ||||
| -rw-r--r-- | snekweb.py | 30 | 
7 files changed, 87 insertions, 35 deletions
| @@ -13,11 +13,13 @@ flask-sockets = "*"  gevent = "==1.2.2"  gevent-websocket = "*"  gunicorn = "*" +"flake8" = "*"  [requires]  python_version = "3.6"  [scripts] +lint = "flake8"  snekbox = "python snekbox.py"  snekweb = "gunicorn -w 1 -b 0.0.0.0:5000 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker snekweb:app"  buildbox = "docker build -t pythondiscord/snekbox:latest -f docker/Dockerfile ." diff --git a/Pipfile.lock b/Pipfile.lock index c580d4a..7bb08b6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@  {      "_meta": {          "hash": { -            "sha256": "e371feaf8cfbc6df9050701afd2f1c9be77630841f833962845421542640e825" +            "sha256": "293e67cbad98e54a08d90526cb01eb524040819f89b942beff3425d7442d0ba9"          },          "pipfile-spec": 6,          "requires": { @@ -62,6 +62,14 @@              ],              "version": "==0.2.3"          }, +        "flake8": { +            "hashes": [ +                "sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0", +                "sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37" +            ], +            "index": "pypi", +            "version": "==3.5.0" +        },          "flask": {              "hashes": [                  "sha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48", @@ -177,6 +185,27 @@              ],              "version": "==1.0"          }, +        "mccabe": { +            "hashes": [ +                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", +                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" +            ], +            "version": "==0.6.1" +        }, +        "pycodestyle": { +            "hashes": [ +                "sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766", +                "sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9" +            ], +            "version": "==2.3.1" +        }, +        "pyflakes": { +            "hashes": [ +                "sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f", +                "sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805" +            ], +            "version": "==1.6.0" +        },          "requests": {              "hashes": [                  "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", @@ -1,5 +1,6 @@  import os +  def attempt_automatically_finding_the_ip_of_rmq():      try:          import docker @@ -7,9 +8,10 @@ def attempt_automatically_finding_the_ip_of_rmq():          containers = client.containers.get('snekbox_pdrmq_1')          HOST = list(containers.attrs.get('NetworkSettings').get('Networks').values())[0]['IPAddress']          return HOST -    except: +    except Exception:          return '172.17.0.2' +  USERNAME = 'guest'  PASSWORD = 'guest'  HOST = os.environ.get('RMQ_HOST', attempt_automatically_finding_the_ip_of_rmq()) diff --git a/rmq/consumer.py b/rmq/consumer.py index 8e1ce2b..2c41e26 100644 --- a/rmq/consumer.py +++ b/rmq/consumer.py @@ -3,7 +3,14 @@ import traceback  import pika  from pika.exceptions import ConnectionClosed -def consume(username='guest', password='guest', host='localhost', port=5672, queue='', callback=None): + +def consume(username='guest', +            password='guest', +            host='localhost', +            port=5672, +            queue='', +            callback=None): +      while True:          credentials = pika.PlainCredentials(username, password)          con_params = pika.ConnectionParameters(host, port, '/', credentials) @@ -21,7 +28,7 @@ def consume(username='guest', password='guest', host='localhost', port=5672, que                  channel.start_consuming() -            except: +            except Exception:                  exc = traceback.format_exc()                  print(exc, flush=True) diff --git a/rmq/publisher.py b/rmq/publisher.py index 4ba9db9..1a9a5cf 100644 --- a/rmq/publisher.py +++ b/rmq/publisher.py @@ -1,6 +1,16 @@  import pika -def publish(message, username='guest', password='guest', host='localhost', port=5672, queue='', routingkey='', exchange='', exchange_type=''): + +def publish(message, +            username='guest', +            password='guest', +            host='localhost', +            port=5672, +            queue='', +            routingkey='', +            exchange='', +            exchange_type=''): +      credentials = pika.PlainCredentials(username, password)      connection = pika.BlockingConnection(pika.ConnectionParameters(host, port, '/', credentials))      properties = pika.BasicProperties(content_type='text/plain', delivery_mode=1) @@ -11,10 +21,10 @@ def publish(message, username='guest', password='guest', host='localhost', port=      channel.queue_bind(exchange=exchange, queue=queue, routing_key=routingkey)      result = channel.basic_publish( -                exchange=exchange, -                routing_key=routingkey, -                body=message, -                properties=properties +        exchange=exchange, +        routing_key=routingkey, +        body=message, +        properties=properties      )      if result: @@ -23,4 +33,3 @@ def publish(message, username='guest', password='guest', host='localhost', port=          print("not delivered")      connection.close() - @@ -1,23 +1,14 @@ -import traceback  import sys -import time -import pika  import io  import json  from rmq.consumer import consume  from rmq.publisher import publish -from config import USERNAME -from config import PASSWORD  from config import HOST -from config import PORT -from config import EXCHANGE  from config import EXCHANGE_TYPE  from config import QUEUE -from config import RETURN_QUEUE -from config import RETURN_EXCHANGE -from config import RETURN_ROUTING_KEY +  def execute(snippet):      old_stdout = sys.stdout @@ -38,15 +29,21 @@ def execute(snippet):  def message_handler(ch, method, properties, body):      msg = body.decode('utf-8') -    # Execute code snippets here      print(f"incoming: {msg}", flush=True)      snek_msg = json.loads(msg) +      for snekid, snekcode in snek_msg.items():          result = execute(snekcode)          print(f"outgoing: {result}", flush=True) -        publish(result, host=HOST, queue=snekid, routingkey=snekid, exchange=snekid, exchange_type=EXCHANGE_TYPE) +        publish(result, +                host=HOST, +                queue=snekid, +                routingkey=snekid, +                exchange=snekid, +                exchange_type=EXCHANGE_TYPE) + +    ch.basic_ack(delivery_tag=method.delivery_tag) -    ch.basic_ack(delivery_tag = method.delivery_tag)  if __name__ == '__main__':      consume(host=HOST, queue=QUEUE, callback=message_handler) @@ -12,11 +12,9 @@ from flask import render_template  from flask_sockets import Sockets  from config import HOST -from config import PORT  from config import EXCHANGE  from config import EXCHANGE_TYPE  from config import QUEUE -from config import RETURN_QUEUE  from config import ROUTING_KEY  app = Flask(__name__) @@ -28,6 +26,7 @@ sockets = Sockets(app)  def index():      return render_template('index.html') +  @sockets.route('/ws/<snekboxid>')  def websocket_route(ws, snekboxid):      RMQ_queue = queue.Queue(maxsize=0) @@ -35,9 +34,10 @@ def websocket_route(ws, snekboxid):      def message_handler(ch, method, properties, body):          msg = body.decode('utf-8')          RMQ_queue.put(msg) -        ch.basic_ack(delivery_tag = method.delivery_tag) +        ch.basic_ack(delivery_tag=method.delivery_tag) -    consumer = threading.Thread(target=consume, kwargs={'host':HOST, 'queue':snekboxid, 'callback':message_handler}) +    consumer_parameters = {'host': HOST, 'queue': snekboxid, 'callback': message_handler} +    consumer = threading.Thread(target=consume, kwargs=consumer_parameters)      consumer.daemon = True      consumer.start() @@ -60,19 +60,25 @@ def websocket_route(ws, snekboxid):          while not ws.closed:              message = ws.receive()              if message: -                snek_msg = json.dumps({snekboxid:message}) +                snek_msg = json.dumps({snekboxid: message})                  print(f"forwarding {snek_msg} to rabbitmq") -                publish(snek_msg, host=HOST, queue=QUEUE, routingkey=ROUTING_KEY, exchange=EXCHANGE, exchange_type=EXCHANGE_TYPE) +                publish(snek_msg, +                        host=HOST, +                        queue=QUEUE, +                        routingkey=ROUTING_KEY, +                        exchange=EXCHANGE, +                        exchange_type=EXCHANGE_TYPE) -    except: +    except Exception:          print(traceback.format_exc())      finally:          if not ws.closed:              ws.close() -# if __name__ == '__main__': -#     from gevent import pywsgi -#     from geventwebsocket.handler import WebSocketHandler -#     server = pywsgi.WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler) -#     server.serve_forever() + +if __name__ == '__main__': +    from gevent import pywsgi +    from geventwebsocket.handler import WebSocketHandler +    server = pywsgi.WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler) +    server.serve_forever() | 
