from os import environ import argparse from flask import Flask, request, make_response, send_from_directory, jsonify from config import PrinterConfig argument_parser = argparse.ArgumentParser() argument_parser.add_argument("--address", type=str, required=False, default="0.0.0.0") argument_parser.add_argument("--port", type=int, required=False, default=8005) args = argument_parser.parse_args() printer_config = PrinterConfig() app = Flask(__name__) @app.route("/") def index_route(): return send_from_directory("static", "index.html") @app.route("/config", methods=["GET", "POST"]) def config_route(): request_type = None if "Accept" in request.headers: if "text/html" in request.headers["Accept"]: request_type = "html" elif "application/json" in request.headers["Accept"]: request_type = "json" print(request_type) if request.method == "GET" and request_type == "html": # return config html page return send_from_directory("static", "config.html") elif request.method == "GET" and request_type == "json": # render config as JSON print(get_config()) return jsonify(get_config()) elif request.method == "POST" and request.is_json: # accept JSON form with new parameters errors = {"critical": False, "errors": {}} try: request_data = request.json print(request_data) except Exception: errors["errors"]["json"] = "Could not decode message as json" errors["critical"] = True request_params = {} if "address" in request_data: request_params["address"] = request_data["address"] if "port" in request_data: port = request_data["port"] if isinstance(port, int) and 0 < port <= 65535: request_params["port"] = port else: errors["errors"]["parseint"] = "Could not parse port number as an integer" errors["critical"] = True response = jsonify(errors) if errors["critical"]: response.status_code = 422 else: response.status_code = 200 set_config(**request_params) return response def get_config(): return { "address": printer_config.printer_address, "port": printer_config.printer_port, "profile": printer_config.printer_profile, "can_print": can_print(), } def set_config(address: str = None, port: int = None): if address is None: printer_config.printer_address = None else: printer_config.printer_address = address if port is None: printer_config.printer_port = 9100 else: printer_config.printer_port = port def can_print(): return printer_config.complete if __name__ == "__main__": try: printer_config.load() except FileNotFoundError: pass try: app.run(host=args.address, port=args.port) except KeyboardInterrupt: pass printer_config.save() exit(0)