mailwolt/resources/views/livewire/ui/security/clamav-manager.blade.php

199 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<x-slot:breadcrumbParent>Sicherheit</x-slot:breadcrumbParent>
<x-slot:breadcrumb>Virenschutz</x-slot:breadcrumb>
<div>
<div class="mbx-page-header">
<div class="mbx-page-title">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M8 1.5C8 1.5 3 3.5 3 7.5v3.5l5 2.5 5-2.5V7.5C13 3.5 8 1.5 8 1.5Z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/>
<path d="M5.5 8l1.5 1.5L10 6" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Virenschutz (ClamAV)
</div>
<div class="mbx-page-actions">
<button wire:click="refresh" wire:loading.attr="disabled" wire:target="refresh" class="mbx-btn-mute">
<svg width="12" height="12" viewBox="0 0 14 14" fill="none" wire:loading.class="animate-spin" wire:target="refresh"><path d="M12 7A5 5 0 1 1 7 2" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><path d="M7 2l2-2v4H5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
Aktualisieren
</button>
</div>
</div>
@if($lastSuccess)
<div style="margin-bottom:16px;padding:10px 14px;background:rgba(52,211,153,.08);border:1px solid rgba(52,211,153,.25);border-radius:8px;display:flex;align-items:center;gap:8px">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" style="color:#34d399;flex-shrink:0"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.3"/><path d="M4.5 7l2 2 3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
<span style="font-size:12.5px;color:#6ee7b7;font-weight:500">{{ $lastSuccess }}</span>
</div>
@endif
@if($lastError)
<div style="margin-bottom:16px;padding:10px 14px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.25);border-radius:8px;display:flex;align-items:center;gap:8px">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" style="color:#ef4444;flex-shrink:0"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.3"/><path d="M7 4v3.5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><circle cx="7" cy="10" r=".6" fill="currentColor"/></svg>
<span style="font-size:12.5px;color:#fca5a5;white-space:pre-wrap">{{ $lastError }}</span>
</div>
@endif
<div class="sec-layout">
{{-- ═══ Main ═══ --}}
<div style="min-width:0;display:flex;flex-direction:column;gap:16px">
{{-- Status-Karte --}}
<div class="mbx-section">
<div class="mbx-domain-head">
<div class="mbx-domain-info">
<span class="mbx-badge-mute">Status</span>
</div>
</div>
<div style="padding:16px 18px">
@if(!$installed)
<div style="display:flex;flex-direction:column;gap:14px">
<div style="display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:var(--mw-bg4);border:1px solid var(--mw-b2);border-radius:8px">
<div style="display:flex;align-items:center;gap:10px">
<div style="width:8px;height:8px;border-radius:50%;background:#6b7280;flex-shrink:0"></div>
<div>
<div style="font-size:13px;font-weight:500;color:var(--mw-t2)">ClamAV nicht installiert</div>
<div style="font-size:11.5px;color:var(--mw-t4);margin-top:2px">Paket <code style="font-size:11px;background:var(--mw-bg3);padding:1px 5px;border-radius:4px">clamav clamav-daemon</code> fehlt.</div>
</div>
</div>
<button wire:click="install" wire:loading.attr="disabled" wire:target="install"
class="mbx-btn-primary">
<svg width="12" height="12" viewBox="0 0 14 14" fill="none" wire:loading.class="animate-spin" wire:target="install"><path d="M7 1v8M4 6l3 3 3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/><path d="M2 11h10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
<span wire:loading.remove wire:target="install">Installieren</span>
<span wire:loading wire:target="install">Installiert… (ca. 1 Min.)</span>
</button>
</div>
</div>
@else
<div style="display:flex;flex-direction:column;gap:16px">
{{-- Status-Zeile --}}
<div style="display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:var(--mw-bg4);border:1px solid var(--mw-b2);border-radius:8px">
<div style="display:flex;align-items:center;gap:10px">
@if($running)
<div style="width:8px;height:8px;border-radius:50%;background:#34d399;box-shadow:0 0 6px rgba(52,211,153,.4);flex-shrink:0"></div>
<div>
<div style="font-size:13px;font-weight:500;color:var(--mw-t1)">ClamAV läuft</div>
<div style="font-size:11.5px;color:var(--mw-t4);margin-top:1px">
Aktiv{{ $enabled ? ', Autostart ein' : '' }}
@if($ramMb) · {{ $ramMb }} MB RAM @endif
</div>
</div>
@else
<div style="width:8px;height:8px;border-radius:50%;background:#6b7280;flex-shrink:0"></div>
<div>
<div style="font-size:13px;font-weight:500;color:var(--mw-t2)">ClamAV inaktiv</div>
<div style="font-size:11.5px;color:var(--mw-t4);margin-top:1px">Installiert, aber nicht aktiv{{ $enabled ? '' : ' · Autostart aus' }}</div>
</div>
@endif
</div>
<div style="display:flex;gap:8px;align-items:center">
@if($starting)
<div wire:poll.3s.keep-alive="pollStatus" style="display:flex;align-items:center;gap:8px;padding:6px 12px;background:rgba(167,139,250,.08);border:1px solid rgba(167,139,250,.25);border-radius:8px">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" style="color:#a78bfa;animation:spin 1s linear infinite;flex-shrink:0"><path d="M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
<span style="font-size:12px;color:#c4b5fd;font-weight:500">Wird gestartet…</span>
<span style="font-size:11px;color:rgba(196,181,253,.5)">{{ $startSecs }}s</span>
</div>
@elseif($running)
<button wire:click="disable" wire:loading.attr="disabled" wire:target="disable"
class="mbx-btn-danger"
onclick="return confirm('ClamAV wirklich stoppen und deaktivieren?')">
<svg width="12" height="12" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="2" stroke="currentColor" stroke-width="1.3"/></svg>
<span wire:loading.remove wire:target="disable">Deaktivieren</span>
<span wire:loading wire:target="disable">Bitte warten…</span>
</button>
@else
<button wire:click="enable" wire:loading.attr="disabled" wire:target="enable"
class="mbx-btn-primary">
<svg width="12" height="12" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
<span wire:loading.remove wire:target="enable">Aktivieren &amp; starten</span>
<span wire:loading wire:target="enable">Startet…</span>
</button>
@endif
</div>
</div>
{{-- Signaturen --}}
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
<div style="padding:10px 14px;background:var(--mw-bg4);border:1px solid var(--mw-b2);border-radius:8px">
<div style="font-size:11px;color:var(--mw-t4);margin-bottom:3px">Signatur-Datenbank</div>
<div style="font-size:13px;font-weight:500;color:var(--mw-t1)">{{ $dbDate }}</div>
@if($dbVersion !== '—')<div style="font-size:11.5px;color:var(--mw-t4);margin-top:1px">Version {{ $dbVersion }}</div>@endif
</div>
<div style="padding:10px 14px;background:var(--mw-bg4);border:1px solid var(--mw-b2);border-radius:8px;display:flex;align-items:center;justify-content:space-between">
<div>
<div style="font-size:11px;color:var(--mw-t4);margin-bottom:3px">Signaturen aktualisieren</div>
<div style="font-size:12px;color:var(--mw-t3)">Läuft automatisch täglich</div>
</div>
<button wire:click="updateDb" wire:loading.attr="disabled" wire:target="updateDb" class="mbx-btn-mute" style="flex-shrink:0">
<svg width="11" height="11" viewBox="0 0 14 14" fill="none" wire:loading.class="animate-spin" wire:target="updateDb"><path d="M12 7A5 5 0 1 1 7 2" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><path d="M7 2l2-2v4H5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
<span wire:loading.remove wire:target="updateDb">Jetzt</span>
<span wire:loading wire:target="updateDb"></span>
</button>
</div>
</div>
</div>
@endif
</div>
</div>
</div>
{{-- ═══ Sidebar ═══ --}}
<div style="display:flex;flex-direction:column;gap:12px">
{{-- RAM-Hinweis --}}
<div style="padding:12px 14px;background:rgba(245,158,11,.07);border:1px solid rgba(245,158,11,.25);border-radius:10px;display:flex;gap:10px;align-items:flex-start">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" style="color:#f59e0b;flex-shrink:0;margin-top:1px"><path d="M8 1.5L13.5 12H2.5L8 1.5Z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/><path d="M8 6v3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><circle cx="8" cy="10.5" r=".6" fill="currentColor"/></svg>
<div>
<div style="font-size:12px;font-weight:600;color:#fcd34d;margin-bottom:3px">Hoher RAM-Verbrauch</div>
<div style="font-size:11.5px;color:rgba(253,230,138,.7);line-height:1.5">
ClamAV lädt die komplette Viren-Datenbank (~500 MB) in den Arbeitsspeicher.
Empfohlen auf Servern mit mindestens 2 GB RAM.
</div>
</div>
</div>
{{-- Info --}}
<div class="mbx-section">
<div class="mbx-domain-head">
<div class="mbx-domain-info">
<span class="mbx-badge-mute">Info</span>
</div>
</div>
<div style="padding:14px 16px;display:flex;flex-direction:column;gap:8px">
<div style="font-size:12px;color:var(--mw-t3);line-height:1.6">
ClamAV prüft in Kombination mit Rspamd eingehende E-Mails auf Schadsoftware.
Infizierte Anhänge werden abgewiesen oder in Quarantäne verschoben.
</div>
<div style="display:flex;flex-direction:column;gap:6px;margin-top:2px">
<div style="display:flex;justify-content:space-between;font-size:12px;padding:6px 0;border-bottom:1px solid var(--mw-b1)">
<span style="color:var(--mw-t4)">Empfohlen bei</span>
<span style="color:var(--mw-t2);font-weight:500"> 2 GB RAM</span>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;padding:6px 0;border-bottom:1px solid var(--mw-b1)">
<span style="color:var(--mw-t4)">RAM-Verbrauch</span>
<span style="color:var(--mw-t2);font-weight:500">~500700 MB</span>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;padding:6px 0;border-bottom:1px solid var(--mw-b1)">
<span style="color:var(--mw-t4)">Integration</span>
<span style="color:var(--mw-t2);font-weight:500">Rspamd Milter</span>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;padding:6px 0">
<span style="color:var(--mw-t4)">Signaturen</span>
<span style="color:var(--mw-t2);font-weight:500">Täglich automatisch</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>