import logging import threading import json import time from queue import Queue, Empty from flask import Flask, jsonify, request from waitress import serve HOST_ADDRESS = "192.168.1.191" PORT_ADDRESS = 5000 OUT_COMM_Q = Queue() IN_COMM_Q = Queue() awaiting_q = [] incoming_q = Queue() app = Flask(__name__) @app.route("/conjurer", methods=["POST"]) def answer_external_command(): app.logger.info(request) record = json.loads(request.data) app.logger.info(record) app.logger.info("DATA RECEIVED") incoming_q.put(record) return jsonify("SUCCESS") @app.route("/conjurer", methods=["GET"]) def check_alive(): return jsonify("ALIVE") def flask_debug(_logger): """ The `flask_debug` function starts a Flask application in debug mode without using the reloader. Do not use for production for fucks sake. """ _logger.info("Attempt debug") # trunk-ignore(bandit/B201) app.run(debug=True, use_reloader=False, host=HOST_ADDRESS, port=PORT_ADDRESS) def waitress_run(_logger): """ The `waitress_run` function serves the `app` on host "0.0.0.0" and port 5000 using the Waitress WSGI server. """ _logger.info("Attempt waitress") serve(app, host=HOST_ADDRESS, port=PORT_ADDRESS) def scan_queue(_logger): while True: data = OUT_COMM_Q.get() _logger.info(data) awaiting_q.append(data) def scan_incoming(_logger): while True: try: answer = incoming_q.get(block=False) _logger.info("DATA FOUND") for record in awaiting_q: if record.uuid in answer.keys(): record.stop = True record.entries = answer[record.uuid] IN_COMM_Q.put(record) except Empty: time.sleep(1) def comm_subroutine(logger): #logger.setLevel(logging.DEBUG) logger.info("Started") threads = [] #threads.append(threading.Thread(target=flask_debug, args=(logger,))) threads.append(threading.Thread(target=waitress_run, args=(logger,))) threads.append(threading.Thread(target=scan_queue,args=(logger,))) threads.append(threading.Thread(target=scan_incoming,args=(logger,))) for worker in threads: worker.start() for worker in threads: worker.join() if __name__ == "__main__": logging_client = logging.getLogger(__name__) comm_subroutine(logging_client)