mcsmapi 0.1.5b1__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/apis/daemon.py CHANGED
@@ -1,10 +1,63 @@
1
1
  from typing import Any
2
2
  from mcsmapi.pool import ApiPool
3
3
  from mcsmapi.request import send
4
- from mcsmapi.models.daemon import DaemonConfig
4
+ from mcsmapi.models.daemon import DaemonConfig, DaemonModel
5
+ from mcsmapi.models.daemon.instance import InstanceDetail
5
6
 
6
7
 
7
8
  class Daemon:
9
+ def show(self) -> list[DaemonConfig]:
10
+ """
11
+ 获取全部节点配置信息
12
+
13
+ 返回:
14
+ - List[DaemonConfig]: 节点的配置信息列表
15
+ """
16
+ daemons = send(
17
+ "GET",
18
+ f"{ApiPool.SERVICE}/remote_services_list",
19
+ )
20
+ return [DaemonConfig(**daemon) for daemon in daemons]
21
+
22
+ def system(self) -> list[DaemonModel]:
23
+ """
24
+ 获取全部节点的系统信息
25
+
26
+ 返回:
27
+ - List[DaemonModel]: 节点系统信息列表
28
+ """
29
+ daemons = send(
30
+ "GET",
31
+ f"{ApiPool.SERVICE}/remote_services_system",
32
+ )
33
+ return [DaemonModel(**daemon) for daemon in daemons]
34
+
35
+ def instances(self, daemonId: str, page: int = 0, page_size: int = 10, instance_name: str = "", status: int = 0, tag: list[str] | None = None) -> list[InstanceDetail]:
36
+ """
37
+ 查询指定节点下的实例详细信息
38
+
39
+ 参数:
40
+ - `daemonId` (str): 要查询的守护进程(Daemon)的唯一标识符。
41
+ - `page` (int, 默认=0): 分页查询的页码(从 0 开始)。
42
+ - `page_size` (int, 默认=10): 每页返回的实例数量。
43
+ - `instance_name` (str, 默认=""): 过滤指定名称的实例。
44
+ - `status` (int, 默认=0): 过滤指定状态的实例,如运行中、已停止等。
45
+ - `tag` (List[str] | None, 默认=None): 根据标签筛选实例(可选参数)。
46
+
47
+ 返回:
48
+ - `List[InstanceDetail]`: 包含实例详细信息的列表。
49
+
50
+ 注意:
51
+ - 此方法尚未实现 (`raise RuntimeError`),因为 MCSM 官方文档未提供足够的信息。
52
+ - 由于根据 MCSM 源代码的测试无法获取有效数据,目前无法完成该功能的开发。
53
+ - 如果你有具体的实现思路,请在 issue 中提出
54
+ - 可供参考 MCSM 源码: [daemon_router.ts 第 32 行](https://github.com/MCSManager/MCSManager/blob/master/panel%2Fsrc%2Fapp%2Frouters%2Fdaemon_router.ts#L32-L32)
55
+ - 模型定义代码: https://github.com/MCSManager/MCSManager/blob/master/frontend%2Fsrc%2Fservices%2Fapis%2Findex.ts#L86-L86
56
+ - 测试地址示例:
57
+ `http://localhost:23333/api/service/remote_service_instances?apikey=xxx&daemonId=xxx&page=0&page_size=10&status=3&instance_name=`
58
+ """
59
+ raise RuntimeError("此方法尚未实现")
60
+
8
61
  def add(self, config: dict[str, Any]) -> str:
9
62
  """
10
63
  新增一个节点。
mcsmapi/apis/file.py CHANGED
@@ -13,6 +13,7 @@ class File:
13
13
  target: str = "",
14
14
  page: int = 0,
15
15
  page_size: int = 100,
16
+ file_name: str = ""
16
17
  ) -> FileList:
17
18
  """
18
19
  获取文件列表
@@ -23,6 +24,7 @@ class File:
23
24
  - target (str, 可选): 用于文件过滤的目标路径。默认为空字符串,表示不按路径过滤。
24
25
  - page (int, 可选): 指定分页的页码。默认为0。
25
26
  - page_size (int, 可选): 指定每页的文件数量。默认为100。
27
+ - file_name (str, 可选): 用于在文件列表中过滤出名称包含指定字符串的文件或文件夹
26
28
 
27
29
  **返回:**
28
30
  - FileList: 包含文件列表信息和分页详情的FileList模型。
@@ -36,6 +38,7 @@ class File:
36
38
  "target": target,
37
39
  "page": page,
38
40
  "page_size": page_size,
41
+ "file_name": file_name,
39
42
  },
40
43
  )
41
44
  return FileList(**result, daemonId=daemonId, uuid=uuid)
@@ -223,8 +226,8 @@ class File:
223
226
  **参数:**
224
227
  - daemonId (str): 守护进程的唯一标识符。
225
228
  - uuid (str): 实例的唯一标识符。
226
- - source (str): 需要压缩到的 zip 文件路径。
227
- - targets (list): 要压缩的目标文件或文件夹的路径。
229
+ - source (str): 需要压缩的文件路径。
230
+ - targets (list): 要压缩到的目标文件的路径。
228
231
 
229
232
  **返回:**
230
233
  - bool: 压缩成功后返回True。
mcsmapi/models/daemon.py CHANGED
@@ -4,48 +4,89 @@ from mcsmapi.models.instance import InstanceCreateResult
4
4
 
5
5
 
6
6
  class CpuMemChart(BaseModel):
7
+ """节点资源使用率信息"""
8
+
9
+ """cpu使用率"""
7
10
  cpu: float = 0
11
+ """内存使用率"""
8
12
  mem: float = 0
9
13
 
10
14
 
11
15
  class ProcessInfo(BaseModel):
16
+ """节点进程详细信息"""
17
+
18
+ """远程节点使用的cpu资源(单位: byte)"""
12
19
  cpu: int = 0
20
+ """远程节点使用的内存资源(单位: byte)"""
13
21
  memory: int = 0
22
+ """远程节点的工作路径"""
14
23
  cwd: str = ""
15
24
 
16
25
 
17
26
  class InstanceInfo(BaseModel):
27
+ """实例统计信息"""
28
+
29
+ """运行中实例数量"""
18
30
  running: int = 0
31
+ """全部实例数量"""
19
32
  total: int = 0
20
33
 
21
34
 
22
35
  class SystemInfo(BaseModel):
36
+ """节点系统信息"""
37
+
38
+ """系统类型"""
23
39
  type: str = ""
40
+ """主机名"""
24
41
  hostname: str = ""
42
+ """平台架构"""
25
43
  platform: str = ""
44
+ """系统版本"""
26
45
  release: str = ""
46
+ """系统运行时间(单位: sec)"""
27
47
  uptime: float = 0
48
+ """远程节点运行路径"""
28
49
  cwd: str = ""
50
+ """系统负载平均值(仅适用于 Linux 和 macOS),表示过去 **1 分钟、5 分钟、15 分钟** 内的 CPU 负载情况"""
29
51
  loadavg: List[float] = []
52
+ """可用内存(单位: byte)"""
30
53
  freemem: int = 0
54
+ """cpu使用率"""
31
55
  cpuUsage: float = 0
56
+ """内存使用率"""
32
57
  memUsage: float = 0
58
+ """内存总量(单位: byte)"""
33
59
  totalmem: int = 0
60
+ """未知,在MCSM代码中始终为0"""
34
61
  processCpu: int = 0
62
+ """未知,在MCSM代码中始终为0"""
35
63
  processMem: int = 0
36
64
 
37
65
 
38
66
  class DaemonModel(BaseModel):
67
+ """节点详细信息"""
68
+
69
+ """远程节点版本"""
39
70
  version: str = ""
71
+ """远程节点的基本信息"""
40
72
  process: ProcessInfo = ProcessInfo()
73
+ """远程节点实例基本信息"""
41
74
  instance: InstanceInfo = InstanceInfo()
75
+ """远程节点系统信息"""
42
76
  system: SystemInfo = SystemInfo()
77
+ """cpu和内存使用趋势"""
43
78
  cpuMemChart: List[CpuMemChart] = []
79
+ """远程节点的uuid"""
44
80
  uuid: str = ""
81
+ """远程节点的ip"""
45
82
  ip: str = ""
83
+ """远程节点的端口"""
46
84
  port: int = 24444
85
+ """远程节点的路径前缀"""
47
86
  prefix: str = ""
87
+ """远程节点的可用状态"""
48
88
  available: bool = False
89
+ """远程节点的备注"""
49
90
  remarks: str = ""
50
91
 
51
92
  def delete(self) -> bool:
@@ -127,8 +168,15 @@ class DaemonModel(BaseModel):
127
168
 
128
169
 
129
170
  class DaemonConfig(BaseModel):
171
+ """节点配置信息"""
172
+
173
+ """远程节点的ip"""
130
174
  ip: str = "localhost"
175
+ """远程节点的端口"""
131
176
  port: int = 24444
177
+ """远程节点的路径前缀"""
132
178
  prefix: str = ""
179
+ """远程节点的备注"""
133
180
  remarks: str = "New Daemon"
181
+ """远程节点的可用状态"""
134
182
  available: bool = True
mcsmapi/models/file.py CHANGED
@@ -4,14 +4,26 @@ import os
4
4
 
5
5
 
6
6
  class FileItem(BaseModel):
7
- name: str = "New File"
7
+ """文件信息"""
8
+
9
+ """文件名称"""
10
+ name: str = ""
11
+ """文件大小(单位: byte)"""
8
12
  size: int = 0 # byte
13
+ """文件修改时间"""
9
14
  time: str = ""
15
+ """文件操作权限(仅适用于Linux)"""
10
16
  mode: int = 777 # Linux file permission
17
+ """文件类型,`0`为文件夹,`1`为文件"""
11
18
  type: int = 0 # 0 = Folder, 1 = File
19
+ """远程节点uuid"""
12
20
  daemonId: str = ""
21
+ """实例的uiid"""
13
22
  uuid: str = ""
23
+ """文件所在路径"""
14
24
  target: str = ""
25
+ """当前文件列表过滤条件"""
26
+ file_name: str = ""
15
27
 
16
28
  def rename(self, newName: str) -> bool:
17
29
  """
@@ -65,6 +77,34 @@ class FileItem(BaseModel):
65
77
  self.daemonId, self.uuid, os.path.join(self.target, self.name), target
66
78
  )
67
79
 
80
+ def content(self):
81
+ """
82
+ 获取文件内容。
83
+ **返回:**
84
+ - str | bytes: 文件内容。
85
+ """
86
+ from mcsmapi.apis.file import File
87
+
88
+ return File().content(
89
+ self.daemonId, self.uuid, os.path.join(self.target, self.name)
90
+ )
91
+
92
+ def zip(self, targets: list[str]) -> bool:
93
+ """
94
+ 压缩多个文件或文件夹到指定位置。
95
+
96
+ **参数:**
97
+ - targets (list): 要压缩到的目标文件的路径。
98
+
99
+ **返回:**
100
+ - bool: 压缩成功后返回True。
101
+ """
102
+ from mcsmapi.apis.file import File
103
+
104
+ return File().zip(
105
+ self.daemonId, self.uuid, os.path.join(self.target, self.name), targets
106
+ )
107
+
68
108
  def unzip(self, target: str, code: str = "utf-8") -> bool:
69
109
  """
70
110
  解压缩该 zip 文件到目标位置。
@@ -83,15 +123,51 @@ class FileItem(BaseModel):
83
123
  self.daemonId, self.uuid, os.path.join(self.target, self.name), target, code
84
124
  )
85
125
 
126
+ def update(self, text: str) -> bool:
127
+ """
128
+ 更新该文件内容。
129
+ **参数:**
130
+ - text (str): 文件内容。
131
+ **返回:**
132
+ - bool: 更新成功后返回True。
133
+ """
134
+ from mcsmapi.apis.file import File
135
+
136
+ return File().update(
137
+ self.daemonId, self.uuid, os.path.join(self.target, self.name), text
138
+ )
139
+
140
+ def download(self) -> str:
141
+ """
142
+ 下载该文件。
143
+ **返回:**
144
+ - str: 文件下载的URL。
145
+ """
146
+ from mcsmapi.apis.file import File
147
+
148
+ return File().download(
149
+ self.daemonId, self.uuid, os.path.join(self.target, self.name)
150
+ )
151
+
86
152
 
87
153
  class FileList(BaseModel):
154
+ """文件列表"""
155
+
156
+ """文件信息列表"""
88
157
  items: List[FileItem]
158
+ """当前页数"""
89
159
  page: int = 0
160
+ """文件列表单页大小"""
90
161
  pageSize: int = 100
162
+ """总页数"""
91
163
  total: int = 0
164
+ """当前路径在远程节点的绝对路径"""
92
165
  absolutePath: str = "\\"
166
+ """远程节点uuid"""
93
167
  daemonId: str = ""
168
+ """实例uuid"""
94
169
  uuid: str = ""
170
+ """文件(名称或目录)路径"""
95
171
  target: str = ""
96
172
 
97
173
  def __init__(self, **data: str):
@@ -101,8 +177,52 @@ class FileList(BaseModel):
101
177
  item.uuid = self.uuid
102
178
  item.target = self.target
103
179
 
180
+ async def upload(self, file: bytes, upload_dir: str) -> bool:
181
+ """
182
+ 上传文件到实例。
183
+
184
+ **参数:**
185
+ - file (bytes): 要上传的文件内容。
186
+ - upload_dir (str): 上传文件的目标目录(包含文件名)。
187
+
188
+ **返回:**
189
+ - bool: 返回操作结果,成功时返回True。
190
+ """
191
+ from mcsmapi.apis.file import File
192
+
193
+ return await File().upload(self.daemonId, self.uuid, file, upload_dir)
194
+
195
+ def createFile(self, target: str) -> bool:
196
+ """
197
+ 创建文件。
198
+
199
+ **参数:**
200
+ - target (str): 目标文件的路径,包含文件名。
201
+
202
+ **返回:**
203
+ - bool: 创建成功后返回True。
204
+ """
205
+ from mcsmapi.apis.file import File
206
+
207
+ return File().createFile(self.daemonId, self.uuid, target)
208
+
209
+ def createFloder(self, target: str) -> bool:
210
+ """
211
+ 创建文件夹
212
+
213
+ **参数:**
214
+ - target (str): 目标文件夹的路径。
215
+
216
+ **返回:**
217
+ - bool: 创建成功后返回True。
218
+ """
219
+ from mcsmapi.apis.file import File
220
+
221
+ return File().createFloder(self.daemonId, self.uuid, target)
104
222
 
105
223
 
106
224
  class CommonConfig(BaseModel):
225
+ """文件下载密码"""
107
226
  password: str = ""
227
+ """文件下载地址"""
108
228
  addr: str = ""
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]] = {}
@@ -5,77 +5,144 @@ from mcsmapi.models.image import DockerConfig
5
5
 
6
6
 
7
7
  class TerminalOption(BaseModel):
8
+ """终端选项"""
9
+
10
+ """是否启用颜色输出"""
8
11
  haveColor: bool = False
12
+ """是否使用伪终端 (PTY)"""
9
13
  pty: bool = True
10
14
 
11
15
 
12
16
  class EventTask(BaseModel):
17
+ """事件任务"""
18
+
19
+ """是否自动启动"""
13
20
  autoStart: bool = False
21
+ """是否自动重启"""
14
22
  autoRestart: bool = True
23
+ """是否忽略该任务"""
15
24
  ignore: bool = False
16
25
 
17
26
 
18
27
  class PingConfig(BaseModel):
28
+ """服务器 Ping 配置"""
29
+
30
+ """服务器 IP 地址"""
19
31
  ip: str = ""
32
+ """服务器端口"""
20
33
  port: int = 25565
34
+ """Ping 类型 (1: 默认类型)"""
21
35
  type: int = 1
22
36
 
23
37
 
24
38
  class InstanceConfig(BaseModel):
39
+ """实例配置信息"""
40
+
41
+ """实例名称"""
25
42
  nickname: str = "New Name"
43
+ """启动命令"""
26
44
  startCommand: str = "cmd.exe"
45
+ """停止命令"""
27
46
  stopCommand: str = "^C"
47
+ """工作目录"""
28
48
  cwd: str = ""
29
- ie: str = "gbk" # 输入编码
30
- oe: str = "gbk" # 输出编码
49
+ """输入编码"""
50
+ ie: str = "gbk"
51
+ """输出编码"""
52
+ oe: str = "gbk"
53
+ """创建时间 (Unix 时间戳)"""
31
54
  createDatetime: int = 0
55
+ """最后修改时间 (Unix 时间戳)"""
32
56
  lastDatetime: int = 0
57
+ """实例类型 (universal, minecraft 等)"""
33
58
  type: str = "universal"
59
+ """实例标签"""
34
60
  tag: List[str] = []
61
+ """实例结束时间 (可选)"""
35
62
  endTime: Optional[int] = None
63
+ """文件编码"""
36
64
  fileCode: str = "gbk"
65
+ """进程类型 (如 docker, local)"""
37
66
  processType: str = "docker"
67
+ """更新命令"""
38
68
  updateCommand: str = "shutdown -s"
69
+ """实例可执行的操作命令列表"""
39
70
  actionCommandList: List[str] = []
71
+ """换行符 (0: LF, 1: CR, 2: CRLF)"""
40
72
  crlf: int = 2
73
+ """Docker 相关配置"""
41
74
  docker: "DockerConfig" = DockerConfig()
75
+ """是否启用 RCON 远程控制"""
42
76
  enableRcon: bool = True
77
+ """RCON 连接密码"""
43
78
  rconPassword: str = ""
79
+ """RCON 端口"""
44
80
  rconPort: int = 2557
81
+ """RCON IP 地址"""
45
82
  rconIp: str = ""
83
+ """终端选项配置"""
46
84
  terminalOption: TerminalOption = TerminalOption()
85
+ """事件任务配置"""
47
86
  eventTask: EventTask = EventTask()
87
+ """服务器 Ping 监测配置"""
48
88
  pingConfig: PingConfig = PingConfig()
49
89
 
50
90
 
51
91
  class ProcessInfo(BaseModel):
92
+ """进程信息"""
93
+
94
+ """CPU 使用率 (单位: %)"""
52
95
  cpu: int = 0
96
+ """进程占用内存 (单位: KB)"""
53
97
  memory: int = 0
98
+ """父进程 ID"""
54
99
  ppid: int = 0
100
+ """进程 ID"""
55
101
  pid: int = 0
102
+ """进程创建时间 (Unix 时间戳)"""
56
103
  ctime: int = 0
104
+ """进程运行时长 (单位: 秒)"""
57
105
  elapsed: int = 0
106
+ """时间戳"""
58
107
  timestamp: int = 0
59
108
 
60
109
 
61
110
  class InstanceInfo(BaseModel):
111
+ """实例运行状态信息( 这些选项在新版中已不再支持设置,但仍在API中返回)"""
112
+
113
+ """当前玩家数量 (-1 表示未知)"""
62
114
  currentPlayers: int = -1
115
+ """文件锁状态 (0: 无锁)"""
63
116
  fileLock: int = 0
117
+ """最大允许玩家数 (-1 表示未知)"""
64
118
  maxPlayers: int = -1
119
+ """是否启用 FRP 远程服务"""
65
120
  openFrpStatus: bool = False
121
+ """玩家数量变化图表数据"""
66
122
  playersChart: List[Dict] = []
123
+ """服务器版本"""
67
124
  version: str = ""
68
125
 
69
126
 
70
127
  class InstanceDetail(BaseModel):
128
+ """实例详细信息"""
129
+
130
+ """实例的配置信息"""
71
131
  config: InstanceConfig = InstanceConfig()
132
+ """实例的运行状态信息"""
72
133
  info: InstanceInfo = InstanceInfo()
134
+ """所属的守护进程 (Daemon) ID"""
73
135
  daemonId: str = ""
136
+ """实例唯一标识符 (UUID)"""
74
137
  instanceUuid: str = ""
138
+ """实例的进程信息"""
75
139
  processInfo: ProcessInfo = ProcessInfo()
76
- space: int = 0
77
- started: int = 0 # 启动次数
78
- 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
79
146
 
80
147
  def start(self) -> str | bool:
81
148
  """
@@ -182,7 +249,7 @@ class InstanceDetail(BaseModel):
182
249
  self.daemonId, self.instanceUuid, targetUrl, title, description
183
250
  )
184
251
 
185
- def files(self, target:str = "", page:int=0, page_size:int=100) -> FileList:
252
+ def files(self, target: str = "", page: int = 0, page_size: int = 100) -> FileList:
186
253
  """
187
254
  获取实例的文件列表。
188
255
 
@@ -200,22 +267,37 @@ class InstanceDetail(BaseModel):
200
267
 
201
268
 
202
269
  class InstanceCreateResult(BaseModel):
270
+ """实例创建结果"""
271
+
272
+ """实例唯一标识符 (UUID)"""
203
273
  instanceUuid: str = ""
274
+ """实例的配置信息"""
204
275
  config: InstanceConfig = InstanceConfig()
205
276
 
206
277
 
207
278
  class InstanceSearchList(BaseModel):
279
+ """实例搜索列表"""
280
+
281
+ """每页的实例数量"""
208
282
  pageSize: int = 0
283
+ """最大页数"""
209
284
  maxPage: int = 0
285
+ """实例详细信息列表"""
210
286
  data: List[InstanceDetail] = []
287
+ """所属的守护进程 (Daemon) ID"""
211
288
  daemonId: str = ""
212
289
 
213
290
  def __init__(self, **data: str):
291
+ """实例化对象,并在每个实例中填充 daemonId"""
214
292
  super().__init__(**data)
215
293
  for instance in self.data:
216
294
  instance.daemonId = self.daemonId
217
295
 
218
296
 
219
297
  class UserInstancesList(BaseModel):
298
+ """用户实例列表"""
299
+
300
+ """实例唯一标识符 (UUID)"""
220
301
  instanceUuid: str = ""
302
+ """所属的守护进程 (Daemon) ID"""
221
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
-
mcsmapi/models/user.py CHANGED
@@ -4,18 +4,33 @@ from mcsmapi.models.instance import InstanceDetail, UserInstancesList
4
4
 
5
5
 
6
6
  class UserModel(BaseModel):
7
+ """用户信息模型"""
8
+
9
+ """用户唯一标识符 (UUID)"""
7
10
  uuid: str = ""
11
+ """用户名"""
8
12
  userName: str = ""
13
+ """用户密码 (存储加密后的字符串)"""
9
14
  passWord: str = ""
15
+ """密码类型 (0=默认类型)"""
10
16
  passWordType: int = 0
17
+ """密码盐值 (用于加密)"""
11
18
  salt: str = ""
12
- permission: int = 1 # 1=用户, 10=管理员, -1=被封禁的用户
19
+ """用户权限级别 (1=用户, 10=管理员, -1=被封禁的用户)"""
20
+ permission: int = 1
21
+ """用户注册时间 (时间字符串格式)"""
13
22
  registerTime: str = ""
23
+ """用户最后登录时间 (时间字符串格式)"""
14
24
  loginTime: str = ""
25
+ """用户 API 密钥"""
15
26
  apiKey: str = ""
27
+ """是否为初始化用户 (系统内置用户)"""
16
28
  isInit: bool = False
29
+ """用户安全密钥 (可能用于额外的身份验证)"""
17
30
  secret: str = ""
31
+ """是否启用双因素认证 (2FA)"""
18
32
  open2FA: bool = False
33
+ """用户关联的实例列表"""
19
34
  instances: List["UserInstancesList"] = []
20
35
 
21
36
  def delete(self) -> bool:
@@ -56,21 +71,40 @@ class UserModel(BaseModel):
56
71
 
57
72
 
58
73
  class SearchUserModel(BaseModel):
74
+ """用户搜索结果"""
75
+
76
+ """匹配的用户总数"""
59
77
  total: int = 0
78
+ """当前页码"""
60
79
  page: int = 0
80
+ """每页返回的用户数量"""
61
81
  page_size: int = 0
82
+ """最大可用页数"""
62
83
  max_page: int = 0
84
+ """用户信息列表"""
63
85
  data: List[UserModel] = []
64
86
 
65
87
 
66
88
  class UserConfig(BaseModel):
89
+ """用户配置信息"""
90
+
91
+ """用户唯一标识符 (UUID)"""
67
92
  uuid: str
93
+ """用户名"""
68
94
  userName: str
95
+ """最后登录时间"""
69
96
  loginTime: str
97
+ """注册时间"""
70
98
  registerTime: str
99
+ """用户拥有的实例列表"""
71
100
  instances: List[InstanceDetail]
72
- permission: int # 1=用户, 10=管理员, -1=被封禁的用户
101
+ """用户权限级别 (1=用户, 10=管理员, -1=被封禁的用户)"""
102
+ permission: int
103
+ """用户 API 密钥"""
73
104
  apiKey: str
105
+ """是否为初始化用户 (系统内置用户)"""
74
106
  isInit: bool
107
+ """用户安全密钥 (可能用于额外的身份验证)"""
75
108
  secret: str
109
+ """是否启用双因素认证 (2FA)"""
76
110
  open2FA: bool
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcsmapi
3
- Version: 0.1.5b1
3
+ Version: 0.1.5b2
4
4
  Summary: Shortcut the pypi package of MCSM./快捷操作MCSM的pypi包
5
5
  Author-email: molanp <molanpp@outlook.com>
6
6
  License-Expression: MIT
@@ -17,6 +17,7 @@ Dynamic: license-file
17
17
  ![Supported MCSManager Versions](https://img.shields.io/badge/Supported%20MCSManager%20Versions-10.x-blue)
18
18
  ![Python Version](https://img.shields.io/badge/Python%20Version-%3E%3D3.7-blue)
19
19
  ![PyPI Downloads](https://img.shields.io/pypi/dm/mcsmapi)
20
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/molanp/mcsmapi)
20
21
 
21
22
  English|[Chinese Simplified](README_zh-cn.md)
22
23
 
@@ -41,6 +42,9 @@ You can install `mcsmapi` using `pip`:
41
42
  pip install mcsmapi
42
43
  ```
43
44
 
45
+ If you need the latest build files (untested), please visit
46
+ [Actions](https://github.com/molanp/mcsmapi/actions)
47
+
44
48
  ## Supported Features
45
49
 
46
50
  - [x] Dashboard data (`Overview`)
@@ -0,0 +1,23 @@
1
+ mcsmapi/__init__.py,sha256=Xm0gsQMecMZwD1of9UGOkTan25l_jqrWkG-7mg0YgF4,1514
2
+ mcsmapi/exceptions.py,sha256=mHsAHyoX9SiFDGBMEhesA_ao9hhZZ38EGTp97K7VDp8,184
3
+ mcsmapi/pool.py,sha256=CoOYbyECp4FoXkzwFN7WgtS3vgZtvWO8e93i18vhOEI,308
4
+ mcsmapi/request.py,sha256=5mCzKgrh4OPFKvBo22kIDpX_D1zqCza1nglYUeGWveg,2618
5
+ mcsmapi/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mcsmapi/apis/daemon.py,sha256=2Se5ViwaePg6_CGI9qKeI823FMF0qzlemn2yCt92SPs,4488
7
+ mcsmapi/apis/file.py,sha256=Qh3kOtU2mj9PS2nN4s6WufZ149pM0sbkM37aG-LlY5A,10778
8
+ mcsmapi/apis/image.py,sha256=UwVH2LPfPBEADZuoSyyiMrlEc9LL858Z3oidRPaKrvs,2908
9
+ mcsmapi/apis/instance.py,sha256=zibACXlhsMAWW5QjvGCFO5iN0wNEVlnecdnFvLeQTUg,10986
10
+ mcsmapi/apis/overview.py,sha256=4bS3RGSykdQ1JyBTM-I9na6v0SCijEG1CN-WxqabfUo,625
11
+ mcsmapi/apis/user.py,sha256=CBLNWxxNfvnmzoMa1YV3Q33POitYDGyN-hRORoe2JEc,2968
12
+ mcsmapi/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ mcsmapi/models/daemon.py,sha256=EV0nlUe6pUETbLIoUGn2HPWoNYClIyS2ABrRA70IjQk,5079
14
+ mcsmapi/models/file.py,sha256=m75zhMkBA7KQm-870Ph3DfE9unSlOLWgMmwdl8H-vSc,6097
15
+ mcsmapi/models/image.py,sha256=pjwSJ79rYMuDTLlazevpjqdnnc0Mqvea9bp-BepUhio,5484
16
+ mcsmapi/models/instance.py,sha256=oNXw0q3FDTu2bG_crWPgUtLXxM2yL7eRwo9H2RFzmDA,8850
17
+ mcsmapi/models/overview.py,sha256=yRERCPRA3vBceKjISBClngvmKaQlo0HowC859nm15Nc,2859
18
+ mcsmapi/models/user.py,sha256=sduOS8MWoxUfvTseK7nShuBOYzei3dEM8eP45PuIZ3g,3130
19
+ mcsmapi-0.1.5b2.dist-info/licenses/LICENSE,sha256=bMKDPsvaybvY-4TTlSZtCXPPtxb7KPpDVqXgDA8Ogo0,1068
20
+ mcsmapi-0.1.5b2.dist-info/METADATA,sha256=IFV6TW-2aLuZydebLlPN1mSRbzsFCtRpRAbWa7kaDlc,2805
21
+ mcsmapi-0.1.5b2.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
22
+ mcsmapi-0.1.5b2.dist-info/top_level.txt,sha256=8MUYHd1Or4cbSCd93IaqLA72w0weEuKieopVwIfVlWo,8
23
+ mcsmapi-0.1.5b2.dist-info/RECORD,,
@@ -1,23 +0,0 @@
1
- mcsmapi/__init__.py,sha256=Xm0gsQMecMZwD1of9UGOkTan25l_jqrWkG-7mg0YgF4,1514
2
- mcsmapi/exceptions.py,sha256=mHsAHyoX9SiFDGBMEhesA_ao9hhZZ38EGTp97K7VDp8,184
3
- mcsmapi/pool.py,sha256=CoOYbyECp4FoXkzwFN7WgtS3vgZtvWO8e93i18vhOEI,308
4
- mcsmapi/request.py,sha256=5mCzKgrh4OPFKvBo22kIDpX_D1zqCza1nglYUeGWveg,2618
5
- mcsmapi/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- mcsmapi/apis/daemon.py,sha256=j-MJc484J85Eopm7xUBW37-hJxE2Widl86XsHnCVj80,1978
7
- mcsmapi/apis/file.py,sha256=LfWcVhU42xkdKfw2penZZwmgr2jPs7oKizdWuInc9a8,10610
8
- mcsmapi/apis/image.py,sha256=UwVH2LPfPBEADZuoSyyiMrlEc9LL858Z3oidRPaKrvs,2908
9
- mcsmapi/apis/instance.py,sha256=zibACXlhsMAWW5QjvGCFO5iN0wNEVlnecdnFvLeQTUg,10986
10
- mcsmapi/apis/overview.py,sha256=4bS3RGSykdQ1JyBTM-I9na6v0SCijEG1CN-WxqabfUo,625
11
- mcsmapi/apis/user.py,sha256=CBLNWxxNfvnmzoMa1YV3Q33POitYDGyN-hRORoe2JEc,2968
12
- mcsmapi/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- mcsmapi/models/daemon.py,sha256=Jt4xN86U2SWTsshWPh2xVzwnEeEQ5QJ_RlIjwxyP8xk,3557
14
- mcsmapi/models/file.py,sha256=WpFSq6FiaracGZfhwMmWnYsCtY70c7TkpUdpW4hPmjY,2790
15
- mcsmapi/models/image.py,sha256=jbi4cZCYtfaG-ca7aeI5DOmXXxWTZYCYDqdkzjtuHhc,2804
16
- mcsmapi/models/instance.py,sha256=TeGNvZA_hBn0qbuV5xoBrnNpfwPcTjIS6b6xthvfBFc,6340
17
- mcsmapi/models/overview.py,sha256=TUvAqr_6h7O2ZC-CWngh8xz4zz6a4av66wgNRUN3NLg,1321
18
- mcsmapi/models/user.py,sha256=dw6INDrPcjT6b3PzBAgHQaVE8G6IZMKm94y6VhlSMIo,1958
19
- mcsmapi-0.1.5b1.dist-info/licenses/LICENSE,sha256=bMKDPsvaybvY-4TTlSZtCXPPtxb7KPpDVqXgDA8Ogo0,1068
20
- mcsmapi-0.1.5b1.dist-info/METADATA,sha256=hy0ptYUXph8SGp9CFR8gn9qxbcK23WWHgXfH5eWMmoY,2604
21
- mcsmapi-0.1.5b1.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
22
- mcsmapi-0.1.5b1.dist-info/top_level.txt,sha256=8MUYHd1Or4cbSCd93IaqLA72w0weEuKieopVwIfVlWo,8
23
- mcsmapi-0.1.5b1.dist-info/RECORD,,