Files
P80-Webserver/server.py
2025-09-15 00:15:49 +03:00

105 lines
3.0 KiB
Python

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)