mailwolt/app/Livewire/Ui/Security/Fail2BanCard.php

35 lines
1.2 KiB
PHP

<?php
namespace App\Livewire\Ui\Security;
use Livewire\Component;
class Fail2BanCard extends Component
{
public int $activeBans = 0;
public array $topIps = []; // [['ip'=>'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;
}
}