import os from http.server import HTTPServer, BaseHTTPRequestHandler from db import init_settings_db, get_setting, set_setting from config import SPEEDTEST_ENABLED GRAFANA_PORT = os.getenv("GRAFANA_PORT", "3000") PAGE = """
Speedtests are {state}
A speedtest briefly uses the full connection about every 15 minutes. Turn them off while gaming or in calls, and back on afterwards.
""" def speedtests_on() -> bool: return get_setting("speedtest_enabled") == "1" class Handler(BaseHTTPRequestHandler): def grafana_url(self) -> str: host = self.headers.get("Host", "localhost") if host.startswith("["): # IPv6 literal like [::1]:80 host = host.split("]")[0] + "]" else: host = host.split(":")[0] # kiosk mode shows just the dashboard without the Grafana UI around it; # Escape exits it for anyone who wants the full interface return f"http://{host}:{GRAFANA_PORT}/d/speed-tests-v2?kiosk" def do_GET(self): if self.path != "/": self.send_error(404) return on = speedtests_on() body = PAGE.format( cls="on" if on else "off", state="ON" if on else "OFF", btn_cls="turn-off" if on else "turn-on", btn_label="Turn off" if on else "Turn on", grafana_url=self.grafana_url(), ).encode() self.send_response(200) self.send_header("Content-Type", "text/html; charset=utf-8") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) def do_POST(self): if self.path != "/toggle": self.send_error(404) return set_setting("speedtest_enabled", "0" if speedtests_on() else "1") self.send_response(303) self.send_header("Location", "/") self.end_headers() def run(port: int = 80): init_settings_db() # Seed the toggle from the env var on first start; after that the DB row # written by the toggle button is the single source of truth. if get_setting("speedtest_enabled") is None: set_setting("speedtest_enabled", "1" if SPEEDTEST_ENABLED else "0") server = HTTPServer(("", port), Handler) print(f"Control page listening on :{port}", flush=True) server.serve_forever() if __name__ == "__main__": run()