378 lines
20 KiB
PHP
378 lines
20 KiB
PHP
<div class="glass-card p-4 rounded-2xl border border-white/10 bg-white/5">
|
||
<div class="flex items-center justify-between mb-3">
|
||
<div class="inline-flex items-center gap-2 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full">
|
||
<i class="ph ph-shield-checkered text-white/70 text-[13px]"></i>
|
||
<span class="text-[11px] uppercase text-white/70">Fail2Ban</span>
|
||
</div>
|
||
|
||
@if($available)
|
||
<span class="px-2 py-0.5 rounded-full border text-xs
|
||
{{ $activeBans>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10' }}">
|
||
{{ $activeBans }} aktuell
|
||
</span>
|
||
@else
|
||
<span class="px-2 py-0.5 rounded-full border text-xs text-rose-300 border-rose-400/30 bg-rose-500/10">
|
||
nicht installiert
|
||
</span>
|
||
@endif
|
||
</div>
|
||
|
||
@if(!$available)
|
||
<div class="text-sm text-white/60">fail2ban-client wurde nicht gefunden.</div>
|
||
|
||
@elseif($permDenied)
|
||
<div class="text-sm text-amber-200">
|
||
Keine Berechtigung (sudo) auf <code class="font-mono">fail2ban-client</code>/<code class="font-mono">journalctl</code>/<code class="font-mono">zgrep</code>.
|
||
<span class="opacity-80">Sudo-Regel prüfen.</span>
|
||
</div>
|
||
|
||
@elseif($error)
|
||
<div class="text-sm text-amber-200">
|
||
Unerwartete Ausgabe von <code class="font-mono">fail2ban-client status</code>.
|
||
<span class="opacity-80">Details in <code>storage/logs/laravel.log</code>.</span>
|
||
</div>
|
||
|
||
@else
|
||
<div class="space-y-2">
|
||
@forelse($jails as $j)
|
||
<div class="rounded-xl border border-white/10 bg-white/5 px-3 py-2">
|
||
<div class="flex items-center justify-between">
|
||
<div class="text-white/85 font-medium">{{ $j['name'] }}</div>
|
||
<div class="flex items-center gap-2">
|
||
<span class="text-[11px] text-white/60">
|
||
Bannzeit: {{ $j['bantime'] === -1 ? 'permanent' : ($j['bantime'].'s') }}
|
||
</span>
|
||
<span class="px-2 py-0.5 rounded-full border text-[11px]
|
||
{{ $j['banned']>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-white/60 border-white/20 bg-white/5' }}">
|
||
{{ $j['banned'] }} gebannt
|
||
</span>
|
||
|
||
<button wire:click.stop="openDetails('{{ $j['name'] }}')"
|
||
class="text-[11px] px-2 py-0.5 rounded border border-white/15 bg-white/5 hover:bg-white/10">
|
||
Details
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@empty
|
||
<div class="text-sm text-white/60">Keine Jails gefunden.</div>
|
||
@endforelse
|
||
</div>
|
||
|
||
<div class="mt-4 flex justify-end">
|
||
<button wire:click="refresh" wire:loading.attr="disabled"
|
||
class="px-3 py-1.5 text-[12px] rounded-lg bg-white/5 border border-white/10 hover:bg-white/10">
|
||
<i class="ph ph-arrows-clockwise text-[13px]"></i>
|
||
<span wire:loading.remove>Neu prüfen</span>
|
||
<span wire:loading>prüfe…</span>
|
||
</button>
|
||
</div>
|
||
@endif
|
||
</div>
|
||
|
||
{{--<div class="glass-card p-4 rounded-2xl border border-white/10 bg-white/5">--}}
|
||
{{-- <div class="flex items-center justify-between mb-3">--}}
|
||
{{-- <div class="inline-flex items-center gap-2 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full">--}}
|
||
{{-- <i class="ph ph-shield-checkered text-white/70 text-[13px]"></i>--}}
|
||
{{-- <span class="text-[11px] uppercase text-white/70">Fail2Ban</span>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if($available)--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs--}}
|
||
{{-- {{ $activeBans>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10' }}">--}}
|
||
{{-- {{ $activeBans }} aktuell--}}
|
||
{{-- </span>--}}
|
||
{{-- @else--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs text-rose-300 border-rose-400/30 bg-rose-500/10">--}}
|
||
{{-- nicht installiert--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if(!$available)--}}
|
||
{{-- <div class="text-sm text-white/60">fail2ban-client wurde nicht gefunden.</div>--}}
|
||
{{-- @elseif($permDenied)--}}
|
||
{{-- <div class="text-sm text-amber-200">--}}
|
||
{{-- Keine Berechtigung auf <code class="font-mono">/var/run/fail2ban/fail2ban.sock</code>.--}}
|
||
{{-- <span class="opacity-80">Sudo-Regel prüfen.</span>--}}
|
||
{{-- </div>--}}
|
||
{{-- @else--}}
|
||
{{-- <div class="space-y-2">--}}
|
||
{{-- @forelse($jails as $j)--}}
|
||
{{-- <div class="rounded-xl border border-white/10 bg-white/5 px-3 py-2">--}}
|
||
{{-- <div class="flex items-center justify-between">--}}
|
||
{{-- <div class="text-white/85 font-medium">{{ $j['name'] }}</div>--}}
|
||
{{-- <div class="flex items-center gap-2">--}}
|
||
{{-- <span class="text-[11px] text-white/60">--}}
|
||
{{-- Bannzeit:--}}
|
||
{{-- @if($j['bantime'] === -1)--}}
|
||
{{-- permanent--}}
|
||
{{-- @else--}}
|
||
{{-- {{ $j['bantime'] }}s--}}
|
||
{{-- @endif--}}
|
||
{{-- </span>--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-[11px]--}}
|
||
{{-- {{ $j['banned']>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-white/60 border-white/20 bg-white/5' }}">--}}
|
||
{{-- {{ $j['banned'] }} gebannt--}}
|
||
{{-- </span>--}}
|
||
|
||
{{-- --}}{{-- fix: stop event bubbling --}}
|
||
{{-- <button wire:click.stop="openDetails('{{ $j['name'] }}')"--}}
|
||
{{-- class="text-[11px] px-2 py-0.5 rounded border border-white/15 bg-white/5 hover:bg-white/10">--}}
|
||
{{-- Details--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- </div>--}}
|
||
{{-- </div>--}}
|
||
{{-- @empty--}}
|
||
{{-- <div class="text-sm text-white/60">Keine Jails gefunden.</div>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- <div class="mt-4 flex justify-end">--}}
|
||
{{-- <button wire:click="refresh" wire:loading.attr="disabled"--}}
|
||
{{-- class="px-3 py-1.5 text-[12px] rounded-lg bg-white/5 border border-white/10 hover:bg-white/10">--}}
|
||
{{-- <i class="ph ph-arrows-clockwise text-[13px]"></i>--}}
|
||
{{-- <span wire:loading.remove>Neu prüfen</span>--}}
|
||
{{-- <span wire:loading>prüfe…</span>--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{--</div>--}}
|
||
|
||
{{--<div class="glass-card p-4 rounded-2xl border border-white/10 bg-white/5">--}}
|
||
{{-- <div class="flex items-center justify-between mb-3">--}}
|
||
{{-- <div class="inline-flex items-center gap-2 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full">--}}
|
||
{{-- <i class="ph ph-shield-checkered text-white/70 text-[13px]"></i>--}}
|
||
{{-- <span class="text-[11px] uppercase text-white/70">Fail2Ban</span>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if($available)--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs--}}
|
||
{{-- {{ $activeBans>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10' }}">--}}
|
||
{{-- {{ $activeBans }} aktuell--}}
|
||
{{-- </span>--}}
|
||
{{-- @else--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs text-rose-300 border-rose-400/30 bg-rose-500/10">--}}
|
||
{{-- nicht installiert--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if(!$available)--}}
|
||
{{-- <div class="text-sm text-white/60">fail2ban-client wurde nicht gefunden.</div>--}}
|
||
{{-- @elseif($permDenied)--}}
|
||
{{-- <div class="text-sm text-amber-200">--}}
|
||
{{-- Keine Berechtigung auf <code class="font-mono">/var/run/fail2ban/fail2ban.sock</code>.--}}
|
||
{{-- <span class="opacity-80">Sudo-Regel prüfen.</span>--}}
|
||
{{-- </div>--}}
|
||
{{-- @else--}}
|
||
{{-- <div class="space-y-2">--}}
|
||
{{-- @forelse($jails as $j)--}}
|
||
{{-- <div class="rounded-xl border border-white/10 bg-white/5 px-3 py-2">--}}
|
||
{{-- <div class="flex items-center justify-between">--}}
|
||
{{-- <div class="text-white/85 font-medium">{{ $j['name'] }}</div>--}}
|
||
|
||
{{-- <div class="flex items-center gap-2">--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-[11px]--}}
|
||
{{-- {{ $j['banned']>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-white/60 border-white/20 bg-white/5' }}">--}}
|
||
{{-- {{ $j['banned'] }} gebannt--}}
|
||
{{-- </span>--}}
|
||
{{-- --}}{{-- Optional: Details öffnen (Tab/Modal) --}}
|
||
{{-- <button wire:click="openDetails('{{ $j['name'] }}')"--}}
|
||
{{-- class="text-[11px] px-2 py-0.5 rounded border border-white/15 bg-white/5 hover:bg-white/10">--}}
|
||
{{-- Details--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- </div>--}}
|
||
{{-- </div>--}}
|
||
{{-- @empty--}}
|
||
{{-- <div class="text-sm text-white/60">Keine Jails gefunden.</div>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- <div class="mt-4 flex justify-end">--}}
|
||
{{-- <button wire:click="refresh" wire:loading.attr="disabled"--}}
|
||
{{-- class="px-3 py-1.5 text-[12px] rounded-lg bg-white/5 border border-white/10 hover:bg-white/10">--}}
|
||
{{-- <i class="ph ph-arrows-clockwise text-[13px]"></i>--}}
|
||
{{-- <span wire:loading.remove>Neu prüfen</span>--}}
|
||
{{-- <span wire:loading>prüfe…</span>--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{--</div>--}}
|
||
|
||
{{--<div class="glass-card p-4 rounded-2xl border border-white/10 bg-white/5">--}}
|
||
{{-- <div class="flex items-center justify-between mb-3">--}}
|
||
{{-- <div class="inline-flex items-center gap-2 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full">--}}
|
||
{{-- <i class="ph ph-shield-checkered text-white/70 text-[13px]"></i>--}}
|
||
{{-- <span class="text-[11px] uppercase text-white/70">Fail2Ban</span>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if($available)--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs--}}
|
||
{{-- {{ $activeBans>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10' }}">--}}
|
||
{{-- {{ $activeBans }} aktuell--}}
|
||
{{-- </span>--}}
|
||
{{-- @else--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs text-rose-300 border-rose-400/30 bg-rose-500/10">--}}
|
||
{{-- nicht installiert--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if(!$available)--}}
|
||
{{-- <div class="text-sm text-white/60">fail2ban-client wurde nicht gefunden.</div>--}}
|
||
{{-- @else--}}
|
||
{{-- --}}{{-- Jails --}}
|
||
{{-- <div class="space-y-2">--}}
|
||
{{-- @forelse($jails as $j)--}}
|
||
{{-- <div class="rounded-xl border border-white/10 bg-white/5 px-3 py-2">--}}
|
||
{{-- <div class="flex items-center justify-between">--}}
|
||
{{-- <div class="text-white/85 font-medium">{{ $j['name'] }}</div>--}}
|
||
{{-- <div class="flex items-center gap-2">--}}
|
||
{{-- <span class="text-[11px] text-white/50">--}}
|
||
{{-- Bannzeit:--}}
|
||
{{-- @if($j['bantime'] === -1) permanent--}}
|
||
{{-- @else {{ $j['bantime'] }}s--}}
|
||
{{-- @endif--}}
|
||
{{-- </span>--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-[11px]--}}
|
||
{{-- {{ $j['banned']>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-white/60 border-white/20 bg-white/5' }}">--}}
|
||
{{-- {{ $j['banned'] }} gebannt--}}
|
||
{{-- </span>--}}
|
||
{{-- </div>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if(!empty($j['ips']))--}}
|
||
{{-- <div class="mt-2 grid gap-1">--}}
|
||
{{-- @foreach($j['ips'] as $ip)--}}
|
||
{{-- <div class="flex items-center gap-2 text-[12px] text-white/80 font-mono">--}}
|
||
{{-- <span>{{ $ip['ip'] }}</span>--}}
|
||
{{-- @if($ip['remaining'] === -1)--}}
|
||
{{-- <span class="px-1.5 py-0.5 rounded border border-rose-400/30 bg-rose-500/10 text-rose-200">--}}
|
||
{{-- permanent--}}
|
||
{{-- </span>--}}
|
||
{{-- @elseif(is_int($ip['remaining']) && $ip['remaining'] > 0)--}}
|
||
{{-- <span class="px-1.5 py-0.5 rounded border border-amber-400/30 bg-amber-500/10 text-amber-100">--}}
|
||
{{-- {{ gmdate('H\h i\m s\s', $ip['remaining']) }}--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
{{-- @endforeach--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
{{-- @empty--}}
|
||
{{-- <div class="text-sm text-white/60">Keine Jails gefunden.</div>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- --}}{{-- Top IPs aus Ban-Events --}}
|
||
{{-- <div class="mt-4">--}}
|
||
{{-- <div class="text-sm text-white/70">Top IPs (letzte Fail2Ban-Logs):</div>--}}
|
||
{{-- <ul class="mt-2 space-y-1 text-sm">--}}
|
||
{{-- @forelse($topIps as $i)--}}
|
||
{{-- <li class="flex justify-between">--}}
|
||
{{-- <span class="text-white/80 font-mono">{{ $i['ip'] }}</span>--}}
|
||
{{-- <span class="text-white/60">{{ $i['count'] }}</span>--}}
|
||
{{-- </li>--}}
|
||
{{-- @empty--}}
|
||
{{-- <li class="text-white/50">–</li>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </ul>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- <div class="mt-4 flex justify-end">--}}
|
||
{{-- <button wire:click="refresh" wire:loading.attr="disabled"--}}
|
||
{{-- class="px-3 py-1.5 text-[12px] rounded-lg bg-white/5 border border-white/10 hover:bg-white/10">--}}
|
||
{{-- <i class="ph ph-arrows-clockwise text-[13px]"></i>--}}
|
||
{{-- <span wire:loading.remove>Neu prüfen</span>--}}
|
||
{{-- <span wire:loading>prüfe…</span>--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{--</div>--}}
|
||
|
||
{{--<div class="glass-card p-4 rounded-2xl border border-white/10 bg-white/5">--}}
|
||
{{-- <div class="flex items-center justify-between mb-3">--}}
|
||
{{-- <div class="inline-flex items-center gap-2 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full">--}}
|
||
{{-- <i class="ph ph-shield-checkered text-white/70 text-[13px]"></i>--}}
|
||
{{-- <span class="text-[11px] uppercase text-white/70">Fail2Ban</span>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if($available)--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs--}}
|
||
{{-- {{ $activeBans>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10' }}">--}}
|
||
{{-- {{ $activeBans }} aktuell--}}
|
||
{{-- </span>--}}
|
||
{{-- @else--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-xs text-rose-300 border-rose-400/30 bg-rose-500/10">--}}
|
||
{{-- nicht installiert--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- @if(!$available)--}}
|
||
{{-- <div class="text-sm text-white/60">fail2ban-client wurde nicht gefunden.</div>--}}
|
||
{{-- @else--}}
|
||
{{-- --}}{{-- Jails --}}
|
||
{{-- <div class="space-y-2">--}}
|
||
{{-- @forelse($jails as $j)--}}
|
||
{{-- <div class="rounded-xl border border-white/10 bg-white/5 px-3 py-2">--}}
|
||
{{-- <div class="flex items-center justify-between">--}}
|
||
{{-- <div class="text-white/85 font-medium">{{ $j['name'] }}</div>--}}
|
||
{{-- <span class="px-2 py-0.5 rounded-full border text-[11px]--}}
|
||
{{-- {{ $j['banned']>0 ? 'text-amber-200 border-amber-400/30 bg-amber-500/10' : 'text-white/60 border-white/20 bg-white/5' }}">--}}
|
||
{{-- {{ $j['banned'] }} gebannt--}}
|
||
{{-- </span>--}}
|
||
{{-- </div>--}}
|
||
{{-- @if(!empty($j['ips']))--}}
|
||
{{-- <div class="mt-1 text-[12px] text-white/65 font-mono break-words">--}}
|
||
{{-- {{ implode(', ', $j['ips']) }}--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
{{-- @empty--}}
|
||
{{-- <div class="text-sm text-white/60">Keine Jails gefunden.</div>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- --}}{{-- Top IPs aus Ban-Events --}}
|
||
{{-- <div class="mt-3">--}}
|
||
{{-- <div class="text-sm text-white/70">Top IPs (letzte Fail2Ban-Logs):</div>--}}
|
||
{{-- <ul class="mt-2 space-y-1 text-sm">--}}
|
||
{{-- @foreach($j['ips'] as $ip)--}}
|
||
{{-- <div class="flex items-center gap-2 text-[12px] text-white/80 font-mono">--}}
|
||
{{-- <span>{{ $ip['ip'] }}</span>--}}
|
||
{{-- @if($ip['remaining'] === -1)--}}
|
||
{{-- <span class="px-1.5 py-0.5 rounded border border-rose-400/30 bg-rose-500/10 text-rose-200">permanent</span>--}}
|
||
{{-- @elseif(is_int($ip['remaining']) && $ip['remaining'] > 0)--}}
|
||
{{-- <span class="px-1.5 py-0.5 rounded border border-amber-400/30 bg-amber-500/10 text-amber-100">--}}
|
||
{{-- {{ gmdate('H\h i\m s\s', $ip['remaining']) }}--}}
|
||
{{-- </span>--}}
|
||
{{-- @endif--}}
|
||
{{-- </div>--}}
|
||
{{-- @endforeach--}}
|
||
{{-- @forelse($topIps as $i)--}}
|
||
{{-- <li class="flex justify-between">--}}
|
||
{{-- <span class="text-white/80 font-mono">{{ $i['ip'] }}</span>--}}
|
||
{{-- <span class="text-white/60">{{ $i['count'] }}</span>--}}
|
||
{{-- </li>--}}
|
||
{{-- @empty--}}
|
||
{{-- <li class="text-white/50">–</li>--}}
|
||
{{-- @endforelse--}}
|
||
{{-- </ul>--}}
|
||
{{-- </div>--}}
|
||
|
||
{{-- <div class="mt-4 flex justify-end">--}}
|
||
{{-- <button wire:click="refresh" wire:loading.attr="disabled"--}}
|
||
{{-- class="px-3 py-1.5 text-[12px] rounded-lg bg-white/5 border border-white/10 hover:bg-white/10">--}}
|
||
{{-- <i class="ph ph-arrows-clockwise text-[13px]"></i>--}}
|
||
{{-- <span wire:loading.remove>Neu prüfen</span>--}}
|
||
{{-- <span wire:loading>prüfe…</span>--}}
|
||
{{-- </button>--}}
|
||
{{-- </div>--}}
|
||
{{-- @endif--}}
|
||
{{--</div>--}}
|