load(); } public function render() { return view('livewire.ui.security.spam-av-card'); } public function refresh(): void { $this->load(true); } protected function load(bool $force = false): void { // 1) Versuche erst aus Settings (DB/Redis), optional mit Cache-Shortcuts $data = $force ? null : Cache::get('dash.spamav'); if (!$data) { $data = Setting::get('spamav.metrics'); } // 2) Wenn keine Daten oder zu alt ⇒ neu sammeln $stale = !is_array($data) || (time() - (int)($data['ts'] ?? 0) > $this->maxAge); if ($force || $stale) { $data = $this->collectMetrics(); // Persistenz: Settings (DB→Redis) + UI-Cache (kurz) Setting::set('spamav.metrics', $data); Cache::put('dash.spamav', $data, 60); } // 3) Auf Properties mappen $this->ham = (int)($data['ham'] ?? 0); $this->spam = (int)($data['spam'] ?? 0); $this->reject = (int)($data['reject'] ?? 0); $this->rspamdVer = (string)($data['rspamdVer'] ?? '–'); // <- wichtig $this->clamVer = (string)($data['clamVer'] ?? '–'); $this->sigUpdated = $data['sigUpdated'] ?? null; } /** Sammelt live von rspamd/clamav – robust und schnell */ protected function collectMetrics(): array { // rspamd counters $out = trim(@shell_exec('rspamc counters 2>/dev/null') ?? ''); $ham = preg_match('/\bham\s*:\s*(\d+)/i', $out, $m1) ? (int)$m1[1] : 0; $spam = preg_match('/\bspam\s*:\s*(\d+)/i', $out, $m2) ? (int)$m2[1] : 0; $reject = preg_match('/\breject\s*:\s*(\d+)/i', $out, $m3) ? (int)$m3[1] : 0; // Versionen $clamLine = trim((string) @shell_exec('clamd --version 2>/dev/null || clamscan --version 2>/dev/null')); $clamVer = $clamLine !== '' ? $clamLine : '–'; $sigUpdated = null; if ($clamLine && preg_match('#/([^/]+\d{4})$#', $clamLine, $m)) { $sigUpdated = $m[1]; } return [ 'ts' => time(), 'ham' => $ham, 'spam' => $spam, 'reject' => $reject, 'clamLine' => $clamLine, 'clamVer' => $clamVer, 'sigUpdated' => $sigUpdated, ]; } } // //namespace App\Livewire\Ui\Security; // //use Livewire\Component; //use Illuminate\Support\Facades\Cache; // //class SpamAvCard extends Component //{ // public int $ham = 0; // public int $spam = 0; // public int $reject = 0; // public string $rspamdVer = '–'; // public string $clamVer = '–'; // public ?string $sigUpdated = null; // // public function mount(): void { $this->load(); } // public function render() { return view('livewire.ui.security.spam-av-card'); } // public function refresh(): void { $this->load(true); } // // protected function load(bool $force = false): void // { // $data = Cache::remember('dash.spamav', $force ? 1 : 60, function () { // $out = trim(@shell_exec('rspamc counters 2>/dev/null') ?? ''); // // very rough counters (adapt to your setup) // $ham = preg_match('/ham:\s*(\d+)/i', $out, $m1) ? (int)$m1[1] : 0; // $spam = preg_match('/spam:\s*(\d+)/i', $out, $m2) ? (int)$m2[1] : 0; // $reject = preg_match('/reject:\s*(\d+)/i', $out, $m3) ? (int)$m3[1] : 0; // // $rspamdVer = trim(@shell_exec('rspamadm version 2>/dev/null') ?? '') ?: '–'; // $clamVer = trim(@shell_exec('clamd --version 2>/dev/null || clamscan --version 2>/dev/null') ?? '') ?: '–'; // // // last signatures update (freshclam log) // $sigUpdated = null; // $log = @shell_exec('grep -i "Database updated" /var/log/clamav/freshclam.log | tail -n1 2>/dev/null'); // if ($log) $sigUpdated = trim($log); // // return compact('ham','spam','reject','rspamdVer','clamVer','sigUpdated'); // }); // // foreach ($data as $k => $v) $this->$k = $v; // } //}