from fastapi import APIRouter, Form, Request from fastapi.responses import HTMLResponse from gui.state import runner, templates router = APIRouter(prefix="/system") @router.get("/firewall", response_class=HTMLResponse) async def firewall_page(request: Request): code, out, _ = await runner.run("sudo ufw status verbose") return templates.TemplateResponse( "system/firewall.html", { "request": request, "active": "system", "status": out, }, ) @router.post("/firewall/enable") async def firewall_enable(): code, out, err = await runner.run("sudo ufw --force enable") return {"ok": code == 0, "output": out or err} @router.post("/firewall/disable") async def firewall_disable(): code, out, err = await runner.run("sudo ufw disable") return {"ok": code == 0, "output": out or err} @router.post("/firewall/allow") async def firewall_allow(port: str = Form(...), protocol: str = Form("tcp")): code, out, err = await runner.run(f"sudo ufw allow {port}/{protocol}") return {"ok": code == 0, "output": out or err} @router.post("/firewall/deny") async def firewall_deny(port: str = Form(...), protocol: str = Form("tcp")): code, out, err = await runner.run(f"sudo ufw deny {port}/{protocol}") return {"ok": code == 0, "output": out or err} @router.post("/firewall/delete") async def firewall_delete(rule_num: str = Form(...)): code, out, err = await runner.run(f"echo {rule_num} | sudo ufw delete") return {"ok": code == 0, "output": out or err} @router.get("/firewall/status") async def firewall_status(): code, out, err = await runner.run("sudo ufw status verbose") return {"ok": code == 0, "output": out or err}