Add audit log viewer to Settings page
Deploy Dashboard / deploy (push) Successful in 28s

This commit is contained in:
Gan, Jimmy
2026-02-22 12:34:21 +08:00
parent ffac6f47bf
commit 8e8f465b40
2 changed files with 44 additions and 2 deletions
+16 -2
View File
@@ -4,8 +4,8 @@ import psutil
import platform
import time
import httpx
from fastapi import APIRouter
from config import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID
from fastapi import APIRouter, Query
from config import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, VOLUME_ROOT
router = APIRouter()
@@ -54,3 +54,17 @@ def system_stats():
"uptime": f"{days}d {hours}h",
"platform": platform.platform(),
}
@router.get("/audit-log")
def audit_log(lines: int = Query(100, le=500)):
log_path = os.path.join(VOLUME_ROOT, "docker/nas-dashboard/audit.log")
if not os.path.exists(log_path):
return {"lines": []}
with open(log_path, "rb") as f:
f.seek(0, 2)
size = f.tell()
buf = min(size, lines * 200)
f.seek(max(0, size - buf))
data = f.read().decode(errors="replace").splitlines()
return {"lines": data[-lines:]}
@@ -113,6 +113,18 @@
}
saving = false;
}
let auditLines = $state([]);
let auditLoading = $state(false);
async function loadAuditLog() {
auditLoading = true;
try {
const res = await get("/system/audit-log?lines=100");
auditLines = res.lines.reverse();
} catch {}
auditLoading = false;
}
</script>
<div class="space-y-6">
@@ -189,4 +201,20 @@
{/if}
</div>
</div>
<div class="bg-white rounded-xl border border-surface-200 p-6 shadow-sm">
<div class="flex items-center justify-between mb-4">
<h3 class="text-sm font-semibold text-surface-700">Audit Log</h3>
<button onclick={loadAuditLog} disabled={auditLoading} class="px-3 py-1.5 text-xs font-medium text-primary-600 bg-primary-50 hover:bg-primary-100 rounded-lg transition-colors disabled:opacity-50">
{auditLoading ? "Loading..." : auditLines.length ? "Refresh" : "Load"}
</button>
</div>
{#if auditLines.length > 0}
<div class="max-h-80 overflow-auto rounded-lg bg-surface-950 p-3">
<pre class="text-xs text-surface-300 font-mono whitespace-pre leading-5">{auditLines.join('\n')}</pre>
</div>
{:else if !auditLoading}
<p class="text-sm text-surface-400">Click Load to view recent audit log entries</p>
{/if}
</div>
</div>