feat(rdp): 3389 页独立管理 RDP 主机
rdp_hosts 表与专用 API,在 3389远程页添加/连接,不再依赖子机列表。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+10
-15
@@ -11,9 +11,8 @@ from server.config import settings
|
||||
from server.domain.models import Admin
|
||||
from server.infrastructure.database.session import AsyncSessionLocal
|
||||
from server.infrastructure.database.admin_repo import AdminRepositoryImpl
|
||||
from server.infrastructure.database.server_repo import ServerRepositoryImpl
|
||||
from server.infrastructure.database.rdp_host_repo import RdpHostRepositoryImpl
|
||||
from server.infrastructure.guacamole.tunnel import bridge_websocket_to_guacd
|
||||
from server.utils.rdp_config import get_rdp_config
|
||||
|
||||
logger = logging.getLogger("nexus.rdp")
|
||||
|
||||
@@ -56,13 +55,13 @@ async def _verify_rdp_access_token(token: str) -> Optional[Admin]:
|
||||
return admin
|
||||
|
||||
|
||||
@router.websocket("/ws/rdp/{server_id}")
|
||||
@router.websocket("/ws/rdp/hosts/{host_id}")
|
||||
async def rdp_guacamole_ws(
|
||||
websocket: WebSocket,
|
||||
server_id: int = Path(...),
|
||||
host_id: int = Path(...),
|
||||
token: Optional[str] = Query(None),
|
||||
):
|
||||
"""Transparent Guacamole tunnel to guacd after JWT + server RDP checks."""
|
||||
"""Transparent Guacamole tunnel to guacd after JWT + RDP host lookup."""
|
||||
if not token:
|
||||
await websocket.close(code=4001, reason="Missing JWT token")
|
||||
return
|
||||
@@ -77,14 +76,10 @@ async def rdp_guacamole_ws(
|
||||
return
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
server_repo = ServerRepositoryImpl(session)
|
||||
server = await server_repo.get_by_id(server_id)
|
||||
if not server:
|
||||
await websocket.close(code=4404, reason="Server not found")
|
||||
return
|
||||
cfg = get_rdp_config(server)
|
||||
if not cfg.enabled:
|
||||
await websocket.close(code=4400, reason="RDP not enabled")
|
||||
repo = RdpHostRepositoryImpl(session)
|
||||
row = await repo.get_by_id(host_id)
|
||||
if not row:
|
||||
await websocket.close(code=4404, reason="RDP host not found")
|
||||
return
|
||||
|
||||
await websocket.accept(subprotocol="guacamole")
|
||||
@@ -97,13 +92,13 @@ async def rdp_guacamole_ws(
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
except OSError as exc:
|
||||
logger.warning("RDP guacd bridge failed server_id=%s: %s", server_id, exc)
|
||||
logger.warning("RDP guacd bridge failed host_id=%s: %s", host_id, exc)
|
||||
try:
|
||||
await websocket.close(code=1011, reason="guacd unreachable")
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
logger.exception("RDP tunnel error server_id=%s", server_id)
|
||||
logger.exception("RDP tunnel error host_id=%s", host_id)
|
||||
try:
|
||||
await websocket.close(code=1011, reason="RDP tunnel error")
|
||||
except Exception:
|
||||
|
||||
Reference in New Issue
Block a user