PHP_AdminTool_Projekt/CHANGELOG.md

8.9 KiB
Raw Blame History

CHANGELOG

2025-12-03 — SNMP Live-Dashboard (Architektur: Service + API)

Übersicht

Implementierung eines dualen SNMP-Status-Systems:

  1. Server-seitig (Initial Load): DashboardControllerSnmpServerStatusService
  2. Client-seitig (Live-Updates): Browser-JavaScript → API-Endpunkt (snmp_status.php)

Ergebnis: Beste User Experience (sofortige Daten beim Laden) + Redundanz (Live-Polling läuft weiter, auch wenn Service fehlt).


Komponente 1: Service (app/Services/Snmp/SnmpServerStatusService.php) — modernisiert

Was wurde geändert?

Die alte Version ist zu streng gewesen (wirft Exception wenn "Physical Memory" nicht exakt gefunden wird). Neue Version hat intelligente Fallback-Logik:

RAM-Erkennung (in dieser Reihenfolge):

  1. Heuristik: Suche nach "Physical Memory" (exakt)
  2. Fallback 1: Suche nach "physical" ODER "memory" ODER "ram" (Case-insensitive)
  3. Fallback 2: Nimm den kleinsten Storage-Eintrag (wahrscheinlich RAM)
  4. Falls alles fehlschlägt: Exception → abgefangen im Controller → 0% angezeigt

Disk-Erkennung (in dieser Reihenfolge):

  1. Heuristik: Suche nach "C:\" (Windows, exakt)
  2. Fallback 1: Suche nach "C:" ODER "root" ODER "/" (Case-insensitive)
  3. Fallback 2: Nimm den größten Storage-Eintrag > 1 GB (wahrscheinlich Hauptlaufwerk)
  4. Falls alles fehlschlägt: Exception → abgefangen im Controller → 0% angezeigt

Featureset

  • Robuste Fehlerbehandlung (aussagekräftige RuntimeException für Debugging)
  • Intelligente Fallbacks bei unerwarteten OID-Beschreibungen
  • Unterstützung Windows + Linux
  • Prüfung auf SNMP-Erweiterung und Konfiguration
  • Uptime in lesbares Format konvertieren (z. B. "1 Tage, 10:17:36")
  • CPU-Durchschnitt über alle Kerne

Komponente 2: Controller (app/Controllers/DashboardController.php) — neu strukturiert

Was wurde geändert?

Der Controller hatte nur eine Zeile geändert; jetzt fehlertolerante Abfrage:

try {
    $serverStatus = $this->snmpService->getServerStatus();
} catch (\RuntimeException $e) {
    error_log('SNMP-Fehler beim initialen Laden - ' . $e->getMessage());
    // Fallback-Werte werden verwendet (siehe oben)
}

Effekt:

  • Wenn Service fehlschlägt: Dashboard wird trotzdem geladen (mit 0% oder 'n/a')
  • Fehler wird geloggt (PHP Error-Log)
  • Live-Polling (API) läuft trotzdem weiter und kann Daten liefern
  • Bessere User Experience statt "Error 500"

Komponente 3: API (public/api/snmp_status.php)

Siehe vorherige CHANGELOG-Einträge. Wichtig:

  • Identische Fallback-Logik wie der Service
  • Session-Validierung (nur Admins)
  • Caching (10 Sekunden)
  • Detailliertes Logging in public/logs/snmp_api.log

Komponente 4: View & JavaScript (public/views/dashboard.php)

Siehe vorherige CHANGELOG-Einträge.


Architektur: Dual-Layer System

Layer 1: Initial Load (Server-seitig)

Nutzer öffnet Dashboard
         ↓
DashboardController::show()
         ↓
SnmpServerStatusService::getServerStatus()
         ↓
SNMP-Abfrage (mit Fallbacks)
         ↓
Daten sofort in View angezeigt
         ↓
(Bei Fehler: Fallback-Werte wie 0%, 'n/a')
         ↓
Logging in PHP Error-Log

Vorteile:

  • Daten sind sofort sichtbar (gute UX)
  • Fallbacks verhindern "Error 500"
  • Service wird nur 1x pro Seitenladung aufgerufen (sparsam)

Layer 2: Live-Updates (Client-seitig)

Browser lädt Dashboard
         ↓
JavaScript addEventListener('DOMContentLoaded')
         ↓
Sofort erste Abfrage: fetch('api/snmp_status.php')
         ↓
Antwort: JSON mit aktuellen Daten
         ↓
updateUI() aktualisiert die Karten
         ↓
Alle 5 Sekunden wiederholt (setInterval)
         ↓
Logging in public/logs/snmp_api.log (Server-seitig)

Vorteile:

  • Live-Updates ohne Seite zu reload-en
  • Session-Schutz (nur Admins können Endpunkt aufrufen)
  • Caching reduziert SNMP-Last (10s TTL)
  • Fallback-Logik im API unabhängig vom Service
  • Redundanz: Wenn Service fehlt, läuft API trotzdem

Logging

PHP Error-Log (Service-Fehler)

  • Ort: Abhängig von PHP-Konfiguration (meist /var/log/php-errors.log oder Windows Event-Log)
  • Format: Standard PHP Error-Log
  • Inhalt: SNMP-Fehler beim initialen Laden (z. B. "SNMP-Konfiguration ist unvollständig")
  • Trigger: Nur wenn Service-Abfrage fehlschlägt

Beispiel:

[03-Dec-2025 12:05:00 UTC] DashboardController: SNMP-Fehler beim initialen Laden - SNMP-Konfiguration ist unvollständig (host fehlt).

SNMP API Log (public/logs/snmp_api.log)

  • Ort: public/logs/snmp_api.log (wird automatisch angelegt)
  • Format: [YYYY-MM-DD HH:MM:SS] Nachricht
  • Inhalt:
    • Cache-Hits/Misses
    • SNMP-Konfiguration
    • Alle Storage-Einträge
    • Erkannte Disk/RAM mit Prozentsätzen
    • Fallback-Aktionen
    • Finale Werte
    • Fehler

Beispiel:

[2025-12-03 12:05:00] --- SNMP-Abfrage gestartet ---
[2025-12-03 12:05:00] SNMP-Host: 127.0.0.1, Community: public_ro, Timeout: 2s
[2025-12-03 12:05:00] Uptime OID: 1.3.6.1.2.1.1.3.0, Raw: "Timeticks: (1234567) 14 days, 6:14:27.67"
[2025-12-03 12:05:00] Storage[1]: Desc='Physical Memory', Size=16777216, Used=8388608, Units=1024
[2025-12-03 12:05:00] Speicher erkannt (Index 1): Physical Memory → 50.00%
[2025-12-03 12:05:00] Storage[2]: Desc='C:\\ ', Size=536870912, Used=268435456, Units=512
[2025-12-03 12:05:00] Datenträger erkannt (Index 2): C:\\ → 50.00%
[2025-12-03 12:05:00] RESULT: CPU=25, Mem=50.00, Disk=50.00
[2025-12-03 12:05:00] Cache geschrieben, TTL: 10s

Fehlerszenarien & Behavior

Szenario 1: SNMP läuft, alles OK

Service: ✅ Daten sofort angezeigt
API:     ✅ Live-Updates alle 5s
Logs:    ✅ Beide Logs ganz normal

Szenario 2: SNMP-Erweiterung fehlt

Service: ❌ Exception → abgefangen → 0%, 'n/a' angezeigt
API:     ❌ Exception → abgefangen → {"error": "snmp_extension_missing"}
Logs:    ⚠️  Beide Logs zeigen Fehler
User-View: "Metriken werden angezeigt (0%), aber nicht aktualisiert"
Aktion:    Admin sieht Fehler im Log und installiert SNMP

Szenario 3: SNMP antwortet, aber Beschreibungen sind unbekannt

Service: ✅ Fallback-Logik findet RAM/Disk trotzdem
API:     ✅ Fallback-Logik findet RAM/Disk trotzdem
Logs:      `Fallback RAM gefunden` / `Fallback Disk gefunden`
User-View: ✅ Daten werden angezeigt

Szenario 4: Service fehlt, API läuft

Service: ❌ Exception beim Laden
API:     ✅ Live-Updates funktionieren normal
User-View: "Beim Laden: 0%, nach 5s: aktuelle Werte"
Gut genug!

Testing-Anleitung

1. Initialer Load testen

# Browser öffnen, als Admin einloggen
# Dashboard öffnen
# → Sollten Werte sichtbar sein (entweder echte oder 0%)

2. Service-Fehler simulieren

// In DashboardController.php: Service-Aufruf kommentieren
// $serverStatus = [... Fallback-Werte ...];
// → Dashboard sollte trotzdem laden (mit 0%)

3. API testen

# Browser DevTools → Network → api/snmp_status.php
# → Sollte JSON zurückgeben
# Bei 401 → Session fehlt (erwartet wenn nicht angemeldet)
# Sollte aber funktionieren wenn angemeldet

4. Logs prüfen

# PHP Error-Log
error_log() Output ansehen

# SNMP API Log
cat public/logs/snmp_api.log
# Sollte Einträge zeigen (mit Timestamps)

5. Cache prüfen

# Temp-Datei prüfen
# Windows: %TEMP%\snmp_status_cache.json
# Linux: /tmp/snmp_status_cache.json
# → Sollte JSON enthalten

Known Issues & Limitations

  1. Disk/RAM-Heuristik: Bei sehr ungewöhnlichen Storage-Labels können Fallbacks greifen, die nicht ideal sind

    • Lösung: Log prüfen (Storage[X]: Einträge) und ggf. Heuristiken anpassen
  2. Cache-Speicher: Erfordert Schreibzugriff auf sys_get_temp_dir()

    • Lösung: Falls nicht verfügbar → Cache-Code entfernen oder APCu/Redis nutzen
  3. OS-Feld: Hardcoded auf "Windows Server" (TODO: Dynamisch per OID 1.3.6.1.2.1.1.1.0)


Performance

  • Service-Abfrage: 1x pro Seitenladung (~100-500ms je nach SNMP-Timeout)
  • API-Abfrage: Alle 5s, aber gecacht für 10s → effektiv alle 10s eine echte SNMP-Abfrage
  • JavaScript Polling: 5s Intervall (Browser-seitig, keine Last auf Server)
  • Gesamt: Sehr effizient, auch bei vielen gleichzeitigen Nutzern

Summary für Kollegen

Live-Dashboard mit zwei Ebenen:

  1. Initial Load via Service (sofortige Daten)
  2. Live-Polling via API (kontinuierliche Updates)

Robuste Fallback-Logik für RAM und Disk (findet die Werte auch bei unbekannten Labels)

Dual Logging:

  • PHP Error-Log für Service-Fehler
  • public/logs/snmp_api.log für API-Aktivitäten

Session-Geschützt: Nur Admins können Status abrufen

Gecacht: 10 Sekunden TTL reduziert SNMP-Load

Error-tolerant: Dashboard funktioniert auch wenn SNMP fehlt (zeigt 0%, wartet auf Live-Updates)