parent
520617d9b3
commit
9d3ca94b87
|
|
@ -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)]);
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
|
|
|||
Loading…
Reference in New Issue