mcsmapi 0.1.4__py3-none-any.whl → 0.1.5b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mcsmapi/models/image.py CHANGED
@@ -3,110 +3,205 @@ from pydantic import BaseModel
3
3
 
4
4
 
5
5
  class DockerConfig(BaseModel):
6
+ """容器配置"""
7
+
8
+ """容器名称"""
6
9
  containerName: str = ""
7
- image: str = "mcsm-ubuntu:22.04"
8
- memory: int = 1024 # in MB
9
- ports: List[str] = ["25565:25565/tcp"]
10
+ """镜像名称"""
11
+ image: str = ""
12
+ """容器分配内存(单位: MB)"""
13
+ memory: int = 0 # in MB
14
+ """容器端口映射"""
15
+ ports: List[str] = [] # ["25565:25565/tcp"]
16
+ """额外挂载卷路径"""
10
17
  extraVolumes: List[str] = []
18
+ """容器可使用的最大磁盘空间(单位: MB)"""
11
19
  maxSpace: Optional[int] = None
20
+ """网络配置,可以是网络名称或ID"""
12
21
  network: Optional[Union[str, int]] = None
22
+ """容器的 IO 限制"""
13
23
  io: Optional[Union[str, int]] = None
24
+ """网络模式(例如: bridge, host)"""
14
25
  networkMode: str = "bridge"
26
+ """网络别名列表"""
15
27
  networkAliases: List[str] = []
16
- cpusetCpus: str = ""
28
+ """绑定的 CPU 核心"""
29
+ cpusetCpus: str = "" # 例如 `0,1`
30
+ """CPU 使用率(单位: %)"""
17
31
  cpuUsage: int = 100
32
+ """工作目录"""
18
33
  workingDir: str = ""
34
+ """环境变量设置"""
19
35
  env: List[str] = []
20
36
 
21
37
 
22
38
  class DockerImageItem(BaseModel):
39
+ """Docker 镜像信息"""
40
+
41
+ """镜像唯一 ID"""
23
42
  Id: str = ""
43
+ """父镜像 ID"""
24
44
  ParentId: str = ""
25
- RepoTags: List[str] = []
45
+ """镜像仓库标签"""
46
+ RepoTags: List[str] = [] # 例如 ["ubuntu:latest"]
47
+ """镜像摘要"""
26
48
  RepoDigests: List[str] = []
49
+ """镜像创建时间(Unix 时间戳)"""
27
50
  Created: int = 0
51
+ """镜像大小(单位: 字节)"""
28
52
  Size: int = 0
53
+ """镜像的虚拟大小"""
29
54
  VirtualSize: int = 0
55
+ """共享存储空间大小"""
30
56
  SharedSize: int = 0
57
+ """镜像标签"""
31
58
  Labels: dict[str, str] = {}
59
+ """依赖该镜像运行的容器数量"""
32
60
  Containers: int = 0
33
61
 
34
62
 
35
63
  class DockerContainerItemPort(BaseModel):
64
+ """Docker 容器端口映射"""
65
+
66
+ """容器内部端口"""
36
67
  PrivatePort: int = 0
68
+ """映射到宿主机的端口"""
37
69
  PublicPort: Optional[int] = None
70
+ """端口类型(tcp/udp)"""
38
71
  Type: str = ""
39
72
 
40
73
 
41
74
  class DockerContainerItemNetworkSettingsNetwork(BaseModel):
75
+ """Docker 容器网络设置信息"""
76
+
77
+ """网络 ID"""
42
78
  NetworkID: str = ""
79
+ """网络端点 ID"""
43
80
  EndpointID: str = ""
81
+ """网关地址"""
44
82
  Gateway: str = ""
83
+ """分配的 IP 地址"""
45
84
  IPAddress: str = ""
85
+ """IP 地址前缀长度"""
46
86
  IPPrefixLen: int = 0
87
+ """IPv6 网关地址"""
47
88
  IPv6Gateway: str = ""
89
+ """IPv6 地址"""
48
90
  GlobalIPv6Address: str = ""
91
+ """IPv6 地址前缀长度"""
49
92
  GlobalIPv6PrefixLen: int = 0
93
+ """MAC 地址"""
50
94
  MacAddress: str = ""
51
95
 
52
96
 
53
97
  class DockerContainerItemNetworkSettings(BaseModel):
98
+ """Docker 容器的网络配置信息"""
99
+
100
+ """容器连接的所有网络"""
54
101
  Networks: dict[str, DockerContainerItemNetworkSettingsNetwork] = {}
55
102
 
56
103
 
57
104
  class DockerContainerItemMount(BaseModel):
105
+ """容器挂载点信息"""
106
+
107
+ """挂载名称"""
58
108
  Name: str = ""
109
+ """源路径"""
59
110
  Source: str = ""
111
+ """目标路径"""
60
112
  Destination: str = ""
113
+ """驱动类型"""
61
114
  Driver: str = ""
115
+ """挂载模式"""
62
116
  Mode: str = ""
117
+ """是否允许读写"""
63
118
  RW: bool = False
119
+ """传播模式"""
64
120
  Propagation: str = ""
65
121
 
66
122
 
67
123
  class DockerContainerItemHostConfig(BaseModel):
124
+ """Docker 宿主机配置"""
125
+
126
+ """网络模式"""
68
127
  NetworkMode: str = ""
69
128
 
70
129
 
71
130
  class DockerContainerItem(BaseModel):
131
+ """Docker 容器详细信息"""
132
+
133
+ """容器 ID"""
72
134
  Id: str = ""
135
+ """容器名称列表"""
73
136
  Names: List[str] = []
137
+ """运行的镜像名称"""
74
138
  Image: str = ""
139
+ """镜像 ID"""
75
140
  ImageID: str = ""
141
+ """容器启动命令"""
76
142
  Command: str = ""
143
+ """容器创建时间(Unix 时间戳)"""
77
144
  Created: int = 0
145
+ """容器状态"""
78
146
  State: str = ""
147
+ """容器运行状态描述"""
79
148
  Status: str = ""
149
+ """端口映射信息"""
80
150
  Ports: List[DockerContainerItemPort] = []
151
+ """容器标签信息"""
81
152
  Labels: dict[str, str] = {}
153
+ """读写层大小(单位: 字节)"""
82
154
  SizeRw: int = 0
155
+ """根文件系统大小(单位: 字节)"""
83
156
  SizeRootFs: int = 0
157
+ """宿主机配置"""
84
158
  HostConfig: DockerContainerItemHostConfig = DockerContainerItemHostConfig()
85
- NetworkSettings: DockerContainerItemNetworkSettings = (
86
- DockerContainerItemNetworkSettings()
87
- )
159
+ """容器网络配置"""
160
+ NetworkSettings: DockerContainerItemNetworkSettings = DockerContainerItemNetworkSettings()
161
+ """容器挂载信息"""
88
162
  Mounts: List[DockerContainerItemMount] = []
89
163
 
90
164
 
91
165
  class DockerNetworkItemIPAMConfig(BaseModel):
166
+ """Docker 网络 IPAM 配置信息"""
167
+
168
+ """子网地址"""
92
169
  Subnet: str = ""
93
170
 
94
171
 
95
172
  class DockerNetworkItemIPAM(BaseModel):
173
+ """Docker 网络的 IP 地址管理"""
174
+
175
+ """驱动类型"""
96
176
  Driver: str = ""
177
+ """IPAM 配置"""
97
178
  Config: List[DockerNetworkItemIPAMConfig] = []
98
179
 
99
180
 
100
181
  class DockerNetworkItem(BaseModel):
182
+ """Docker 网络详细信息"""
183
+
184
+ """网络名称"""
101
185
  Name: str = ""
186
+ """网络 ID"""
102
187
  Id: str = ""
188
+ """网络创建时间"""
103
189
  Created: str = ""
190
+ """网络作用范围(local/global)"""
104
191
  Scope: str = ""
192
+ """网络驱动类型"""
105
193
  Driver: str = ""
194
+ """是否启用 IPv6"""
106
195
  EnableIPv6: bool = False
196
+ """是否为内部网络"""
107
197
  Internal: bool = False
198
+ """是否可附加"""
108
199
  Attachable: bool = False
200
+ """是否为入口网络"""
109
201
  Ingress: bool = False
202
+ """IPAM 配置信息"""
110
203
  IPAM: DockerNetworkItemIPAM = DockerNetworkItemIPAM()
111
- Options: dict[str, str]
112
- Containers: Optional[dict[str, dict]] = {}
204
+ """网络选项"""
205
+ Options: dict[str, str] = {}
206
+ """连接到此网络的容器信息"""
207
+ Containers: Optional[dict[str, dict]] = {}
@@ -1,87 +1,155 @@
1
1
  from typing import List, Dict, Optional
2
2
  from pydantic import BaseModel
3
+ from mcsmapi.models.file import FileList
3
4
  from mcsmapi.models.image import DockerConfig
4
5
 
5
6
 
6
7
  class TerminalOption(BaseModel):
8
+ """终端选项"""
9
+
10
+ """是否启用颜色输出"""
7
11
  haveColor: bool = False
12
+ """是否使用伪终端 (PTY)"""
8
13
  pty: bool = True
9
14
 
10
15
 
11
16
  class EventTask(BaseModel):
17
+ """事件任务"""
18
+
19
+ """是否自动启动"""
12
20
  autoStart: bool = False
21
+ """是否自动重启"""
13
22
  autoRestart: bool = True
23
+ """是否忽略该任务"""
14
24
  ignore: bool = False
15
25
 
16
26
 
17
27
  class PingConfig(BaseModel):
28
+ """服务器 Ping 配置"""
29
+
30
+ """服务器 IP 地址"""
18
31
  ip: str = ""
32
+ """服务器端口"""
19
33
  port: int = 25565
34
+ """Ping 类型 (1: 默认类型)"""
20
35
  type: int = 1
21
36
 
22
37
 
23
38
  class InstanceConfig(BaseModel):
39
+ """实例配置信息"""
40
+
41
+ """实例名称"""
24
42
  nickname: str = "New Name"
43
+ """启动命令"""
25
44
  startCommand: str = "cmd.exe"
45
+ """停止命令"""
26
46
  stopCommand: str = "^C"
47
+ """工作目录"""
27
48
  cwd: str = ""
28
- ie: str = "gbk" # 输入编码
29
- oe: str = "gbk" # 输出编码
49
+ """输入编码"""
50
+ ie: str = "gbk"
51
+ """输出编码"""
52
+ oe: str = "gbk"
53
+ """创建时间 (Unix 时间戳)"""
30
54
  createDatetime: int = 0
55
+ """最后修改时间 (Unix 时间戳)"""
31
56
  lastDatetime: int = 0
57
+ """实例类型 (universal, minecraft 等)"""
32
58
  type: str = "universal"
59
+ """实例标签"""
33
60
  tag: List[str] = []
61
+ """实例结束时间 (可选)"""
34
62
  endTime: Optional[int] = None
63
+ """文件编码"""
35
64
  fileCode: str = "gbk"
65
+ """进程类型 (如 docker, local)"""
36
66
  processType: str = "docker"
67
+ """更新命令"""
37
68
  updateCommand: str = "shutdown -s"
69
+ """实例可执行的操作命令列表"""
38
70
  actionCommandList: List[str] = []
71
+ """换行符 (0: LF, 1: CR, 2: CRLF)"""
39
72
  crlf: int = 2
73
+ """Docker 相关配置"""
40
74
  docker: "DockerConfig" = DockerConfig()
75
+ """是否启用 RCON 远程控制"""
41
76
  enableRcon: bool = True
77
+ """RCON 连接密码"""
42
78
  rconPassword: str = ""
79
+ """RCON 端口"""
43
80
  rconPort: int = 2557
81
+ """RCON IP 地址"""
44
82
  rconIp: str = ""
83
+ """终端选项配置"""
45
84
  terminalOption: TerminalOption = TerminalOption()
85
+ """事件任务配置"""
46
86
  eventTask: EventTask = EventTask()
87
+ """服务器 Ping 监测配置"""
47
88
  pingConfig: PingConfig = PingConfig()
48
89
 
49
90
 
50
91
  class ProcessInfo(BaseModel):
92
+ """进程信息"""
93
+
94
+ """CPU 使用率 (单位: %)"""
51
95
  cpu: int = 0
96
+ """进程占用内存 (单位: KB)"""
52
97
  memory: int = 0
98
+ """父进程 ID"""
53
99
  ppid: int = 0
100
+ """进程 ID"""
54
101
  pid: int = 0
102
+ """进程创建时间 (Unix 时间戳)"""
55
103
  ctime: int = 0
104
+ """进程运行时长 (单位: 秒)"""
56
105
  elapsed: int = 0
106
+ """时间戳"""
57
107
  timestamp: int = 0
58
108
 
59
109
 
60
110
  class InstanceInfo(BaseModel):
111
+ """实例运行状态信息( 这些选项在新版中已不再支持设置,但仍在API中返回)"""
112
+
113
+ """当前玩家数量 (-1 表示未知)"""
61
114
  currentPlayers: int = -1
115
+ """文件锁状态 (0: 无锁)"""
62
116
  fileLock: int = 0
117
+ """最大允许玩家数 (-1 表示未知)"""
63
118
  maxPlayers: int = -1
119
+ """是否启用 FRP 远程服务"""
64
120
  openFrpStatus: bool = False
121
+ """玩家数量变化图表数据"""
65
122
  playersChart: List[Dict] = []
123
+ """服务器版本"""
66
124
  version: str = ""
67
125
 
68
126
 
69
127
  class InstanceDetail(BaseModel):
128
+ """实例详细信息"""
129
+
130
+ """实例的配置信息"""
70
131
  config: InstanceConfig = InstanceConfig()
132
+ """实例的运行状态信息"""
71
133
  info: InstanceInfo = InstanceInfo()
134
+ """所属的守护进程 (Daemon) ID"""
72
135
  daemonId: str = ""
136
+ """实例唯一标识符 (UUID)"""
73
137
  instanceUuid: str = ""
138
+ """实例的进程信息"""
74
139
  processInfo: ProcessInfo = ProcessInfo()
75
- space: int = 0
76
- started: int = 0 # 启动次数
77
- status: int = 0 # -1 = 忙碌, 0 = 停止, 1 = 停止中, 2 = 启动中, 3 = 运行中
140
+ """实例的存储空间大小(始终为`0`)"""
141
+ space: int = 0 # 在 MCSM 代码中,此项始终为 0,意义不明
142
+ """实例的启动次数"""
143
+ started: int = 0
144
+ """实例状态 (-1: 忙碌, 0: 停止, 1: 停止中, 2: 启动中, 3: 运行中)"""
145
+ status: int = 0
78
146
 
79
147
  def start(self) -> str | bool:
80
148
  """
81
149
  启动该实例。
82
150
 
83
151
  **返回:**
84
- <br> - str|bool: str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
152
+ - str|bool: str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
85
153
  """
86
154
  from mcsmapi.apis.instance import Instance
87
155
 
@@ -92,7 +160,7 @@ class InstanceDetail(BaseModel):
92
160
  停止该实例。
93
161
 
94
162
  **返回:**
95
- <br> - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
163
+ - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
96
164
  """
97
165
  from mcsmapi.apis.instance import Instance
98
166
 
@@ -103,7 +171,7 @@ class InstanceDetail(BaseModel):
103
171
  重启该实例。
104
172
 
105
173
  **返回:**
106
- <br> - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
174
+ - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
107
175
  """
108
176
  from mcsmapi.apis.instance import Instance
109
177
 
@@ -114,7 +182,7 @@ class InstanceDetail(BaseModel):
114
182
  强制关闭该实例。
115
183
 
116
184
  **返回:**
117
- <br> - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
185
+ - str|bool: 返回结果中的 "instanceUuid" 字段值,如果未找到该字段,则默认返回True。
118
186
  """
119
187
  from mcsmapi.apis.instance import Instance
120
188
 
@@ -125,7 +193,7 @@ class InstanceDetail(BaseModel):
125
193
  删除该实例。
126
194
 
127
195
  **返回:**
128
- <br> - str: 被删除的实例的uuid。
196
+ - str: 被删除的实例的uuid。
129
197
  """
130
198
  from mcsmapi.apis.instance import Instance
131
199
 
@@ -136,7 +204,7 @@ class InstanceDetail(BaseModel):
136
204
  升级实例。
137
205
 
138
206
  **返回:**
139
- <br> - bool: 返回操作结果,成功时返回True。
207
+ - bool: 返回操作结果,成功时返回True。
140
208
  """
141
209
  from mcsmapi.apis.instance import Instance
142
210
 
@@ -147,10 +215,10 @@ class InstanceDetail(BaseModel):
147
215
  更新该实例配置。
148
216
 
149
217
  **参数:**
150
- <br> - config (dict): 新的实例配置,以字典形式提供,缺失内容由使用原实例配置填充。
218
+ - config (dict): 新的实例配置,以字典形式提供,缺失内容由使用原实例配置填充。
151
219
 
152
220
  **返回:**
153
- <br> - str|bool: 更新成功后返回更新的实例UUID,如果未找到该字段,则默认返回True。
221
+ - str|bool: 更新成功后返回更新的实例UUID,如果未找到该字段,则默认返回True。
154
222
  """
155
223
  from mcsmapi.apis.instance import Instance
156
224
 
@@ -168,12 +236,12 @@ class InstanceDetail(BaseModel):
168
236
  重装实例。
169
237
 
170
238
  **参数:**
171
- <br> - targetUrl (str): 重装文件的目标URL。
172
- <br> - title (str): 重装文件的标题。
173
- <br> - description (str, optional): 重装文件的描述,默认为空字符串。
239
+ - targetUrl (str): 重装文件的目标URL。
240
+ - title (str): 重装文件的标题。
241
+ - description (str, optional): 重装文件的描述,默认为空字符串。
174
242
 
175
243
  **返回:**
176
- <br> - bool: 返回操作结果,成功时返回True
244
+ - bool: 返回操作结果,成功时返回True
177
245
  """
178
246
  from mcsmapi.apis.instance import Instance
179
247
 
@@ -181,24 +249,55 @@ class InstanceDetail(BaseModel):
181
249
  self.daemonId, self.instanceUuid, targetUrl, title, description
182
250
  )
183
251
 
252
+ def files(self, target: str = "", page: int = 0, page_size: int = 100) -> FileList:
253
+ """
254
+ 获取实例的文件列表。
255
+
256
+ **参数:**
257
+ - target (str, 可选): 用于文件过滤的目标路径。默认为空字符串,表示不按路径过滤
258
+ - page (int, 可选): 指定分页的页码。默认为0。
259
+ - page_size (int, 可选): 指定每页的文件数量。默认为100。
260
+
261
+ **返回:**
262
+ - FileList: 文件列表。
263
+ """
264
+ from mcsmapi.apis.file import File
265
+
266
+ return File().show(self.daemonId, self.instanceUuid, target, page, page_size)
267
+
184
268
 
185
269
  class InstanceCreateResult(BaseModel):
270
+ """实例创建结果"""
271
+
272
+ """实例唯一标识符 (UUID)"""
186
273
  instanceUuid: str = ""
274
+ """实例的配置信息"""
187
275
  config: InstanceConfig = InstanceConfig()
188
276
 
189
277
 
190
278
  class InstanceSearchList(BaseModel):
279
+ """实例搜索列表"""
280
+
281
+ """每页的实例数量"""
191
282
  pageSize: int = 0
283
+ """最大页数"""
192
284
  maxPage: int = 0
285
+ """实例详细信息列表"""
193
286
  data: List[InstanceDetail] = []
287
+ """所属的守护进程 (Daemon) ID"""
194
288
  daemonId: str = ""
195
289
 
196
290
  def __init__(self, **data: str):
291
+ """实例化对象,并在每个实例中填充 daemonId"""
197
292
  super().__init__(**data)
198
293
  for instance in self.data:
199
294
  instance.daemonId = self.daemonId
200
295
 
201
296
 
202
297
  class UserInstancesList(BaseModel):
298
+ """用户实例列表"""
299
+
300
+ """实例唯一标识符 (UUID)"""
203
301
  instanceUuid: str = ""
302
+ """所属的守护进程 (Daemon) ID"""
204
303
  daemonId: str = ""
@@ -4,60 +4,109 @@ from mcsmapi.models.daemon import DaemonModel
4
4
 
5
5
 
6
6
  class SystemUser(BaseModel):
7
+ """系统用户信息"""
8
+
9
+ """用户 ID (UID)"""
7
10
  uid: int = 0
11
+ """用户组 ID (GID)"""
8
12
  gid: int = 0
13
+ """用户名"""
9
14
  username: str = ""
15
+ """用户主目录"""
10
16
  homedir: str = ""
17
+ """默认 Shell 解释器 (可选)"""
11
18
  shell: Optional[str] = None
12
19
 
13
20
 
14
21
  class SystemInfo(BaseModel):
22
+ """系统信息"""
23
+
24
+ """当前登录用户信息"""
15
25
  user: SystemUser = SystemUser()
26
+ """系统当前时间 (Unix 时间戳)"""
16
27
  time: int = 0
28
+ """系统总内存大小 (单位: 字节)"""
17
29
  totalmem: int = 0
30
+ """系统空闲内存大小 (单位: 字节)"""
18
31
  freemem: int = 0
32
+ """操作系统类型"""
19
33
  type: str = ""
34
+ """操作系统版本"""
20
35
  version: str = ""
36
+ """系统节点名称"""
21
37
  node: str = ""
38
+ """主机名"""
22
39
  hostname: str = ""
40
+ """系统负载平均值 (过去 1、5、15 分钟)"""
23
41
  loadavg: List[float] = []
42
+ """操作系统平台"""
24
43
  platform: str = ""
44
+ """系统发行版本信息"""
25
45
  release: str = ""
46
+ """系统运行时间 (单位: 秒)"""
26
47
  uptime: float = 0
48
+ """CPU 当前使用率 (单位: %)"""
27
49
  cpu: float = 0
28
50
 
29
51
 
30
-
31
52
  class RecordInfo(BaseModel):
53
+ """安全记录信息"""
54
+
55
+ """成功登录次数"""
32
56
  logined: int = 0
57
+ """非法访问次数"""
33
58
  illegalAccess: int = 0
59
+ """被封禁的 IP 数量"""
34
60
  banips: int = 0
61
+ """登录失败次数"""
35
62
  loginFailed: int = 0
36
63
 
37
64
 
38
65
  class ChartInfo(BaseModel):
66
+ """图表数据信息"""
67
+
68
+ """系统性能数据 (CPU/内存等)"""
39
69
  system: List[Dict[str, float]] = []
70
+ """请求统计信息 (HTTP 请求数等)"""
40
71
  request: List[Dict[str, int]] = []
41
72
 
42
73
 
43
74
  class ProcessInfo(BaseModel):
75
+ """进程信息"""
76
+
77
+ """CPU 使用率 (单位: %)"""
44
78
  cpu: int = 0
79
+ """进程占用内存 (单位: KB)"""
45
80
  memory: int = 0
81
+ """进程当前工作目录"""
46
82
  cwd: str = ""
47
83
 
48
84
 
49
85
  class RemoteCountInfo(BaseModel):
86
+ """远程守护进程统计信息"""
87
+
88
+ """远程守护进程总数"""
50
89
  total: int = 0
90
+ """可用的远程守护进程数量"""
51
91
  available: int = 0
52
92
 
53
93
 
54
94
  class OverviewModel(BaseModel):
95
+ """系统概览信息"""
96
+
97
+ """系统当前版本"""
55
98
  version: str = ""
99
+ """指定的守护进程 (Daemon) 版本"""
56
100
  specifiedDaemonVersion: str = ""
101
+ """系统信息"""
57
102
  system: SystemInfo = SystemInfo()
103
+ """安全访问记录"""
58
104
  record: RecordInfo = RecordInfo()
105
+ """进程状态信息"""
59
106
  process: ProcessInfo = ProcessInfo()
107
+ """系统与请求统计图表数据"""
60
108
  chart: ChartInfo = ChartInfo()
109
+ """远程守护进程统计信息"""
61
110
  remoteCount: RemoteCountInfo = RemoteCountInfo()
111
+ """远程守护进程详细信息"""
62
112
  remote: List["DaemonModel"] = []
63
-