From d84537b34368223ea990d5aaa5e70d9a35fd89d6 Mon Sep 17 00:00:00 2001 From: boban Date: Mon, 27 Apr 2026 04:10:02 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Fail2ban=20Restzeit-Fallback=20bei=20abg?= =?UTF-8?q?elaufenem=20DB-Eintrag=20+=20Update-Modal=202s=20Verz=C3=B6geru?= =?UTF-8?q?ng=20vor=20done-State?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Livewire/Ui/Security/Fail2banBanlist.php | 33 +++++++++++++------- scripts/update.sh | 3 ++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/Livewire/Ui/Security/Fail2banBanlist.php b/app/Livewire/Ui/Security/Fail2banBanlist.php index ffd4486..13918ea 100644 --- a/app/Livewire/Ui/Security/Fail2banBanlist.php +++ b/app/Livewire/Ui/Security/Fail2banBanlist.php @@ -154,23 +154,32 @@ class Fail2banBanlist extends Component escapeshellarg($db), escapeshellarg($q)); $out = trim((string)@shell_exec($cmd)); - if ($out === '') { - return ['permanent' => $fallbackPermanent, 'remaining' => '']; + if ($out !== '') { + [$timeofban, $bantime] = array_pad(explode('|', $out), 2, '0'); + $timeofban = (int)$timeofban; + $bantime = (int)$bantime; + + if ($bantime < 0) { + return ['permanent' => true, 'remaining' => '']; + } + + $remaining = ($timeofban + $bantime) - time(); + if ($remaining > 0) { + return ['permanent' => false, 'remaining' => $this->formatRemaining($remaining)]; + } } - [$timeofban, $bantime] = array_pad(explode('|', $out), 2, '0'); - $timeofban = (int)$timeofban; - $bantime = (int)$bantime; - - if ($bantime < 0) { + // Fallback: DB-Eintrag ist abgelaufen (fail2ban-Neustart setzt Timer intern neu, + // ohne die DB zu aktualisieren) → konfigurierte Jail-Banzeit als Näherung + $cfgBantime = (int)trim($this->f2b('get ' . escapeshellarg($jail) . ' bantime')); + if ($cfgBantime < 0) { return ['permanent' => true, 'remaining' => '']; } + if ($cfgBantime > 0) { + return ['permanent' => false, 'remaining' => '≤ ' . $this->formatRemaining($cfgBantime)]; + } - $remaining = max(0, ($timeofban + $bantime) - time()); - return [ - 'permanent' => false, - 'remaining' => $this->formatRemaining($remaining), - ]; + return ['permanent' => $fallbackPermanent, 'remaining' => '']; } private function formatRemaining(int $seconds): string diff --git a/scripts/update.sh b/scripts/update.sh index eb626bb..23a84d5 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -369,6 +369,9 @@ _cleanup() { sudo -u "${APP_USER}" php "${APP_DIR}/artisan" optimize:clear 2>&1 || true sudo -u "${APP_USER}" php "${APP_DIR}/artisan" optimize 2>&1 || true fi + # Kurz warten damit das tee-Pipe den Log vollständig schreibt + # bevor der State auf "done" gesetzt wird + sleep 2 mkdir -p "$STATE_DIR" echo "done" > "$STATE_DIR/state" echo "$rc" > "$STATE_DIR/rc"