35 lines
1.2 KiB
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;
|
|
}
|
|
}
|