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 %} +

← Geräteliste

+

Hardware-Informationen: {{ device.hostname or device.device_fingerprint }}

+ +{% if fehler %} +

{{ fehler }}

+{% elif not hardware %} +

Für dieses Gerät liegt noch kein Hardware-Snapshot vor (Gerät wurde noch nicht aktiviert).

+{% else %} +
+

System

+
+ + + + + + + + + + + + + + + + +
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 }}
+
+
+ +
+

Netzwerk-Interfaces

+ {% if not hardware.network_interfaces %} +

Keine erfasst.

+ {% else %} +
+ + + + {% for interface in hardware.network_interfaces %} + + {% endfor %} + +
NameTypMAC-Adresse
{{ interface.name }}{{ interface.type }}{{ interface.mac_address }}
+
+ {% endif %} +
+ +
+

Datenträger

+ {% if not hardware.storage_devices %} +

Keine erfasst.

+ {% else %} +
+ + + + {% for storage in hardware.storage_devices %} + + + + + + + + {% endfor %} + +
NameModellSeriennummerGrößeTransport
{{ storage.name }}{{ storage.model or "—" }}{{ storage.serial or "—" }}{{ (storage.size_bytes / (1024**3)) | round(1) }} GB{{ storage.transport or "—" }}
+
+ {% endif %} +
+{% endif %} +{% endblock %} diff --git a/templates/geraete_liste.html b/templates/geraete_liste.html index e8d8045..c02b198 100644 --- a/templates/geraete_liste.html +++ b/templates/geraete_liste.html @@ -8,7 +8,7 @@
- + {% for device in devices %} @@ -16,7 +16,35 @@ + + {% 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 %} +

← Geräteliste

+

Gerät löschen

+ +

Soll dieses Gerät wirklich gelöscht werden?

+
+
HostnameKennungLetzter Check-in
HostnameKennungLetzter Check-inStatus
{{ device.hostname or "—" }} {{ device.device_fingerprint }} {{ device.agent_last_checkin or "noch nie" }} + {% if device.deprovisioned_at %} + deprovisioniert + {% else %} + aktiv + {% endif %} + Auftragskatalog → + +
+ + + + +
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.

+ +
+ + Abbrechen +
+{% 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 %} +

← Geräteliste

+

Installations-/Aktions-Log: {{ device.hostname or device.device_fingerprint }}

+ +{% if not events %} +

Für dieses Gerät liegen noch keine Einträge vor.

+{% else %} +
+ + + + + + {% for event in events %} + + + + + + + {% endfor %} + +
ZeitpunktMerkmalEreignisDetail
{{ 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 %}
+
+{% endif %} +{% endblock %}