"""反向隧道会话实体。 一条记录对应一次 user → server 的 SSH 反向隧道:user 连上 server 的 SSH(2022), 请求 remote port forwarding,server 在本地绑一个隧道端口,该端口经隧道回指 user 的本地服务。HTTP 路由 /api/userPort/{userName} 反代到该隧道端口。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import BigInteger, DateTime, Integer, String, func from sqlalchemy.orm import Mapped, mapped_column from ..database import Base class TunnelSession(Base): __tablename__ = "tunnel_session" id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) # 发起隧道的 user 名(对应 config.tunnel.users[].username) user_name: Mapped[str] = mapped_column(String(128), nullable=False, index=True) # user 端的公网/内网 IP(SSH 连接的 peer 地址) user_ip: Mapped[str] = mapped_column(String(64), nullable=False, default="") # user 要暴露的本地服务端口 local_port: Mapped[int] = mapped_column(Integer, nullable=False) # server 侧的隧道端口(SSH 反向转发绑定的本地端口) tunnel_port: Mapped[int] = mapped_column(Integer, nullable=False, index=True) started_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), nullable=False ) ended_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, default=None) # active / closed status: Mapped[str] = mapped_column(String(32), nullable=False, default="active") def __repr__(self) -> str: # pragma: no cover return ( f"" )