diff --git a/routers/geraete.py b/routers/geraete.py index fe7cbcf..356a724 100644 --- a/routers/geraete.py +++ b/routers/geraete.py @@ -120,3 +120,78 @@ def auftrag_deselect(device_id: str, merkmal_key: str, user: dict = Depends(get_ ) return RedirectResponse(f"/geraete/{device_id}", status_code=303) + + +@router.get("/geraete/{device_id}/hardware") +def hardware_ansicht(request: Request, device_id: str, user: dict = Depends(get_current_user)): + device = find_device_in_organization(device_id, user.organization_id) + + if device is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + result = anode_request("GET", f"/api/v1/devices/{device_id}/hardware") + hardware = result.get("hardware") if result.get("success") else None + fehler = None if result.get("success") else result.get("message") + + return templates.TemplateResponse( + request, + "geraete_hardware.html", + {"user": user, "device": device, "hardware": hardware, "fehler": fehler}, + ) + + +@router.get("/geraete/{device_id}/log") +def log_ansicht(request: Request, device_id: str, user: dict = Depends(get_current_user)): + device = find_device_in_organization(device_id, user.organization_id) + + if device is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + result = anode_request("GET", f"/api/v1/devices/{device_id}/events") + events = result.get("events", []) if result.get("success") else [] + + return templates.TemplateResponse( + request, "geraete_log.html", {"user": user, "device": device, "events": events} + ) + + +@router.post("/geraete/{device_id}/deprovisionieren") +def deprovisionieren(device_id: str, user: dict = Depends(get_current_user)): + if find_device_in_organization(device_id, user.organization_id) is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + anode_request("POST", f"/api/v1/devices/{device_id}/deprovision") + + return RedirectResponse("/geraete", status_code=303) + + +@router.post("/geraete/{device_id}/reprovisionieren") +def reprovisionieren(device_id: str, user: dict = Depends(get_current_user)): + if find_device_in_organization(device_id, user.organization_id) is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + anode_request("POST", f"/api/v1/devices/{device_id}/reprovision") + + return RedirectResponse("/geraete", status_code=303) + + +@router.get("/geraete/{device_id}/loeschen") +def loeschen_bestaetigen(request: Request, device_id: str, user: dict = Depends(get_current_user)): + device = find_device_in_organization(device_id, user.organization_id) + + if device is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + return templates.TemplateResponse( + request, "geraete_loeschen.html", {"user": user, "device": device} + ) + + +@router.post("/geraete/{device_id}/loeschen") +def loeschen(device_id: str, user: dict = Depends(get_current_user)): + if find_device_in_organization(device_id, user.organization_id) is None: + raise HTTPException(status_code=404, detail="Gerät wurde nicht gefunden.") + + anode_request("POST", f"/api/v1/devices/{device_id}/archive") + + return RedirectResponse("/geraete", status_code=303) diff --git a/templates/geraete_hardware.html b/templates/geraete_hardware.html new file mode 100644 index 0000000..df26ed8 --- /dev/null +++ b/templates/geraete_hardware.html @@ -0,0 +1,77 @@ +{% extends "base.html" %} +{% block title %}Hardware {{ device.hostname or device.device_fingerprint }} — Tuxflotte{% endblock %} +{% block content %} +
+{{ fehler }}
+{% elif not hardware %} +Für dieses Gerät liegt noch kein Hardware-Snapshot vor (Gerät wurde noch nicht aktiviert).
+{% else %} +| Hersteller | {{ hardware.manufacturer or "—" }} |
| Produkt | {{ hardware.product_name or "—" }} {{ hardware.product_version or "" }} |
| Architektur | {{ hardware.architecture }} |
| System-UUID | {{ hardware.system_uuid or "—" }} |
| Seriennummer | {{ hardware.system_serial or "—" }} |
| CPU | {{ hardware.cpu_model or "—" }} ({{ hardware.cpu_logical_count or "?" }} Logikkerne) |
| Arbeitsspeicher | {{ (hardware.memory_bytes / (1024**3)) | round(1) if hardware.memory_bytes else "—" }} GB |
| Mainboard | {{ hardware.board_vendor or "—" }} {{ hardware.board_name or "" }} |
| BIOS | {{ hardware.bios_vendor or "—" }} {{ hardware.bios_version or "" }} |
| Boot-Modus | {{ hardware.boot_mode or "—" }} |
| Secure Boot | {{ hardware.secure_boot or "—" }} |
| TPM | {{ hardware.tpm_version or "—" }} |
| Erfasst am | {{ hardware.collected_at }} |
Keine erfasst.
+ {% else %} +| Name | Typ | MAC-Adresse |
|---|---|---|
| {{ interface.name }} | {{ interface.type }} | {{ interface.mac_address }} |
Keine erfasst.
+ {% else %} +| Name | Modell | Seriennummer | Größe | Transport |
|---|---|---|---|---|
| {{ storage.name }} | +{{ storage.model or "—" }} | +{{ storage.serial or "—" }} |
+ {{ (storage.size_bytes / (1024**3)) | round(1) }} GB | +{{ storage.transport or "—" }} | +
| Hostname | Kennung | Letzter Check-in | |||
|---|---|---|---|---|---|
| Hostname | Kennung | Letzter Check-in | Status | {{ device.hostname or "—" }} | {{ device.device_fingerprint }} |
{{ device.agent_last_checkin or "noch nie" }} | ++ {% if device.deprovisioned_at %} + deprovisioniert + {% else %} + aktiv + {% endif %} + | Auftragskatalog → | +
+
+
+ Aktionen+
|
{% endfor %}
diff --git a/templates/geraete_loeschen.html b/templates/geraete_loeschen.html
new file mode 100644
index 0000000..3d3233d
--- /dev/null
+++ b/templates/geraete_loeschen.html
@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+{% block title %}Gerät löschen — Tuxflotte{% endblock %}
+{% block content %}
+
+
| Hostname | {{ device.hostname or "—" }} |
| Kennung | {{ device.device_fingerprint }} |
Das Gerät verschwindet danach aus Ihrer Geräteliste. Bereits erfasste Hardware-Daten und das Aktions-Log gehen dabei nicht verloren.
+ + +{% endblock %} diff --git a/templates/geraete_log.html b/templates/geraete_log.html new file mode 100644 index 0000000..2cfa98e --- /dev/null +++ b/templates/geraete_log.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% block title %}Log {{ device.hostname or device.device_fingerprint }} — Tuxflotte{% endblock %} +{% block content %} + +Für dieses Gerät liegen noch keine Einträge vor.
+{% else %} +| Zeitpunkt | Merkmal | Ereignis | Detail |
|---|---|---|---|
| {{ event.occurred_at }} | +{{ event.merkmal_name }} | ++ {% if event.event_type in ("applied", "selected") %} + {{ event.event_type }} + {% elif event.event_type in ("apply_failed", "remove_failed") %} + {{ event.event_type }} + {% else %} + {{ event.event_type }} + {% endif %} + | +{% if event.detail %}{{ event.detail }}{% else %}—{% endif %} |
+