Feature: Globales „Aufgaben"-Panel (Task-Center) für benutzergetriggerte Hintergrund-Prozesse #155
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Ein dauerhaft sichtbares, andockbares Aufgaben-Panel am unteren Rand des Dashboards — wie das
Proxmox-„Tasks"-Panel. Es zeigt laufende und vergangene vom Benutzer angestoßene
Hintergrund-Prozesse mit Live-Status, Fortschritt und Log-Ausgabe, app-weit auf jeder Seite.
Erfasste Prozesse (v1):
Ausgangslage im Code
Zwei Gruppen — und genau deshalb eine zentrale Tabelle statt reiner Aggregation:
POST /api/update/bulk-job(+_run_bulk_job)BulkRun+UpdateLog✓POST /api/security/.../cve-scanVMCveScan+VMCveReport✓POST /api/security/port-scan/bulk-bg(+_bulk_scan_worker)VMPortSnapshot+scan-state✓GET /api/nodes/{n}/vms/bulk-vm-agent-update-stream(SSE)GET /api/nodes/{n}/qemu-scan-stream(SSE)POST /api/nodes/{n}/agent-update(force_agent_update, admin_router)Vorhandene Bausteine zum Wiederverwenden:
TailHub(In-Memory-Pubsub,services/log_tail_hub.py),SSE-Muster (
EventSourceim Frontend, z.B.UpdatesTab), der globalebulkUpdate-Store(localStorage-persistiert), UI-Komponenten (
Card,Badge,Btn,Terminal/LogTailViewer).App-Shell:
frontend/src/routes/(app)/+layout.svelte(<main>{@render children()}</main>).Architektur (festgelegt)
Schlanke zentrale
tasks-Tabelle + Task-Hub. Jeder der 5 Trigger:task-Zeile an (kind, Scope, User,status=running),status,finished_at, gekappterlog_text).Fachliche Ergebnisse bleiben in ihren Tabellen (
UpdateLog,VMPortSnapshot,VMCveScan/Report).tasksist nur der vereinheitlichende Index + Log-Kanal. Eine spätere Aggregation/Verknüpfungüber
ref_idbleibt möglich.Datenmodell (neu:
server/models/task.py, Migration)Service (neu:
server/services/task_hub.py)TailHub(Subscriber =asyncio.Queue;publish(event)).async def start(db, *, kind, title, node=None, vmid=None, user=None, tenant_id=None, total=None) -> Task→ Row anlegen, Event
task_createdpublishen.async def log(task_id, line)→ Per-Task-Puffer + Eventtask_log; periodisch inlog_textflushen (gekappt).async def progress(task_id, done, total=None, failed=None)→ Update + Eventtask_progress.async def finish(task_id, status, summary=None, error=None)→ Row finalisieren,log_textflushen, Eventtask_finished.Wrapping der 5 Trigger (minimal-invasiv)
update_router,_run_bulk_job):BulkRun-Lifecycle um Task ergänzen(
ref_id = bulk_run.id), pro Itemtask.log+task.progress.deploy_router, bulk-vm-agent-update-stream): Task bei Stream-Öffnung starten,jede SSE-Zeile
task.log, am Stream-Endetask.finish.admin_router, qemu-scan-stream): gleiches Muster.security_router,_cve_scan_inner/run_security_bulk_scan): start/log/finish.security_router,_bulk_scan_worker+ Einzel-Port-Scan): start/log/finish.admin_router.force_agent_update,POST /nodes/{node}/agent-update): Task starten, Update-Ausgabe loggen, finish(status).API (neu:
server/routers/task_router.py)Scope: an die bestehende Tenant-Sichtbarkeit koppeln; superadmin sieht alles. In
main.pyregistrieren.Frontend
frontend/src/lib/stores/tasks.svelte.ts: initiale Liste via/api/tasks, danachEventSource('/api/tasks/stream'); Events reaktiv in die Liste mergen. Eingeklappt/ausgeklappt +Höhe in localStorage.
frontend/src/lib/components/tasks/TaskDock.svelte, gerendert in(app)/+layout.sveltenach<main>(app-weit):(Status mit Fortschrittsbalken bei laufenden), Filter (kind/status), neueste zuerst, „mehr laden".
log_textaus
/api/tasks/{id}; im Terminal-/LogTailViewer-Stil (monospace<pre>).BulkUpdateModebleibt als „VMs wählen + starten"-Modal; der Fortschritt tauchtzusätzlich global im Dock auf (vorhandenen Flow nicht brechen).
Akzeptanzkriterien
Prompt für Claude Code
Offen / später
kinds aufnehmen.tasks(Retention, z.B. > 90 Tage / > N pro Tenant).