from fastapi import FastAPI, Request, HTTPException from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from sqlmodel import select, Session import json from contextlib import asynccontextmanager from grabber import Grabber, engine, flotte, SystemLog, create_db_and_tables @asynccontextmanager async def lifespan(app: FastAPI): create_db_and_tables() yield app = FastAPI(lifespan=lifespan) app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") @app.post("/endpoint") async def receive_info(request: Request): body = await request.body() try: data = json.loads(body) except json.JSONDecodeError: raise HTTPException(status_code=400, detail="Invalid JSON") sw = data.get("SOFTWARE", {}) # On récupère l'adresse MAC, c'est notre nouvel identifiant unique mac = sw.get("mac_address") hostname = sw.get("hostname", "Inconnu") if not mac: raise HTTPException(status_code=400, detail="Adresse MAC manquante dans le JSON") # Si la machine n'est pas encore connue par son adresse MAC if mac not in flotte: print(f"Nouvelle machine détectée : {hostname} ({mac})") flotte[mac] = Grabber(mac, hostname) ordi_actuel = flotte[mac] ordi_actuel.update(data) ordi_actuel.save() return {"status": "ok", "mac": mac} @app.get("/") async def list_ordis(request: Request): # On lit la vraie BDD pour avoir l'historique même après redémarrage with Session(engine) as session: statement = select(SystemLog) results = session.exec(statement).all() list_items = [] for pc in results: nom_affiche = f"{pc.hostname} ({pc.mac_address})" # On peut ajouter une petite icône ou couleur si la date_scan est récente list_items.append(f'