'1.2.3.4','count'=>12],...] public function mount(): void { $this->load(); } public function render() { return view('livewire.ui.security.fail2-ban-card'); } public function refresh(): void { $this->load(true); } protected function load(bool $force=false): void { $status = @shell_exec('fail2ban-client status 2>/dev/null') ?? ''; $bans = preg_match('/Currently banned:\s+(\d+)/i', $status, $m) ? (int)$m[1] : 0; $this->activeBans = $bans; // quick & rough: last 1000 lines auth/mail logs → top IPs $log = @shell_exec('tail -n 1000 /var/log/auth.log /var/log/mail.log 2>/dev/null | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head -5'); $rows = []; if ($log) { foreach (preg_split('/\R+/', trim($log)) as $l) { if (preg_match('/^\s*(\d+)\s+(\d+\.\d+\.\d+\.\d+)/', $l, $m)) { $rows[] = ['ip'=>$m[2],'count'=>(int)$m[1]]; } } } $this->topIps = $rows; } }