""" In-Memory-Registry der laufenden SSH/RDP-Sitzungen dieses Server-Prozesses. Wird von app/ssh_proxy/terminal_ws.py und app/rdp_proxy/ws_tunnel.py beim Sitzungsstart befuellt (Referenz auf den eigenen asyncio.Task) und beim Sitzungsende wieder entfernt. Basis fuer die Superadmin-'Sessionview' (app/admin/routes.py: GET /admin/sessions, POST /admin/sessions/{id}/terminate) -- 'Beenden' funktioniert per asyncio.Task.cancel(), was den regulaeren finally-Cleanup-Pfad der jeweiligen WS-Route ausloest (DB-Update, Audit- Log-Eintrag, WebSocket schliessen), genau wie bei einem normalen Logout. Bewusst rein prozesslokal (kein Redis/DB-Backing): bei einem einzelnen uvicorn-Worker (Standard-Deployment dieses Projekts, siehe ansible/) sieht und beendet jeder Superadmin-Request alle laufenden Sitzungen. Bei mehreren Worker-Prozessen sind nur die Sitzungen DIESES Workers 'killable' -- die Sessionview zeigt das ueber das 'killable'-Feld pro Sitzung an, statt einen Beenden-Versuch fehlschlagen zu lassen.""" from __future__ import annotations import asyncio from dataclasses import dataclass @dataclass class ActiveSession: session_id: int task: asyncio.Task _active: dict[int, ActiveSession] = {} def register(session_id: int, task: asyncio.Task) -> None: _active[session_id] = ActiveSession(session_id=session_id, task=task) def unregister(session_id: int) -> None: _active.pop(session_id, None) def get(session_id: int) -> ActiveSession | None: return _active.get(session_id) def all_ids() -> set[int]: return set(_active.keys())