d01228a21e
- gui/main.py: FastAPI app with Jinja2 templates and static files - gui/state.py: shared application state (runner, template env) - gui/services/pos_runner.py: abstracted command execution layer with subprocess, SSE streaming, and sudo support - gui/routes/: 8 route modules (dashboard, install, compose, network, vbox, system, media, ssh) - gui/templates/: Bulma-based layout with sidebar navigation + section templates for all routes - gui/static/css/style.css: dark theme styling - gui/requirements.txt: fastapi, uvicorn, jinja2, python-multipart - 1- Start_GUI.sh: entry point with sudo cache, pip install, uvicorn launch Architecture: routes delegate to pos_runner which shells out to actual pos-* scripts — no logic duplication. SSE streaming for real-time output (install, compose up/down/logs, network scan, media).
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
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}
|