diff options
-rw-r--r-- | snekbox.py | 44 |
1 files changed, 28 insertions, 16 deletions
@@ -1,6 +1,7 @@ import sys import io import json +import multiprocessing from logs import log from rmq import Rmq @@ -8,35 +9,46 @@ from rmq import Rmq rmq = Rmq() -def execute(snippet): +def execute(body): + msg = body.decode('utf-8') + log.info(f"incoming: {msg}") + + failed = False + old_stdout = sys.stdout redirected_output = sys.stdout = io.StringIO() - failed = False + try: - exec(snippet) + + snek_msg = json.loads(msg) + for snekid, snekcode in snek_msg.items(): + exec(snekcode) + except Exception as e: failed = str(e) + finally: sys.stdout = old_stdout if failed: - return failed.strip() - return redirected_output.getvalue().strip() + result = failed.strip() + + result = redirected_output.getvalue().strip() + + log.info(f"outgoing: {result}") + + rmq.publish(result, + queue=snekid, + routingkey=snekid, + exchange=snekid) + exit(0) def message_handler(ch, method, properties, body, thread_ws=None): - msg = body.decode('utf-8') + p = multiprocessing.Process(target=execute, args=(body,)) + p.daemon = True + p.start() - log.info(f"incoming: {msg}") - snek_msg = json.loads(msg) - - for snekid, snekcode in snek_msg.items(): - result = execute(snekcode) - log.info(f"outgoing: {result}") - rmq.publish(result, - queue=snekid, - routingkey=snekid, - exchange=snekid) ch.basic_ack(delivery_tag=method.delivery_tag) |