]> git.giorgioravera.it Git - network-manager.git/commitdiff
created host router
authorGiorgio Ravera <giorgio.ravera@gmail.com>
Mon, 5 Jan 2026 19:58:55 +0000 (20:58 +0100)
committerGiorgio Ravera <giorgio.ravera@gmail.com>
Mon, 5 Jan 2026 19:58:55 +0000 (20:58 +0100)
backend/main.py
backend/routes/health.py
backend/routes/hosts.py [new file with mode: 0644]
backend/routes/login.py
backend/security.py
frontend/app.js

index 28ce840948f5fc2c9d508f6133a870299b1907cd..4f9f5f8b363954303b5bacd461d83f8336866ba5 100644 (file)
@@ -2,13 +2,12 @@
 
 # import standard modules
 from fastapi import FastAPI
-from fastapi import Request, Response, HTTPException
+from fastapi import Request, Response
 from fastapi.middleware.cors import CORSMiddleware
 from fastapi.responses import FileResponse, RedirectResponse
 import os
-import ipaddress
 # Import local modules
-from backend.security import is_logged_in, require_login
+from backend.security import is_logged_in, require_login, html_protected
 from backend.db.hosts import (
     get_hosts,
     get_host,
@@ -18,6 +17,7 @@ from backend.db.hosts import (
 )
 from backend.routes.health import router as health_router
 from backend.routes.login import router as login_router
+from backend.routes.hosts import router as hosts_router
 # Import config variables
 from backend.config import FRONTEND_DIR, HTTP_PORT
 
@@ -25,6 +25,7 @@ from backend.config import FRONTEND_DIR, HTTP_PORT
 app = FastAPI()
 app.include_router(health_router)
 app.include_router(login_router)
+app.include_router(hosts_router)
 
 # Allow frontend JS to call the API
 app.add_middleware(
@@ -52,78 +53,7 @@ def html_protected(request: Request, filename: str):
 def home(request: Request):
     return html_protected(request, "hosts.html")
 
-# Hosts page
-@app.get("/hosts")
-def hosts(request: Request):
-    return html_protected(request, "hosts.html")
-
-# Serve hosts.css
-@app.get("/css/hosts.css")
-def css_hosts():
-    return FileResponse(os.path.join(FRONTEND_DIR, "css/hosts.css"))
-
 # Serve app.js
 @app.get("/app.js")
 def js():
     return FileResponse(os.path.join(FRONTEND_DIR, "app.js"))
-
-# ---------------------------------------------------------
-# API ENDPOINTS
-# ---------------------------------------------------------
-
-@app.get("/api/hosts")
-def api_get_hosts(request: Request):
-    require_login(request)
-    return get_hosts()
-
-@app.post("/api/hosts")
-def api_add_host(request: Request, data: dict):
-    require_login(request)
-    name = data.get("name", "").strip()
-    ipv4 = data.get("ipv4")
-    ipv6 = data.get("ipv6")
-    if not name:
-        return {"error": "Name is required"}
-    if ipv4:
-        try:
-            ipaddress.IPv4Address(ipv4)
-        except:
-            return {"error": "Invalid IPv4 format"}
-    if ipv6:
-        try:
-            ipaddress.IPv6Address(ipv6)
-        except:
-            return {"error": "Invalid IPv6 format"}
-    return {"id": add_host(data)}
-
-@app.get("/api/hosts/{host_id}")
-def api_get_host(request: Request, host_id: int):
-    require_login(request)
-    return get_host(host_id) or {}
-
-@app.put("/api/hosts/{host_id}")
-def api_update_host(request: Request, data: dict, host_id: int):
-    require_login(request)
-    name = data.get("name", "").strip()
-    ipv4 = data.get("ipv4")
-    ipv6 = data.get("ipv6")
-    if not name:
-        return {"error": "Name is required"}
-    if ipv4:
-        try:
-            ipaddress.IPv4Address(ipv4)
-        except:
-            return {"error": "Invalid IPv4 format"}
-    if ipv6:
-        try:
-            ipaddress.IPv6Address(ipv6)
-        except:
-            return {"error": "Invalid IPv6 format"}
-    update_host(host_id, data)
-    return {"status": "ok"}
-
-@app.delete("/api/hosts/{host_id}")
-def api_delete_host(request: Request, host_id: int):
-    require_login(request)
-    delete_host(host_id)
-    return {"status": "ok"}
index 98af0bc18a57fe7ccff0b62813e1bde51bf04acc..2a68d125f872f5ccb3a9500d50e194e8c0d2b2f2 100644 (file)
@@ -2,8 +2,13 @@
 
 from fastapi import APIRouter
 
+# Create Router
 router = APIRouter()
 
+# ---------------------------------------------------------
+# API ENDPOINTS
+# ---------------------------------------------------------
+
 @router.get("/health", tags=["health"])
 def health_check():
     return {"status": "ok"}
diff --git a/backend/routes/hosts.py b/backend/routes/hosts.py
new file mode 100644 (file)
index 0000000..0376d2d
--- /dev/null
@@ -0,0 +1,96 @@
+# backend/routes/hosts.py
+
+# import standard modules
+from fastapi import APIRouter, Request, Response
+from fastapi.responses import FileResponse, RedirectResponse
+import os
+import ipaddress
+# Import local modules
+from backend.security import is_logged_in, require_login, html_protected
+from backend.db.hosts import (
+    get_hosts,
+    get_host,
+    add_host,
+    update_host,
+    delete_host
+)
+# Import config variables
+from backend.config import FRONTEND_DIR
+
+# Create Router
+router = APIRouter()
+
+# ---------------------------------------------------------
+# FRONTEND PATHS (absolute paths inside Docker)
+# ---------------------------------------------------------
+
+# Hosts page
+@router.get("/hosts")
+def hosts(request: Request):
+    return html_protected(request, "hosts.html")
+
+# Serve hosts.css
+@router.get("/css/hosts.css")
+def css_hosts():
+    return FileResponse(os.path.join(FRONTEND_DIR, "css/hosts.css"))
+
+# ---------------------------------------------------------
+# API ENDPOINTS
+# ---------------------------------------------------------
+
+@router.get("/api/hosts")
+def api_get_hosts(request: Request):
+    require_login(request)
+    return get_hosts()
+
+@router.post("/api/hosts")
+def api_add_host(request: Request, data: dict):
+    require_login(request)
+    name = data.get("name", "").strip()
+    ipv4 = data.get("ipv4")
+    ipv6 = data.get("ipv6")
+    if not name:
+        return {"error": "Name is required"}
+    if ipv4:
+        try:
+            ipaddress.IPv4Address(ipv4)
+        except:
+            return {"error": "Invalid IPv4 format"}
+    if ipv6:
+        try:
+            ipaddress.IPv6Address(ipv6)
+        except:
+            return {"error": "Invalid IPv6 format"}
+    return {"id": add_host(data)}
+
+@router.get("/api/hosts/{host_id}")
+def api_get_host(request: Request, host_id: int):
+    require_login(request)
+    return get_host(host_id) or {}
+
+@router.put("/api/hosts/{host_id}")
+def api_update_host(request: Request, data: dict, host_id: int):
+    require_login(request)
+    name = data.get("name", "").strip()
+    ipv4 = data.get("ipv4")
+    ipv6 = data.get("ipv6")
+    if not name:
+        return {"error": "Name is required"}
+    if ipv4:
+        try:
+            ipaddress.IPv4Address(ipv4)
+        except:
+            return {"error": "Invalid IPv4 format"}
+    if ipv6:
+        try:
+            ipaddress.IPv6Address(ipv6)
+        except:
+            return {"error": "Invalid IPv6 format"}
+    update_host(host_id, data)
+    return {"status": "ok"}
+
+@router.delete("/api/hosts/{host_id}")
+def api_delete_host(request: Request, host_id: int):
+    require_login(request)
+    delete_host(host_id)
+    return {"status": "ok"}
index 7918ea1fd5f3d902c432a8fd9f2c2177cab52b5c..88b358c1852e5c8eee07121631833855cf42c7c5 100644 (file)
@@ -1,7 +1,7 @@
 # backend/routes/login.py
 
 # import standard modules
-from fastapi import APIRouter, Request, Response
+from fastapi import APIRouter, Request, Response, HTTPException
 from fastapi.responses import FileResponse, RedirectResponse
 import os
 import time
@@ -11,6 +11,7 @@ from backend.db.users import verify_login
 # Import config variables
 from backend.config import FRONTEND_DIR, LOGIN_MAX_ATTEMPTS, LOGIN_WINDOW_SECONDS
 
+# Create Router
 router = APIRouter()
 
 # IP -> lista timestamp tentativi 
@@ -73,7 +74,7 @@ def api_login(request: Request, data: dict, response: Response):
         )
         return {"status": "ok"}
 
-    return {"error": "Invalid credentials"}
+    return {"error": "Wrong credentials"}
 
 @router.post("/api/logout")
 def api_logout(response: Response):
index 803e2cf4df35c2b3da12ff14fe0fe4c1f067b478..b31f092a6ceb15648a5518c55d58bb099234b428 100644 (file)
@@ -1,13 +1,18 @@
 # backend/security.py
 
 # import standard modules
+import os
 from fastapi import Request, HTTPException
+from fastapi.responses import FileResponse, RedirectResponse
 from itsdangerous import TimestampSigner
 # Import config variables
-from backend.config import SECRET_KEY
+from backend.config import FRONTEND_DIR, SECRET_KEY
 
 signer = TimestampSigner(SECRET_KEY)
 
+# -----------------------------
+# login check
+# -----------------------------
 def is_logged_in(request: Request) -> bool:
     token = request.cookies.get("session")
     if not token:
@@ -18,6 +23,17 @@ def is_logged_in(request: Request) -> bool:
     except:
         return False
 
+# -----------------------------
+# login check (for api)
+# -----------------------------
 def require_login(request: Request):
     if not is_logged_in(request):
         raise HTTPException(status_code=401, detail="Not authenticated")
+
+# -----------------------------
+# login check (for html)
+# -----------------------------
+def html_protected(request: Request, filename: str):
+    if not is_logged_in(request):
+        return RedirectResponse("/login")
+    return FileResponse(os.path.join(FRONTEND_DIR, filename))
\ No newline at end of file
index 5c873e6beca88e3a51cc0874a8cea3add3a75354..f8984fa63ad2484cf6d3a901a97e4368c3f10936 100644 (file)
@@ -290,7 +290,7 @@ async function handleLogin(e) {
     if (data.status === "ok") {
         window.location.href = "/hosts";
     } else {
-        document.getElementById("loginError").textContent = "Wrong credentials";
+        document.getElementById("loginError").textContent = data.error;
     }
 }