Modules: Dashboard, Serveurs, Campagnes, Planning, Specifiques, Settings, Users Stack: FastAPI + Jinja2 + HTMX + Alpine.js + TailwindCSS + PostgreSQL Features: Qualys sync, prereqs auto, planning annuel, server specifics, role-based access Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
114 lines
4.8 KiB
Python
114 lines
4.8 KiB
Python
"""Router serveurs — CRUD + detail + edit via HTMX"""
|
|
from fastapi import APIRouter, Request, Depends, Query, Form
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from ..dependencies import get_db, get_current_user
|
|
from ..services.server_service import (
|
|
get_server_full, get_server_tags, get_server_ips,
|
|
list_servers, update_server, get_reference_data
|
|
)
|
|
from ..services.qualys_service import sync_server_qualys
|
|
from ..config import APP_NAME
|
|
|
|
router = APIRouter()
|
|
templates = Jinja2Templates(directory="app/templates")
|
|
|
|
|
|
@router.get("/servers", response_class=HTMLResponse)
|
|
async def servers_list(request: Request, db=Depends(get_db),
|
|
domain: str = Query(None), env: str = Query(None),
|
|
tier: str = Query(None), etat: str = Query(None),
|
|
search: str = Query(None), page: int = Query(1),
|
|
sort: str = Query("hostname"), sort_dir: str = Query("asc")):
|
|
user = get_current_user(request)
|
|
if not user:
|
|
return RedirectResponse(url="/login")
|
|
|
|
filters = {"domain": domain, "env": env, "tier": tier, "etat": etat, "search": search}
|
|
servers, total = list_servers(db, filters, page, sort=sort, sort_dir=sort_dir)
|
|
domains_list, envs_list = get_reference_data(db)
|
|
|
|
return templates.TemplateResponse("servers.html", {
|
|
"request": request, "user": user, "app_name": APP_NAME,
|
|
"servers": servers, "total": total, "page": page, "per_page": 50,
|
|
"domains_list": domains_list, "envs_list": envs_list, "filters": filters,
|
|
"sort": sort, "sort_dir": sort_dir,
|
|
})
|
|
|
|
|
|
@router.get("/servers/{server_id}/detail", response_class=HTMLResponse)
|
|
async def server_detail(request: Request, server_id: int, db=Depends(get_db)):
|
|
user = get_current_user(request)
|
|
if not user:
|
|
return HTMLResponse("<p>Non autorise</p>")
|
|
s = get_server_full(db, server_id)
|
|
if not s:
|
|
return HTMLResponse("<p>Serveur non trouve</p>")
|
|
tags = get_server_tags(db, s.qid)
|
|
ips = get_server_ips(db, server_id)
|
|
return templates.TemplateResponse("partials/server_detail.html", {
|
|
"request": request, "s": s, "tags": tags, "ips": ips
|
|
})
|
|
|
|
|
|
@router.get("/servers/{server_id}/edit", response_class=HTMLResponse)
|
|
async def server_edit(request: Request, server_id: int, db=Depends(get_db)):
|
|
user = get_current_user(request)
|
|
if not user:
|
|
return HTMLResponse("<p>Non autorise</p>")
|
|
s = get_server_full(db, server_id)
|
|
if not s:
|
|
return HTMLResponse("<p>Serveur non trouve</p>")
|
|
domains, envs = get_reference_data(db)
|
|
ips = get_server_ips(db, server_id)
|
|
return templates.TemplateResponse("partials/server_edit.html", {
|
|
"request": request, "s": s, "domains": domains, "envs": envs, "ips": ips
|
|
})
|
|
|
|
|
|
@router.put("/servers/{server_id}", response_class=HTMLResponse)
|
|
async def server_update(request: Request, server_id: int, db=Depends(get_db),
|
|
domain_code: str = Form(None), env_code: str = Form(None),
|
|
zone: str = Form(None), tier: str = Form(None), etat: str = Form(None),
|
|
patch_os_owner: str = Form(None), responsable_nom: str = Form(None),
|
|
referent_nom: str = Form(None), mode_operatoire: str = Form(None),
|
|
commentaire: str = Form(None),
|
|
ip_reelle: str = Form(None), ip_connexion: str = Form(None),
|
|
ssh_method: str = Form(None)):
|
|
|
|
user = get_current_user(request)
|
|
if not user:
|
|
return HTMLResponse("<p>Non autorise</p>")
|
|
|
|
data = {
|
|
"domain_code": domain_code, "env_code": env_code, "zone": zone,
|
|
"tier": tier, "etat": etat, "patch_os_owner": patch_os_owner,
|
|
"responsable_nom": responsable_nom, "referent_nom": referent_nom,
|
|
"mode_operatoire": mode_operatoire, "commentaire": commentaire,
|
|
"ip_reelle": ip_reelle, "ip_connexion": ip_connexion,
|
|
"ssh_method": ssh_method,
|
|
}
|
|
update_server(db, server_id, data, user.get("sub"))
|
|
|
|
s = get_server_full(db, server_id)
|
|
tags = get_server_tags(db, s.qid)
|
|
ips = get_server_ips(db, server_id)
|
|
return templates.TemplateResponse("partials/server_detail.html", {
|
|
"request": request, "s": s, "tags": tags, "ips": ips
|
|
})
|
|
|
|
|
|
@router.post("/servers/{server_id}/sync-qualys", response_class=HTMLResponse)
|
|
async def server_sync_qualys(request: Request, server_id: int, db=Depends(get_db)):
|
|
user = get_current_user(request)
|
|
if not user:
|
|
return HTMLResponse("<p>Non autorise</p>")
|
|
result = sync_server_qualys(db, server_id)
|
|
s = get_server_full(db, server_id)
|
|
tags = get_server_tags(db, s.qid) if s else []
|
|
ips = get_server_ips(db, server_id)
|
|
return templates.TemplateResponse("partials/server_detail.html", {
|
|
"request": request, "s": s, "tags": tags, "ips": ips,
|
|
"sync_msg": result.get("msg"), "sync_ok": result.get("ok"),
|
|
})
|