// sandbox.go v1.6 package sandbox import ( "os" "os/exec" "sync" ) var pluginConfig = struct { Root string // 沙盒临时根目录物理路径 Runtime map[string]*RuntimeConfig // 运行时配置 }{} var sandboxList = map[string]*Sandbox{} var sandboxLock = sync.RWMutex{} // Volume 挂载配置 type Volume struct { Source string // 宿主机路径或类型(如 tmpfs) Target string // 沙盒内路径 ReadOnly bool // 是否只读 } // Limits 资源限制 type Limits struct { Cpu float64 // CPU 核心限制 (如 0.5) Mem float64 // 内存限制 (单位: GB) Swap float64 // SWAP 限制 (单位: GB) Shm uint // /dev/shm 大小 (单位: MB) Tmp uint // /tmp 大小 (单位: MB) } // Config 沙盒启动配置 type Config struct { Name string // 沙盒名称 ProjectDir string // 宿主机的工作目录(自动映射到SandboxWorkDir) WorkDir string // 沙盒内的工作目录 Envs map[string]string // 环境变量 Volumes []Volume // 挂载列表 Limits Limits // 资源限制 Network struct { AllowInternet bool // 是否允许出站网络连接,默认关闭,配置后只开放非本地网络访问 AllowLocalNetwork bool // 是否允许访问本地网络,默认关闭,配置后只开放10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 AllowListen []int // 允许监听端口列表,默认关闭所有监听端口和进站连接 AllowList []string // 允许出站访问的 IP/端口 列表,同时放开TCP&UDP,在拒绝的基础上允许访问白名单 BlockList []string // 拒绝访问的 IP/端口 列表,同时拒绝TCP&UDP,在允许的基础上拒绝黑名单 } Gpu struct { Driver string // 驱动或厂商,如 "nvidia", "amd", "apple" Devices []string // 设备 ID,如 ["0", "1"] 或 ["all"] } ExtraOptions []string // 额外参数 AutoStart bool // 是否自动启动沙盒进程 StartCmd string StartArgs []string Runtime struct { Language string Version string Venv string } NoLog bool // 是否不显示沙盒运行日志 } // Status 沙盒实时状态信息 type Status struct { Id string // 沙盒唯一标识 (用于目录名、Cgroup 名) Pid int // 宿主机上的进程 PID Alive bool // 物理进程是否正在运行 Status string // 状态 StartTime int64 // 启动时间 (Unix 时间戳) Uptime int64 // 运行耗时 (单位: 秒) MemoryUsage uint // 当前内存使用 (单位: MB) CpuUsage float64 // 当前 CPU 使用率 (百分比) } type State struct { Id string Pid int StartTime int64 WorkDir string MountedList []string } type Sandbox struct { id string pid int uid int gid int root string workDir string config *Config cmd *exec.Cmd mountedList []string startTime int64 lastLogFd *os.File errorLogFd *os.File status string lock sync.Mutex extra map[string]any }