diff options
| author | 2018-05-24 21:45:25 +0200 | |
|---|---|---|
| committer | 2018-05-24 21:45:25 +0200 | |
| commit | 10a205e97d399d1736fd9c806e1e309bb31ff28d (patch) | |
| tree | 14ed25194db1f274e76a07fe0073db0e7d464a27 | |
| parent | update readme (diff) | |
generate new queue based on session id to lock user to their own event chain
Diffstat (limited to '')
| -rw-r--r-- | Pipfile | 3 | ||||
| -rw-r--r-- | Pipfile.lock | 10 | ||||
| -rw-r--r-- | snekbox.py | 9 | ||||
| -rw-r--r-- | snekweb.py | 76 | ||||
| -rw-r--r-- | templates/index.html | 19 | 
5 files changed, 73 insertions, 44 deletions
| @@ -12,13 +12,14 @@ flask = "*"  flask-sockets = "*"  gevent = "==1.2.2"  gevent-websocket = "*" +gunicorn = "*"  [requires]  python_version = "3.6"  [scripts]  snekbox = "python snekbox.py" -snekweb = "python snekweb.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 ."  buildweb = "docker build -t pythondiscord/snekboxweb:latest -f docker/Dockerfile.webapp ."  pushbox = "docker push pythondiscord/snekbox:latest" diff --git a/Pipfile.lock b/Pipfile.lock index 885f9c1..c580d4a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@  {      "_meta": {          "hash": { -            "sha256": "0a745b21e4db904bb3575c80d627ab80a3418bcb42e6e5c3695e914b88756114" +            "sha256": "e371feaf8cfbc6df9050701afd2f1c9be77630841f833962845421542640e825"          },          "pipfile-spec": 6,          "requires": { @@ -143,6 +143,14 @@              ],              "version": "==0.4.13"          }, +        "gunicorn": { +            "hashes": [ +                "sha256:7ef2b828b335ed58e3b64ffa84caceb0a7dd7c5ca12f217241350dec36a1d5dc", +                "sha256:bc59005979efb6d2dd7d5ba72d99f8a8422862ad17ff3a16e900684630dd2a10" +            ], +            "index": "pypi", +            "version": "==19.8.1" +        },          "idna": {              "hashes": [                  "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", @@ -3,6 +3,7 @@ import sys  import time  import pika  import io +import json  from rmq.consumer import consume  from rmq.publisher import publish @@ -39,9 +40,11 @@ def message_handler(ch, method, properties, body):      # Execute code snippets here      print(f"incoming: {msg}", flush=True) -    result = execute(msg) -    print(f"outgoing: {result}", flush=True) -    publish(result, host=HOST, queue=RETURN_QUEUE, routingkey=RETURN_ROUTING_KEY, exchange=RETURN_EXCHANGE, exchange_type=EXCHANGE_TYPE) +    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)      ch.basic_ack(delivery_tag = method.delivery_tag) @@ -2,6 +2,7 @@ import traceback  import queue  import threading  import time +import json  from rmq.publisher import publish  from rmq.consumer import consume @@ -19,50 +20,49 @@ from config import RETURN_QUEUE  from config import ROUTING_KEY  app = Flask(__name__) +app.jinja_env.auto_reload = True  sockets = Sockets(app) -RMQ_queue = queue.Queue(maxsize=0) -def message_handler(ch, method, properties, body): -    msg = body.decode('utf-8') -    print(f"incoming: {msg} from rabbitmq", flush=True) -    RMQ_queue.put(msg) -    ch.basic_ack(delivery_tag = method.delivery_tag) - -def relay_to_ws(ws): -    while not ws.closed: -        try: -            msg = RMQ_queue.get(False) -            if msg: -                print(f"sending {msg} to user", flush=True) -                ws.send(msg) -        except queue.Empty: -            time.sleep(0.1) -            pass - -t1 = threading.Thread(target=consume, kwargs={'host':HOST, 'queue':RETURN_QUEUE, 'callback':message_handler}) -t1.daemon = True -t1.start()  @app.route('/')  def index():      return render_template('index.html') [email protected]('/ws') -def websocket_route(ws): -    t2 = threading.Thread(target=relay_to_ws, args=(ws, )) -    t2.daemon = True -    t2.start() [email protected]('/ws/<snekboxid>') +def websocket_route(ws, snekboxid): +    RMQ_queue = queue.Queue(maxsize=0) + +    def message_handler(ch, method, properties, body): +        msg = body.decode('utf-8') +        RMQ_queue.put(msg) +        ch.basic_ack(delivery_tag = method.delivery_tag) + +    consumer = threading.Thread(target=consume, kwargs={'host':HOST, 'queue':snekboxid, 'callback':message_handler}) +    consumer.daemon = True +    consumer.start() + +    def relay_to_ws(ws): +        global client_list +        while True: +            try: +                msg = RMQ_queue.get(False) +                if msg: +                    ws.send(msg) +            except queue.Empty: +                time.sleep(0.1) +                pass + +    relay = threading.Thread(target=relay_to_ws, args=(ws,)) +    relay.daemon = True +    relay.start()      try:          while not ws.closed: -              message = ws.receive() - -            if not message: -                continue -            print(f"forwarding '{message}' to rabbitmq") - -            publish(message, host=HOST, queue=QUEUE, routingkey=ROUTING_KEY, exchange=EXCHANGE, exchange_type=EXCHANGE_TYPE) +            if 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)      except:          print(traceback.format_exc()) @@ -71,8 +71,8 @@ def websocket_route(ws):          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() diff --git a/templates/index.html b/templates/index.html index d0b0630..ef53d74 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3,9 +3,19 @@  <title>snekboxweb</title>  <script language="javascript" type="text/javascript"> +  let _ready = false +let snekbox_id  var output; +snekbox_id = sessionStorage.getItem("snekbox_id"); +console.log(snekbox_id) +if (snekbox_id == null) { +    snekbox_id = generate_id() +    sessionStorage.setItem("snekbox_id", snekbox_id) +    console.log(snekbox_id) +} +  function init(){      output = document.getElementById("output");      websocketHandler(); @@ -13,7 +23,7 @@ function init(){  function websocketHandler(){      var here = window.location.host; -    var wsUri = `ws://${here}/ws`; +    var wsUri = `ws://${here}/ws/`+snekbox_id;      websocket = new WebSocket(wsUri);      websocket.onopen = function(evt) { onOpen(evt) };      websocket.onclose = function(evt) { onClose(evt) }; @@ -77,6 +87,13 @@ function sendFromInput(){      sendMessage(msg)  } +function generate_id(){ +    return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); +} + + + +  window.addEventListener("load", init, false);  </script> | 
