diff --git a/app/Jobs/RunHealthChecks.php b/app/Jobs/RunHealthChecks.php index 53374e8..a06139a 100644 --- a/app/Jobs/RunHealthChecks.php +++ b/app/Jobs/RunHealthChecks.php @@ -17,7 +17,7 @@ class RunHealthChecks implements ShouldQueue { use Queueable, Probes; - public int $timeout = 10; // safety + public int $timeout = 10; public int $tries = 1; public function handle(): void @@ -35,8 +35,6 @@ class RunHealthChecks implements ShouldQueue $svcRows[] = ['name' => $key, 'ok' => $ok]; // labels brauchst du im UI } -// Cache::put(CacheVer::k('health:services'), $svcRows, 60); - $payload = ['ts' => time(), 'rows' => $svcRows]; Cache::put(CacheVer::k('health:services'), $payload, 300); Log::info('WG: writing services', ['count'=>count($svcRows)]); diff --git a/app/Livewire/Ui/System/WoltguardCard.php b/app/Livewire/Ui/System/WoltguardCard.php index cbbfb4f..271fd9f 100644 --- a/app/Livewire/Ui/System/WoltguardCard.php +++ b/app/Livewire/Ui/System/WoltguardCard.php @@ -48,53 +48,6 @@ class WoltguardCard extends Component protected function load(): void { - // 1) Versionierter Key holen -// $val = Cache::get(\App\Support\CacheVer::k('health:services')); -// -// // 2) Falls leer → Legacy-Key (altes Format: direkt die Rows) -// if (empty($val)) { -// $legacy = Cache::get('health:services', []); -// if (!empty($legacy) && is_array($legacy)) { -// $val = ['ts' => null, 'rows' => $legacy]; -// } -// } -// -// // 3) DB-Fallback (Settings), wenn weiterhin leer -// if (empty($val)) { -// $val = \App\Models\Setting::get('woltguard.services'); // erwartet ['ts'=>..,'rows'=>[..]] -// } -// -// // 4) Shape normalisieren -// $rows = []; -// if (is_array($val)) { -// // neues Format -// if (array_key_exists('rows', $val) && is_array($val['rows'])) { -// $rows = $val['rows']; -// } -// // falls jemand doch wieder nur die Rows speichert -// elseif (isset($val[0]) && is_array($val[0]) && array_key_exists('name', $val[0])) { -// $rows = $val; -// } -// } - -// $list = Cache::get(CacheVer::k('health:services')); -// if (empty($list)) { -// // Fallback: aus DB/Redis (persistiert vom Job) -// $list = \App\Support\Setting::get('woltguard.services', []); -// } -// -// $rows = []; -// if (is_array($list)) { -// // neues Format: ['ts'=>..., 'rows'=>[...]] -// if (isset($list['rows']) && is_array($list['rows'])) { -// $rows = $list['rows']; -// } -// // altes Format: direkt die Array-Liste -// elseif (isset($list[0]) && is_array($list[0])) { -// $rows = $list; -// } -// } - $list = Cache::get(CacheVer::k('health:services')); if (empty($list)) { @@ -109,11 +62,11 @@ class WoltguardCard extends Component : (isset($list[0]) && is_array($list[0]) ? $list : []); // altes Format } - $this->services = $rows; + $this->services = $rows; $this->totalCount = count($rows); - $this->okCount = collect($rows)->where('ok', true)->count(); - $this->downCount = $this->totalCount - $this->okCount; - $this->guardOk = $this->totalCount > 0 && $this->downCount === 0; + $this->okCount = collect($rows)->where('ok', true)->count(); + $this->downCount = $this->totalCount - $this->okCount; + $this->guardOk = $this->totalCount > 0 && $this->downCount === 0; $this->downServices = collect($rows) ->filter(fn($s) => !($s['ok'] ?? false)) @@ -122,264 +75,22 @@ class WoltguardCard extends Component // Badge if ($this->totalCount === 0) { - $this->badgeText = 'keine Daten'; - $this->badgeIcon = 'ph ph-warning-circle'; + $this->badgeText = 'keine Daten'; + $this->badgeIcon = 'ph ph-warning-circle'; $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; return; } if ($this->guardOk) { - $this->badgeText = 'alle Dienste OK'; - $this->badgeIcon = 'ph ph-check-circle'; + $this->badgeText = 'alle Dienste OK'; + $this->badgeIcon = 'ph ph-check-circle'; $this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10'; } else { - $this->badgeText = $this->downCount >= 3 ? "{$this->downCount} Dienste down" : 'Störung erkannt'; - $this->badgeIcon = $this->downCount >= 3 ? 'ph ph-x-circle' : 'ph ph-warning-circle'; + $this->badgeText = $this->downCount >= 3 ? "{$this->downCount} Dienste down" : 'Störung erkannt'; + $this->badgeIcon = $this->downCount >= 3 ? 'ph ph-x-circle' : 'ph ph-warning-circle'; $this->badgeClass = $this->downCount >= 3 ? 'text-rose-300 border-rose-400/30 bg-rose-500/10' : 'text-amber-300 border-amber-400/30 bg-amber-500/10'; } } -// protected function load(): void -// { -// // 1) Primär: versionierter Cache-Key (mit ts/rows) -// $data = Cache::get(CacheVer::k('health:services')); -// -// // 2) Fallback: Settings (DB) wenn Cache leer/fehlend -// if (!is_array($data) || empty($data['rows'])) { -// $data = \App\Models\Setting::get('woltguard.services', []); -// } -// -// // 3) Letzter bekannter Zustand als Notanker (kein Flackern) -// $rows = $data['rows'] ?? []; -// if (empty($rows) && !empty($this->services)) { -// $rows = $this->services; -// } -// -// // ---- Mapping in UI-Props ---- -// $this->services = $rows; -// $this->totalCount = count($rows); -// $this->okCount = collect($rows)->where('ok', true)->count(); -// $this->downCount = max(0, $this->totalCount - $this->okCount); -// $this->guardOk = ($this->totalCount > 0) && ($this->downCount === 0); -// -// $this->downServices = collect($rows) -// ->filter(fn ($s) => !($s['ok'] ?? false)) -// ->map(fn ($s) => (string)($s['name'] ?? 'unbekannt')) -// ->values() -// ->all(); -// -// // Badge -// if ($this->totalCount === 0) { -// $this->badgeText = 'keine Daten'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// return; -// } -// -// if ($this->guardOk) { -// $this->badgeText = 'alle Dienste OK'; -// $this->badgeIcon = 'ph ph-check-circle'; -// $this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10'; -// } else { -// if ($this->downCount >= 3) { -// $this->badgeText = "{$this->downCount} Dienste down"; -// $this->badgeIcon = 'ph ph-x-circle'; -// $this->badgeClass = 'text-rose-300 border-rose-400/30 bg-rose-500/10'; -// } else { -// $this->badgeText = 'Störung erkannt'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// } -// } -// } -// protected function load(): void -// { -// // 1) Primär: Redis -// $data = Cache::get(CacheVer::k('health:services')); -// -// // 2) Fallback: Settings (DB) -// if (!is_array($data) || empty($data['rows'])) { -// $data = Setting::get('woltguard.services', []); -// } -// -// // 3) Falls beides leer → letzter bekannter Zustand beibehalten -// $rows = $data['rows'] ?? []; -// if (empty($rows) && !empty($this->services)) { -// $rows = $this->services; -// } -// -// // Mapping -// $this->services = $rows; -// $this->totalCount = count($rows); -// $this->okCount = collect($rows)->where('ok', true)->count(); -// $this->downCount = max(0, $this->totalCount - $this->okCount); -// $this->guardOk = ($this->totalCount > 0) && ($this->downCount === 0); -// -// $this->downServices = collect($rows) -// ->filter(fn($s) => !($s['ok'] ?? false)) -// ->map(fn($s) => (string)($s['name'] ?? 'unbekannt')) -// ->values() -// ->all(); -// -// // Badges -// if ($this->totalCount === 0) { -// $this->badgeText = 'keine Daten'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// return; -// } -// -// if ($this->guardOk) { -// $this->badgeText = 'alle Dienste OK'; -// $this->badgeIcon = 'ph ph-check-circle'; -// $this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10'; -// } else { -// if ($this->downCount >= 3) { -// $this->badgeText = "{$this->downCount} Dienste down"; -// $this->badgeIcon = 'ph ph-x-circle'; -// $this->badgeClass = 'text-rose-300 border-rose-400/30 bg-rose-500/10'; -// } else { -// $this->badgeText = 'Störung erkannt'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// } -// } -// } } -// protected function load(): void -// { -// // 1) Primär: versionierter Key -// $list = Cache::get(CacheVer::k('health:services'), []); -// // 2) Fallback: Legacy-Key (nur falls 1) leer) -// if (empty($list)) { -// $list = Cache::get('health:services', []); -// } -// -// $this->services = is_array($list) ? $list : []; -// -// $this->totalCount = count($this->services); -// $this->okCount = collect($this->services)->filter(fn($s) => (bool)($s['ok'] ?? false))->count(); -// $this->downCount = $this->totalCount - $this->okCount; -// $this->guardOk = ($this->totalCount > 0) && ($this->downCount === 0); -// -// $this->downServices = collect($this->services) -// ->filter(fn($s) => !($s['ok'] ?? false)) -// ->map(fn($s) => (string)($s['name'] ?? 'unbekannt')) -// ->values() -// ->all(); -// -// // Badge -// if ($this->totalCount === 0) { -// $this->badgeText = 'keine Daten'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// return; -// } -// -// if ($this->guardOk) { -// $this->badgeText = 'alle Dienste OK'; -// $this->badgeIcon = 'ph ph-check-circle'; -// $this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10'; -// } else { -// if ($this->downCount >= 3) { -// $this->badgeText = "{$this->downCount} Dienste down"; -// $this->badgeIcon = 'ph ph-x-circle'; -// $this->badgeClass = 'text-rose-300 border-rose-400/30 bg-rose-500/10'; -// } else { -// $this->badgeText = 'Störung erkannt'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// } -// } -// } -//} - -// -//namespace App\Livewire\Ui\System; -// -//use Illuminate\Support\Facades\Cache; -//use Livewire\Component; -// -//class WoltguardCard extends Component -//{ -// /** Gesamter Roh-Input aus dem Health-Cache (optional für später) */ -// public array $services = []; -// -// /** UI: zusammengefasster Status */ -// public bool $guardOk = false; // alle Dienste OK? -// public int $okCount = 0; // wie viele OK -// public int $totalCount = 0; // wie viele gesamt -// public int $downCount = 0; // wie viele down -// public string $badgeText = 'unbekannt'; -// public string $badgeIcon = 'ph ph-question'; -// public string $badgeClass = 'text-white/70 border-white/20 bg-white/10'; -// -// /** Optional: Liste der ausgefallenen Dienste (für Tooltip/weitere Anzeige) */ -// public array $downServices = []; -// -// /** Pollintervall steuern (z. B. 30s) */ -// public int $pollSeconds = 30; -// -// public function mount(): void -// { -// $this->load(); -// } -// -// public function render() -// { -// return view('livewire.ui.system.woltguard-card'); -// } -// -// /** Manuelles Refresh aus dem UI */ -// public function refresh(): void -// { -// $this->load(); -// } -// -// /* ---------------- intern ---------------- */ -// -// protected function load(): void -// { -// // Erwartet: Cache::put('health:services', [['name'=>'postfix','ok'=>true], ...]) -// $list = Cache::get('health:services', []); -// $this->services = is_array($list) ? $list : []; -// -// $this->totalCount = count($this->services); -// $this->okCount = collect($this->services)->filter(fn ($s) => (bool)($s['ok'] ?? false))->count(); -// $this->downCount = $this->totalCount - $this->okCount; -// $this->guardOk = ($this->totalCount > 0) && ($this->downCount === 0); -// -// // Down-Services Namen extrahieren -// $this->downServices = collect($this->services) -// ->filter(fn ($s) => !($s['ok'] ?? false)) -// ->map(fn ($s) => (string)($s['name'] ?? 'unbekannt')) -// ->values() -// ->all(); -// -// // Badge aufbereiten (Text/Style/Icon) -// if ($this->totalCount === 0) { -// $this->badgeText = 'keine Daten'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// return; -// } -// -// if ($this->guardOk) { -// $this->badgeText = 'alle Dienste OK'; -// $this->badgeIcon = 'ph ph-check-circle'; -// $this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10'; -// } else { -// // kleine Abstufung je nach Anzahl der Störungen -// if ($this->downCount >= 3) { -// $this->badgeText = "{$this->downCount} Dienste down"; -// $this->badgeIcon = 'ph ph-x-circle'; -// $this->badgeClass = 'text-rose-300 border-rose-400/30 bg-rose-500/10'; -// } else { -// $this->badgeText = 'Störung erkannt'; -// $this->badgeIcon = 'ph ph-warning-circle'; -// $this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10'; -// } -// } -// } -//}