2026-07-05 22:18:00 +02:00
|
|
|
"""Audit-Helper: strukturiertes Logging aller Aktionen."""
|
|
|
|
|
import logging
|
|
|
|
|
import json
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
from typing import Optional, Dict, Any
|
|
|
|
|
import aiosqlite
|
|
|
|
|
|
|
|
|
|
from config import settings
|
2026-07-05 22:55:29 +02:00
|
|
|
from db import log_audit
|
2026-07-05 22:18:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger("audit")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def record(
|
|
|
|
|
db: aiosqlite.Connection,
|
|
|
|
|
agent_id: Optional[str],
|
|
|
|
|
user_id: str,
|
|
|
|
|
action: str,
|
|
|
|
|
target: Optional[str] = None,
|
|
|
|
|
args: Optional[Dict[str, Any]] = None,
|
|
|
|
|
result: Optional[Dict[str, Any]] = None,
|
|
|
|
|
duration_ms: Optional[int] = None,
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Schreibt einen Audit-Eintrag in DB + Logger."""
|
|
|
|
|
await log_audit(
|
|
|
|
|
db=db,
|
|
|
|
|
agent_id=agent_id,
|
|
|
|
|
user_id=user_id,
|
|
|
|
|
action=action,
|
|
|
|
|
target=target,
|
|
|
|
|
args=args,
|
|
|
|
|
result=result,
|
|
|
|
|
duration_ms=duration_ms,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
log_entry = {
|
|
|
|
|
"ts": datetime.utcnow().isoformat(),
|
|
|
|
|
"agent_id": agent_id,
|
|
|
|
|
"user_id": user_id,
|
|
|
|
|
"action": action,
|
|
|
|
|
"target": target,
|
|
|
|
|
"args": args,
|
|
|
|
|
"result": result,
|
|
|
|
|
"duration_ms": duration_ms,
|
|
|
|
|
}
|
|
|
|
|
logger.info(json.dumps(log_entry, default=str))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_recent(db: aiosqlite.Connection, limit: int = 100, agent_id: Optional[str] = None):
|
|
|
|
|
"""Holt die letzten Audit-Einträge."""
|
|
|
|
|
from db import list_audit
|
|
|
|
|
return await list_audit(db, agent_id=agent_id, limit=limit)
|