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) | 
