From 64afb9d9afc93f5bfe1283f6f2fd83e806381035 Mon Sep 17 00:00:00 2001 From: boban Date: Sun, 26 Oct 2025 16:08:40 +0100 Subject: [PATCH] =?UTF-8?q?Fix:=20Mailbox=20Stats=20=C3=BCber=20Dovecot=20?= =?UTF-8?q?mit=20config/mailpool.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Livewire/Ui/System/UpdateCard.php | 3 +- app/Livewire/Ui/System/WoltguardCard.php | 152 ++++++++++++++++++----- routes/console.php | 2 +- 3 files changed, 126 insertions(+), 31 deletions(-) diff --git a/app/Livewire/Ui/System/UpdateCard.php b/app/Livewire/Ui/System/UpdateCard.php index 74fb3d3..24e0df1 100644 --- a/app/Livewire/Ui/System/UpdateCard.php +++ b/app/Livewire/Ui/System/UpdateCard.php @@ -47,7 +47,8 @@ class UpdateCard extends Component { $this->reloadVersionsAndStatus(); $this->recompute(); - $this->progressLine = $this->tailUpdateLog(); + $this->progressLine = ''; +// $this->progressLine = $this->tailUpdateLog(); if ($this->running) { $this->state = 'running'; diff --git a/app/Livewire/Ui/System/WoltguardCard.php b/app/Livewire/Ui/System/WoltguardCard.php index e37e4e3..fbcb082 100644 --- a/app/Livewire/Ui/System/WoltguardCard.php +++ b/app/Livewire/Ui/System/WoltguardCard.php @@ -2,27 +2,29 @@ namespace App\Livewire\Ui\System; +use App\Support\CacheVer; use Illuminate\Support\Facades\Cache; use Livewire\Component; class WoltguardCard extends Component { - /** Gesamter Roh-Input aus dem Health-Cache (optional für später) */ + /** Gesamter Roh-Input aus dem Health-Cache */ 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'; + /** UI: Status */ + public bool $guardOk = false; + public int $okCount = 0; + public int $totalCount = 0; + public int $downCount = 0; - /** Optional: Liste der ausgefallenen Dienste (für Tooltip/weitere Anzeige) */ + public string $badgeText = 'unbekannt'; + public string $badgeIcon = 'ph ph-question'; + public string $badgeClass = 'text-white/70 border-white/20 bg-white/10'; + + /** Liste der ausgefallenen Dienste (für Tooltip/Anzeige) */ public array $downServices = []; - /** Pollintervall steuern (z. B. 30s) */ + /** Pollintervall (Sek.) */ public int $pollSeconds = 30; public function mount(): void @@ -45,45 +47,137 @@ class WoltguardCard extends Component protected function load(): void { - // Erwartet: Cache::put('health:services', [['name'=>'postfix','ok'=>true], ...]) - $list = Cache::get('health:services', []); + // 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->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')) + ->filter(fn($s) => !($s['ok'] ?? false)) + ->map(fn($s) => (string)($s['name'] ?? 'unbekannt')) ->values() ->all(); - // Badge aufbereiten (Text/Style/Icon) + // 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 { - // 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->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->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'; +// } +// } +// } +//} diff --git a/routes/console.php b/routes/console.php index 3591a06..eda6f4d 100644 --- a/routes/console.php +++ b/routes/console.php @@ -10,7 +10,7 @@ Artisan::command('inspire', function () { })->purpose('Display an inspiring quote'); Schedule::job(RunHealthChecks::class)->everyMinute()->withoutOverlapping(); -Schedule::command('woltguard:collect-services')->everyMinute(); +//Schedule::command('woltguard:collect-services')->everyMinute(); //Schedule::command('mailwolt:check-updates')->dailyAt('04:10'); Schedule::command('mailwolt:check-updates')->everytwoMinutes();