audit logging

This commit is contained in:
JiriUhlir
2026-05-28 11:49:59 +02:00
parent f18aabb5ba
commit 80d82d36dd
7 changed files with 232 additions and 1 deletions
+34
View File
@@ -7,6 +7,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse
from ..auth import require_user
from ..backups import is_backup_path, list_backups
from ..config import BACKUP_SCRIPT
from ..db.audit import log_audit_event
from ..shell import run_command
from ..templates.layout import page, render_result
@@ -44,6 +45,10 @@ def backups_page(request: Request, user=Depends(require_user)):
<input readonly value="{restore_cmd}">
<button type="button" class="copy-button" data-copy-value="{restore_cmd}" onclick="copyText(this)">Kopírovat</button>
</div>
<form method="post" action="/portal/backups/restore-trigger">
<input type="hidden" name="backup_path" value="{backup_path}">
<button type="submit" class="btn-secondary">Evidovat obnovu</button>
</form>
<div class="muted">Obnova je nebezpečná a musí se spustit ručně přes SSH.</div>
</td>
<td class="actions-cell">
@@ -95,6 +100,15 @@ def backups_page(request: Request, user=Depends(require_user)):
def create_backup(user=Depends(require_user)):
result = run_command([BACKUP_SCRIPT])
status = "OK" if result.returncode == 0 else "FAILED"
log_audit_event(
user,
action="backup_create",
target_type="backup",
metadata={
"status": status,
"returncode": result.returncode,
},
)
return render_result(
title=f"Vytvoření zálohy: {status}",
@@ -116,3 +130,23 @@ def delete_backup(backup_path: str = Form(...), user=Depends(require_user)):
target.unlink()
return RedirectResponse(url="/portal/backups", status_code=303)
@router.post("/backups/restore-trigger")
def restore_trigger(backup_path: str = Form(...), user=Depends(require_user)):
target = Path(backup_path)
if not is_backup_path(target):
return HTMLResponse("Neplatná cesta k záloze", status_code=400)
log_audit_event(
user,
action="restore_trigger",
target_type="backup",
target_id=target.name,
metadata={
"backup_path": str(target),
},
)
return RedirectResponse(url="/portal/backups", status_code=303)