@fnnas-labs/fnos-cli 0.0.0-stage → 0.2.0
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.
- package/LICENSE +21 -0
- package/README.md +169 -2
- package/THIRD_PARTY_NOTICES.txt +38904 -0
- package/cordis.patch.yml +3 -0
- package/npm/README.dsh.md +49 -0
- package/npm/acceptance-report.cjs +53 -0
- package/npm/dsh-integration.mjs +159 -0
- package/npm/dsh-test-support.mjs +55 -0
- package/npm/dsh.mjs +31 -0
- package/npm/install.cjs +130 -0
- package/npm/package-lib.cjs +274 -0
- package/npm/run.cjs +39 -0
- package/package.json +46 -4
- package/skill/LICENSE +21 -0
- package/skill/SKILL.md +143 -0
- package/skill/THIRD_PARTY_NOTICES.txt +38904 -0
- package/skill/bin/trim-cli-darwin-arm64 +0 -0
- package/skill/bin/trim-cli-darwin-x64 +0 -0
- package/skill/bin/trim-cli-linux-arm64 +0 -0
- package/skill/bin/trim-cli-linux-x64 +0 -0
- package/skill/bin/trim-cli-windows-arm64.exe +0 -0
- package/skill/bin/trim-cli-windows-x64.exe +0 -0
- package/skill/build-provenance.json +44 -0
- package/skill/entries/trim-app.md +63 -0
- package/skill/entries/trim-baidu-netdisk.md +42 -0
- package/skill/entries/trim-docker.md +35 -0
- package/skill/entries/trim-download.md +38 -0
- package/skill/entries/trim-file.md +30 -0
- package/skill/entries/trim-log.md +32 -0
- package/skill/entries/trim-monitor.md +41 -0
- package/skill/entries/trim-network.md +22 -0
- package/skill/entries/trim-photos.md +32 -0
- package/skill/entries/trim-shared.md +54 -0
- package/skill/entries/trim-storage.md +34 -0
- package/skill/entries/trim-system.md +59 -0
- package/skill/entries/trim-user.md +28 -0
- package/skill/manifest.json +43 -0
- package/skill/reference/_conventions.md +76 -0
- package/skill/reference/_index.md +78 -0
- package/skill/reference/app-center.md +234 -0
- package/skill/reference/baidu-netdisk.md +221 -0
- package/skill/reference/dockermgr.md +244 -0
- package/skill/reference/download.md +357 -0
- package/skill/reference/file.md +752 -0
- package/skill/reference/log.md +224 -0
- package/skill/reference/network.md +41 -0
- package/skill/reference/oauth.md +51 -0
- package/skill/reference/photos.md +158 -0
- package/skill/reference/power.md +34 -0
- package/skill/reference/resmon.md +160 -0
- package/skill/reference/stor.md +525 -0
- package/skill/reference/sysinfo.md +133 -0
- package/skill/reference/user.md +139 -0
- package/skill/reference/workflows/device-validation.md +66 -0
- package/skill/reference/workflows/file-routing.md +44 -0
- package/skill/reference/workflows/file-upload-validation.md +63 -0
- package/skill/reference/workflows/photos-routing.md +83 -0
- package/skill/reference/workflows/storage-dangerous-ops.md +53 -0
- package/skill/scripts/fnos-cli +63 -0
- package/skill/scripts/fnos-cli.cmd +36 -0
- package/skill/scripts/fnos-cli.ps1 +31 -0
- package/skill/scripts/trim-cli +63 -0
- package/skill/scripts/trim-cli.cmd +36 -0
- package/skill/scripts/trim-cli.ps1 +31 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
# stor 模块
|
|
2
|
+
|
|
3
|
+
## 模块概述
|
|
4
|
+
存储管理模块,涵盖存储池、磁盘、SMART 操作、挂载/弹出流程、容量/空间报告和用户存储分配。
|
|
5
|
+
|
|
6
|
+
## 模块约定
|
|
7
|
+
- 区分可能唤醒磁盘的操作和不唤醒磁盘的操作。
|
|
8
|
+
- 破坏性操作和预检端点在错误说明和协议说明中明确标注。
|
|
9
|
+
- 存储池目标请求使用 `uuid`,不再使用旧版 `name`。
|
|
10
|
+
|
|
11
|
+
## 高风险密码验证策略
|
|
12
|
+
fnos-cli 使用 `appcgi.usersrv.authUser` 作为高风险存储写操作的预检密码验证。
|
|
13
|
+
|
|
14
|
+
| 策略 | 命令 |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| 验证 + 转发密码 | `storage umount`、`storage create`、`storage stop`、`storage add-disk`、`storage remove-disk`、`storage replace-disk`、`storage resize` |
|
|
17
|
+
| 仅验证,不转发密码 | `storage extend`、`storage format`、`storage eject` |
|
|
18
|
+
| 仅确认,无密码验证 | `storage mount`、`storage disk-mount`、`storage disk-umount` |
|
|
19
|
+
| 通用请求 | `storage request` 默认确认;传 `--password` 时先验证再转发 |
|
|
20
|
+
|
|
21
|
+
## 任务路由
|
|
22
|
+
|
|
23
|
+
先按“读”还是“改”区分:
|
|
24
|
+
|
|
25
|
+
| 用户意图 | 优先命令 | 说明 |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| 看存储总览 | `fnos-cli storage overview` | 适合作为只读探测入口 |
|
|
28
|
+
| 列存储池 | `fnos-cli storage pools` | 用来确认 pool uuid 或 `trim_*` 标识 |
|
|
29
|
+
| 列磁盘 | `fnos-cli storage disks` | 用来确认纯设备名 |
|
|
30
|
+
| 看 SMART / 健康 | `fnos-cli storage smart <disk>` / `health <disk>` | 先确认目标是磁盘,不是存储池 |
|
|
31
|
+
| 看可移动设备 | `fnos-cli storage removable` / `disk-info <disk>` | `format` / `eject` / `disk-mount` / `disk-umount` 前优先看 |
|
|
32
|
+
| 做高风险写操作 | 先看 `workflows/storage-dangerous-ops.md` | 先做只读探测,再决定是否继续 |
|
|
33
|
+
| 调用未封装端点 | `fnos-cli storage request stor.<name> --json '<object>'` | 优先用固定命令;仅对缺失的 `stor.*` 端点使用 |
|
|
34
|
+
|
|
35
|
+
## 常见误判
|
|
36
|
+
|
|
37
|
+
- `mount` 不是 `stop` 的逆操作;先确认目标池当前状态
|
|
38
|
+
- `extend` 和 `resize` 不是同义词
|
|
39
|
+
- `format` / `eject` 面向可移动设备,不是普通池管理命令
|
|
40
|
+
- 池操作使用 uuid 或 `trim_*`,磁盘操作使用纯设备名
|
|
41
|
+
- `storage create` / `resize` 的 `--level` 只能用 `0`、`1`、`4`、`5`、`6`、`10`
|
|
42
|
+
|
|
43
|
+
## 高风险提醒
|
|
44
|
+
|
|
45
|
+
- 任何写操作前都应先执行 `storage pools` 和 `storage disks`
|
|
46
|
+
- 创建存储池前应额外执行 `storage free-disks`,以确认可创建候选项;系统盘剩余空间候选要用返回的 `part` 创建,不要用整盘 `name`
|
|
47
|
+
- 需要密码验证的命令在缺密码时不要继续猜测
|
|
48
|
+
- 只读探测结果与用户描述不一致时,应先停下来确认目标
|
|
49
|
+
- `format`、`stop`、`remove-disk`、`replace-disk` 这类操作影响面较大,不应跨多个目标一次性执行
|
|
50
|
+
- `storage request` 是受控 fallback,不应用来绕过固定命令的校验和工作流
|
|
51
|
+
|
|
52
|
+
## 端点索引
|
|
53
|
+
- 池和磁盘发现(已实现):
|
|
54
|
+
- `stor.listStor` — 列出存储池
|
|
55
|
+
- `stor.listDisk` — 列出磁盘
|
|
56
|
+
- `stor.listFreeDisk` — 列出可创建存储池的候选磁盘/分区
|
|
57
|
+
- `stor.general` — 存储总览
|
|
58
|
+
- `stor.calcSpace` — 聚合空间
|
|
59
|
+
- `stor.listRemovable` — 可移动设备
|
|
60
|
+
- `stor.diskInfo` — 指定磁盘详情
|
|
61
|
+
- 池生命周期(已实现):
|
|
62
|
+
- `stor.create` — 创建存储池
|
|
63
|
+
- `stor.mount` — 挂载存储池
|
|
64
|
+
- `stor.umount` — 卸载存储池
|
|
65
|
+
- `stor.stop` — 停止/删除存储池
|
|
66
|
+
- 扩展和磁盘管理(已实现):
|
|
67
|
+
- `stor.addDisk` — 添加磁盘
|
|
68
|
+
- `stor.removeDisk` — 移除磁盘
|
|
69
|
+
- `stor.replaceDisk` — 替换磁盘
|
|
70
|
+
- `stor.extend` — 扩展存储池
|
|
71
|
+
- `stor.resize` — 调整存储池
|
|
72
|
+
- SMART 和健康(已实现):
|
|
73
|
+
- `stor.diskHealth` — 磁盘健康
|
|
74
|
+
- `stor.diskSmart` — SMART 信息
|
|
75
|
+
- 可移动设备(已实现):
|
|
76
|
+
- `stor.diskMount` — 挂载可移动磁盘
|
|
77
|
+
- `stor.diskUmount` — 卸载可移动磁盘
|
|
78
|
+
- `stor.format` — 格式化
|
|
79
|
+
- `stor.eject` — 弹出
|
|
80
|
+
- 通用请求(已实现):
|
|
81
|
+
- `stor.*` — 通过 `storage request` 调用尚未封装为固定命令的存储端点
|
|
82
|
+
- 未实现:
|
|
83
|
+
- `stor.state` / `stor.state2`、`stor.getSysPartInfo`
|
|
84
|
+
- `stor.delRec`、`stor.lvActive`
|
|
85
|
+
- `stor.readdDisk`、`stor.removeDiskCheck`、`stor.addSpareDisk`
|
|
86
|
+
- `stor.enableSmart`、`stor.runSmartTest`、`stor.abortSmartTest`
|
|
87
|
+
- 固定配置命令:`stor.getConf`、`stor.setConf`、`stor.removeWarn`、`stor.setTrashbin` 等
|
|
88
|
+
- 用户存储:`stor.getUserStorage`、`stor.setUserStorage`
|
|
89
|
+
|
|
90
|
+
## 端点详情
|
|
91
|
+
|
|
92
|
+
### stor.general
|
|
93
|
+
|
|
94
|
+
#### Endpoint
|
|
95
|
+
`stor.general`
|
|
96
|
+
|
|
97
|
+
#### Purpose
|
|
98
|
+
获取存储总览信息。
|
|
99
|
+
|
|
100
|
+
#### Trim CLI Mapping
|
|
101
|
+
```
|
|
102
|
+
fnos-cli storage overview
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### Protocol Notes
|
|
106
|
+
- 旧版端点名 `stor.getStorGeneral` 已弃用。
|
|
107
|
+
|
|
108
|
+
### stor.listStor
|
|
109
|
+
|
|
110
|
+
#### Endpoint
|
|
111
|
+
`stor.listStor`
|
|
112
|
+
|
|
113
|
+
#### Purpose
|
|
114
|
+
列出存储池及相关磁盘元数据。
|
|
115
|
+
|
|
116
|
+
#### Trim CLI Mapping
|
|
117
|
+
```
|
|
118
|
+
fnos-cli storage pools
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### Protocol Notes
|
|
122
|
+
- 可能是多阶段响应:先返回基础池列表,后续跟进已移除磁盘/热备/缓存详情。
|
|
123
|
+
- 在线管理员可能收到 `{"sysNotify":"storageChanged"}` 通知,此时应刷新输出。
|
|
124
|
+
|
|
125
|
+
#### Field Semantics
|
|
126
|
+
- `degraded`、`fixNeedDisks` 已在部分固件的存储池响应中出现,但字段精确语义和跨固件一致性尚未确认,不能仅凭非零值断言磁盘故障、必须修复或数据风险等级。
|
|
127
|
+
- SMART、`md[].arrayState`、`md[].syncAction` 可作为相邻证据,但现有资料不足以确定它们与上述字段的组合关系;应保留原始值并在 fnOS 存储页核对。
|
|
128
|
+
- CLI 只透传这些字段,不会自动解释或执行修复。
|
|
129
|
+
|
|
130
|
+
### stor.listDisk
|
|
131
|
+
|
|
132
|
+
#### Endpoint
|
|
133
|
+
`stor.listDisk`
|
|
134
|
+
|
|
135
|
+
#### Purpose
|
|
136
|
+
列出存储服务已知的磁盘。
|
|
137
|
+
|
|
138
|
+
#### Trim CLI Mapping
|
|
139
|
+
```
|
|
140
|
+
fnos-cli storage disks
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### Protocol Notes
|
|
144
|
+
- 该端点可能先返回磁盘数据帧,再返回成功终态;CLI 会收集所有帧中的 `disk` 数组,并按 `name` 合并重复磁盘。
|
|
145
|
+
- 如果所有帧均不含磁盘数据,输出包含空的 `disk` 数组。
|
|
146
|
+
|
|
147
|
+
#### Field Semantics
|
|
148
|
+
- 返回的磁盘标识是 `stor.diskHealth`、`stor.diskSmart`、`stor.format` 和 `stor.eject` 使用的 canonical 磁盘名。
|
|
149
|
+
|
|
150
|
+
### stor.diskInfo
|
|
151
|
+
|
|
152
|
+
#### Endpoint
|
|
153
|
+
`stor.diskInfo`
|
|
154
|
+
|
|
155
|
+
#### Purpose
|
|
156
|
+
查询指定磁盘的详细信息,常用于可移动磁盘分区、容量和文件系统确认。
|
|
157
|
+
|
|
158
|
+
#### Trim CLI Mapping
|
|
159
|
+
```
|
|
160
|
+
fnos-cli storage disk-info <disk>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### Request
|
|
164
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
165
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
166
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.diskInfo` | `stor.diskInfo` |
|
|
167
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
168
|
+
| `disk` | body | yes | string | 磁盘设备名 | 纯设备名如 `sdc`、`nvme0n1` | `sdc` |
|
|
169
|
+
|
|
170
|
+
### stor.diskMount / stor.diskUmount
|
|
171
|
+
|
|
172
|
+
#### Endpoint
|
|
173
|
+
`stor.diskMount` 和 `stor.diskUmount`
|
|
174
|
+
|
|
175
|
+
#### Purpose
|
|
176
|
+
挂载或卸载指定可移动磁盘。
|
|
177
|
+
|
|
178
|
+
#### Trim CLI Mapping
|
|
179
|
+
```
|
|
180
|
+
fnos-cli storage disk-mount <disk> [--yes]
|
|
181
|
+
fnos-cli storage disk-umount <disk> [--yes]
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Request
|
|
185
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
186
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
187
|
+
| `req` | body | yes | string | Endpoint selector | `stor.diskMount` 或 `stor.diskUmount` | `stor.diskMount` |
|
|
188
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
189
|
+
| `disk` | body | yes | string | 可移动磁盘设备名 | 应来自 `storage removable` / `storage disk-info` 确认 | `sdc` |
|
|
190
|
+
|
|
191
|
+
#### Protocol Notes
|
|
192
|
+
- 默认需要交互确认;`--yes` 可跳过确认。
|
|
193
|
+
- 不做密码验证。
|
|
194
|
+
|
|
195
|
+
### stor.listFreeDisk
|
|
196
|
+
|
|
197
|
+
#### Endpoint
|
|
198
|
+
`stor.listFreeDisk`
|
|
199
|
+
|
|
200
|
+
#### Purpose
|
|
201
|
+
列出可用于创建存储池的候选磁盘或分区。
|
|
202
|
+
|
|
203
|
+
#### Trim CLI Mapping
|
|
204
|
+
```
|
|
205
|
+
fnos-cli storage free-disks
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
#### Protocol Notes
|
|
209
|
+
- 这个端点用于创建前候选判断,和 `storage disks` 的通用磁盘清单语义不同。
|
|
210
|
+
- 普通数据盘候选通常直接用 `name` 创建。
|
|
211
|
+
- 系统盘剩余空间可用时,返回项通常带 `sys: 1`、`part`、`partSize`;创建时 `--disks` 应传 `part`,容量按 `partSize` 判断。
|
|
212
|
+
|
|
213
|
+
#### Field Semantics
|
|
214
|
+
- 返回顶层通常包含 `disk` 数组。
|
|
215
|
+
- `name` 是整盘设备名。
|
|
216
|
+
- `part` 是可用于创建存储池的分区名,仅在系统盘剩余空间等场景出现。
|
|
217
|
+
- `partSize` 是可创建分区容量。
|
|
218
|
+
|
|
219
|
+
### stor.calcSpace
|
|
220
|
+
|
|
221
|
+
#### Endpoint
|
|
222
|
+
`stor.calcSpace`
|
|
223
|
+
|
|
224
|
+
#### Purpose
|
|
225
|
+
报告聚合的系统分区和存储分区空间使用情况。
|
|
226
|
+
|
|
227
|
+
#### Trim CLI Mapping
|
|
228
|
+
```
|
|
229
|
+
fnos-cli storage space
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### stor.listRemovable
|
|
233
|
+
|
|
234
|
+
#### Endpoint
|
|
235
|
+
`stor.listRemovable`
|
|
236
|
+
|
|
237
|
+
#### Purpose
|
|
238
|
+
列出已挂载的可移动存储设备。
|
|
239
|
+
|
|
240
|
+
#### Trim CLI Mapping
|
|
241
|
+
```
|
|
242
|
+
fnos-cli storage removable
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### stor.diskHealth / stor.diskSmart
|
|
246
|
+
|
|
247
|
+
#### Endpoint
|
|
248
|
+
`stor.diskHealth` 和 `stor.diskSmart`
|
|
249
|
+
|
|
250
|
+
#### Purpose
|
|
251
|
+
查询指定磁盘的健康指标和 SMART 详情。
|
|
252
|
+
|
|
253
|
+
#### Trim CLI Mapping
|
|
254
|
+
```
|
|
255
|
+
fnos-cli storage health <disk>
|
|
256
|
+
fnos-cli storage smart <disk>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
#### Request
|
|
260
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
261
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
262
|
+
| `req` | body | yes | string | Endpoint selector | `stor.diskHealth` 或 `stor.diskSmart` | `stor.diskHealth` |
|
|
263
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
264
|
+
| `disks` | body | yes | string[] | `stor.diskHealth` 的磁盘设备名列表 | CLI 单盘命令会发送为单元素数组 | `["nvme0n1"]` |
|
|
265
|
+
| `disk` | body | yes | string | `stor.diskSmart` 的磁盘设备名 | CLI 发送纯设备名 | `nvme0n1` |
|
|
266
|
+
| `wakeup` | body | no | boolean | 查询前唤醒磁盘 | `diskHealth` 发送 `true`;`diskSmart` 使用设备默认值 | `true` |
|
|
267
|
+
|
|
268
|
+
#### Protocol Notes
|
|
269
|
+
- `stor.diskSmart` 在磁盘休眠时可能返回 `diskStandby` 标记而非完整 SMART 数据。
|
|
270
|
+
- `listDisk` 会聚合终态前的数据帧;列表确实为空时输出 `disk: []`。`listFreeDisk` 成功但无候选项时补 `disk: []`,`listRemovable` 成功但无设备时补 `removable: []`。
|
|
271
|
+
- `diskHealth` 使用 `disks` 数组;`diskSmart` 仍使用单数 `disk`。
|
|
272
|
+
|
|
273
|
+
### stor.create
|
|
274
|
+
|
|
275
|
+
#### Endpoint
|
|
276
|
+
`stor.create`
|
|
277
|
+
|
|
278
|
+
#### Purpose
|
|
279
|
+
从指定 RAID/存储级别和磁盘集创建新存储池。
|
|
280
|
+
|
|
281
|
+
#### Trim CLI Mapping
|
|
282
|
+
```
|
|
283
|
+
fnos-cli storage create --level <level> --disks <disk> [--disks <disk>...] [--comment <comment>] [--fstype <fstype>] [--check-disk] [--password <password>] [--yes]
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
#### Request
|
|
287
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
288
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
289
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.create` | `stor.create` |
|
|
290
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
291
|
+
| `level` | body | yes | number | RAID/存储级别 | 允许 `0`、`1`、`4`、`5`、`6`、`10`;`0` 是 RAID 0,至少需要 2 块盘 | `1` |
|
|
292
|
+
| `disks` | body | yes | string[] | 磁盘设备名列表 | 支持重复 `--disks` 或逗号分隔,去重,并按 level 校验数量 | `["sdb","sdc"]` |
|
|
293
|
+
| `comment` | body | no | string | 池注释 | 可选 | `pool-a` |
|
|
294
|
+
| `fstype` | body | no | string | 文件系统类型 | 小写标识如 `ext4` | `ext4` |
|
|
295
|
+
| `checkDisk` | body | no | boolean | 磁盘预检 | `--check-disk` 时发送 | `true` |
|
|
296
|
+
| `password` | body | no | string | 密码 | 预检验证后转发 | |
|
|
297
|
+
|
|
298
|
+
#### Field Semantics
|
|
299
|
+
- `level` 为数值型,与后端请求契约保持一致。
|
|
300
|
+
- `disks` 必须是纯设备名,不接受 `/dev/sdb` 形式。
|
|
301
|
+
- 创建前会先做本地磁盘数量校验:`0` 至少 2 块,`5` 至少 3 块,`6` 和 `10` 至少 4 块,`10` 还要求偶数块。
|
|
302
|
+
|
|
303
|
+
### stor.mount / stor.umount
|
|
304
|
+
|
|
305
|
+
#### Endpoint
|
|
306
|
+
`stor.mount` 和 `stor.umount`
|
|
307
|
+
|
|
308
|
+
#### Purpose
|
|
309
|
+
挂载或卸载存储池。
|
|
310
|
+
|
|
311
|
+
#### Trim CLI Mapping
|
|
312
|
+
```
|
|
313
|
+
fnos-cli storage mount <uuid> [-y]
|
|
314
|
+
fnos-cli storage umount <uuid> [--password <password>] [-y]
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
#### Request
|
|
318
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
319
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
320
|
+
| `req` | body | yes | string | Endpoint selector | `stor.mount` 或 `stor.umount` | `stor.mount` |
|
|
321
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
322
|
+
| `uuid` | body | yes | string | 存储池 uuid | 不使用旧版 `name` | `trim_pool` |
|
|
323
|
+
| `password` | body | conditional | string | 密码 | 仅 `umount` 时需要 | |
|
|
324
|
+
|
|
325
|
+
#### Protocol Notes
|
|
326
|
+
- `storage mount` 仅确认,不做密码验证。
|
|
327
|
+
- `storage umount` 先验密后转发密码。
|
|
328
|
+
- `stor.mount` 不是 `stor.stop` 的通用撤销操作。
|
|
329
|
+
|
|
330
|
+
### stor.stop
|
|
331
|
+
|
|
332
|
+
#### Endpoint
|
|
333
|
+
`stor.stop`
|
|
334
|
+
|
|
335
|
+
#### Purpose
|
|
336
|
+
停止并删除存储池。
|
|
337
|
+
|
|
338
|
+
#### Trim CLI Mapping
|
|
339
|
+
```
|
|
340
|
+
fnos-cli storage stop <uuid> [--password <password>] [-y]
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
#### Request
|
|
344
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
345
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
346
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.stop` | `stor.stop` |
|
|
347
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
348
|
+
| `uuid` | body | yes | string | 存储池 uuid | | `trim_pool` |
|
|
349
|
+
| `password` | body | no | string | 密码 | 预检验证后转发 | |
|
|
350
|
+
|
|
351
|
+
#### Field Semantics
|
|
352
|
+
- `stor.stop` 是主要的"删除存储空间"操作,适用于普通池、非活跃池和缓存损坏池。
|
|
353
|
+
|
|
354
|
+
### stor.addDisk
|
|
355
|
+
|
|
356
|
+
#### Endpoint
|
|
357
|
+
`stor.addDisk`
|
|
358
|
+
|
|
359
|
+
#### Purpose
|
|
360
|
+
向存储池添加磁盘。
|
|
361
|
+
|
|
362
|
+
#### Trim CLI Mapping
|
|
363
|
+
```
|
|
364
|
+
fnos-cli storage add-disk <uuid> --disks <disk> [--disks <disk>...] [--password <password>] [-y]
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
#### Request
|
|
368
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
369
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
370
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.addDisk` | `stor.addDisk` |
|
|
371
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
372
|
+
| `uuid` | body | yes | string | 存储池 uuid | | `trim_pool` |
|
|
373
|
+
| `disks` | body | yes | string[] | 要添加的磁盘 | 支持重复或逗号分隔 | `["sdd"]` |
|
|
374
|
+
| `password` | body | no | string | 密码 | 预检验证后转发 | |
|
|
375
|
+
|
|
376
|
+
### stor.removeDisk
|
|
377
|
+
|
|
378
|
+
#### Endpoint
|
|
379
|
+
`stor.removeDisk`
|
|
380
|
+
|
|
381
|
+
#### Purpose
|
|
382
|
+
从存储池移除磁盘。
|
|
383
|
+
|
|
384
|
+
#### Trim CLI Mapping
|
|
385
|
+
```
|
|
386
|
+
fnos-cli storage remove-disk <uuid> --disks <disk> [--password <password>] [-y]
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### stor.replaceDisk
|
|
390
|
+
|
|
391
|
+
#### Endpoint
|
|
392
|
+
`stor.replaceDisk`
|
|
393
|
+
|
|
394
|
+
#### Purpose
|
|
395
|
+
替换存储池中的磁盘。
|
|
396
|
+
|
|
397
|
+
#### Trim CLI Mapping
|
|
398
|
+
```
|
|
399
|
+
fnos-cli storage replace-disk <uuid> --disks <disk> --new-disks <disk> [--password <password>] [-y]
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
#### Request
|
|
403
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
404
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
405
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.replaceDisk` | `stor.replaceDisk` |
|
|
406
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
407
|
+
| `uuid` | body | yes | string | 存储池 uuid | | `trim_pool` |
|
|
408
|
+
| `disks` | body | yes | string[] | 要替换的旧磁盘 | | `["sdb"]` |
|
|
409
|
+
| `newDisks` | body | yes | string[] | 替换用的新磁盘 | 必须与 `disks` 等长 | `["sdg"]` |
|
|
410
|
+
| `password` | body | yes | string | 密码 | 预检验证后转发 | |
|
|
411
|
+
|
|
412
|
+
#### Field Semantics
|
|
413
|
+
- `disks[i]` 和 `newDisks[i]` 形成替换对。
|
|
414
|
+
|
|
415
|
+
### stor.extend
|
|
416
|
+
|
|
417
|
+
#### Endpoint
|
|
418
|
+
`stor.extend`
|
|
419
|
+
|
|
420
|
+
#### Purpose
|
|
421
|
+
触发存储池扩展流程。
|
|
422
|
+
|
|
423
|
+
#### Trim CLI Mapping
|
|
424
|
+
```
|
|
425
|
+
fnos-cli storage extend <uuid> [--password <password>] [-y]
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
#### Protocol Notes
|
|
429
|
+
- 仅验密,不转发密码;目标请求只包含 `uuid`。
|
|
430
|
+
|
|
431
|
+
### stor.resize
|
|
432
|
+
|
|
433
|
+
#### Endpoint
|
|
434
|
+
`stor.resize`
|
|
435
|
+
|
|
436
|
+
#### Purpose
|
|
437
|
+
调整存储池大小或重塑存储池布局。
|
|
438
|
+
|
|
439
|
+
#### Trim CLI Mapping
|
|
440
|
+
```
|
|
441
|
+
fnos-cli storage resize <uuid> --disks <disk> [--vd-name <name>] [--level <level>] [--password <password>] [-y]
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
#### Request
|
|
445
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
446
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
447
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.resize` | `stor.resize` |
|
|
448
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
449
|
+
| `uuid` | body | yes | string | 存储池 uuid | | `trim_pool` |
|
|
450
|
+
| `disks` | body | yes | string[] | 参与调整的磁盘 | | `["sdh"]` |
|
|
451
|
+
| `vdName` | body | no | string | 目标虚拟设备名 | 可选 | `raidz1-0` |
|
|
452
|
+
| `level` | body | no | number | 目标 RAID 级别 | 允许 `0`、`1`、`4`、`5`、`6`、`10` | `5` |
|
|
453
|
+
| `password` | body | no | string | 密码 | 预检验证后转发 | |
|
|
454
|
+
|
|
455
|
+
### stor.format
|
|
456
|
+
|
|
457
|
+
#### Endpoint
|
|
458
|
+
`stor.format`
|
|
459
|
+
|
|
460
|
+
#### Purpose
|
|
461
|
+
格式化可移动磁盘或分区。
|
|
462
|
+
|
|
463
|
+
#### Trim CLI Mapping
|
|
464
|
+
```
|
|
465
|
+
fnos-cli storage format <disk> --fstype <fstype> [--partition <no>] [--password <password>] [-y]
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
#### Request
|
|
469
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
470
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
471
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.format` | `stor.format` |
|
|
472
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
473
|
+
| `disk` | body | yes | string | 磁盘设备名 | 纯设备名 | `sdb` |
|
|
474
|
+
| `no` | body | yes | number | 分区号 | `0` 表示整盘 | `0` |
|
|
475
|
+
| `fstype` | body | yes | string | 文件系统类型 | 小写 | `ext4` |
|
|
476
|
+
|
|
477
|
+
### stor.eject
|
|
478
|
+
|
|
479
|
+
#### Endpoint
|
|
480
|
+
`stor.eject`
|
|
481
|
+
|
|
482
|
+
#### Purpose
|
|
483
|
+
安全弹出可移动磁盘。
|
|
484
|
+
|
|
485
|
+
#### Trim CLI Mapping
|
|
486
|
+
```
|
|
487
|
+
fnos-cli storage eject <disk> [--password <password>] [-y]
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
#### Request
|
|
491
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
492
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
493
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `stor.eject` | `stor.eject` |
|
|
494
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
495
|
+
| `disk` | body | yes | string | 可移动磁盘设备名 | 应来自 `stor.listRemovable` 返回的标识 | `sdc` |
|
|
496
|
+
|
|
497
|
+
### stor.* generic request
|
|
498
|
+
|
|
499
|
+
#### Endpoint
|
|
500
|
+
任意 `stor.` 前缀端点。
|
|
501
|
+
|
|
502
|
+
#### Purpose
|
|
503
|
+
在固定命令尚未覆盖某个存储端点时,发送受控的通用存储请求。
|
|
504
|
+
|
|
505
|
+
#### Trim CLI Mapping
|
|
506
|
+
```
|
|
507
|
+
fnos-cli storage request stor.<name> [--json '<object>'] [--password <password>] [--yes]
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
#### Request Rules
|
|
511
|
+
- `endpoint` 必须以 `stor.` 开头。
|
|
512
|
+
- 已有固定命令覆盖的端点会被拒绝;应改用对应固定命令。
|
|
513
|
+
- `--json` 必须是 JSON object。
|
|
514
|
+
- `--json` 不能包含 `req`、`reqid` 或 `password`;`req` / `reqid` 由 CLI 生成,密码只能通过 `--password` 传入。
|
|
515
|
+
- 默认需要交互确认;`--yes` 可跳过确认。
|
|
516
|
+
- 传 `--password` 时,CLI 会先通过密码验证,再把密码加入目标 `stor.*` 请求。
|
|
517
|
+
|
|
518
|
+
#### Usage Notes
|
|
519
|
+
- 固定命令存在时优先使用固定命令,因为固定命令有更明确的本地校验和危险操作流程。
|
|
520
|
+
- 对不确定是否会修改设备状态的端点,应按危险操作处理,先执行只读探测并确认目标。
|
|
521
|
+
|
|
522
|
+
## 注意事项
|
|
523
|
+
- 存储池状态查询端点(`state` vs `state2`)的具体响应字段差异尚未完全确认。
|
|
524
|
+
- 部分高级端点(缓存设备操作、`stor.delRec`、`stor.lvActive` 等)尚未暴露。
|
|
525
|
+
- 所有通用响应都包含 `result`(`succ`/`fail`)、`errno` 和 `errmsg` 字段。
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# sysinfo 模块
|
|
2
|
+
|
|
3
|
+
## 模块概述
|
|
4
|
+
系统信息模块,涵盖机器标识、版本/硬件详情、主机/时间设置、风扇配置和电源计划调度。
|
|
5
|
+
|
|
6
|
+
## 模块约定
|
|
7
|
+
- 使用 `appcgi.sysinfo.*` 命名空间。
|
|
8
|
+
- 只读信息端点和配置变更端点应分开处理。
|
|
9
|
+
|
|
10
|
+
## 端点索引
|
|
11
|
+
- 已实现:
|
|
12
|
+
- `appcgi.sysinfo.getTrimMachineType`
|
|
13
|
+
- `appcgi.sysinfo.getTrimVersion`
|
|
14
|
+
- `appcgi.sysinfo.getKernelVersion`
|
|
15
|
+
- `appcgi.sysinfo.getHostName`
|
|
16
|
+
- `appcgi.sysinfo.getMachineId`
|
|
17
|
+
- `appcgi.sysinfo.getUptime`
|
|
18
|
+
- `appcgi.sysinfo.getAllVolsInfo`
|
|
19
|
+
- `appcgi.sysinfo.getVolsList`
|
|
20
|
+
- `appcgi.sysinfo.getDockerInfo`
|
|
21
|
+
- `appcgi.sysinfo.getUnixTime`
|
|
22
|
+
- `appcgi.sysinfo.getBootOnPowerFlag`
|
|
23
|
+
- `appcgi.sysinfo.getHardwareInfo`
|
|
24
|
+
- `appcgi.sysinfo.getReservedPartition`
|
|
25
|
+
- `appcgi.sysinfo.isTrimMachine`
|
|
26
|
+
- `appcgi.sysinfo.getTrimMachineFeature`
|
|
27
|
+
- `appcgi.sysinfo.getFanMode`
|
|
28
|
+
- `appcgi.sysinfo.getTrimDisk`
|
|
29
|
+
- `appcgi.sysinfo.getTimeSetting`
|
|
30
|
+
- `appcgi.sysinfo.getTimezoneList`
|
|
31
|
+
- `appcgi.sysinfo.listPowerPlan`
|
|
32
|
+
- `appcgi.sysinfo.nextPowerOffTime`
|
|
33
|
+
- `appcgi.sysinfo.getPowerPlanStatus`
|
|
34
|
+
- `appcgi.sysinfo.getPowerOnSeconds`
|
|
35
|
+
- `appcgi.sysinfo.getSystemInitedTimestamp`
|
|
36
|
+
- `appcgi.sysinfo.*` 泛化请求(通过 `system request`)
|
|
37
|
+
- 未实现:
|
|
38
|
+
- 主机/时间设置写操作:`setHostName`、`setTimeSetting`
|
|
39
|
+
- 电源计划写操作:`setPowerPlanStatus`、`addPowerPlan`、`deletePowerPlan`、`modifyPowerPlan`
|
|
40
|
+
- 风扇模式写操作:`setFanMode`
|
|
41
|
+
|
|
42
|
+
## 端点详情
|
|
43
|
+
|
|
44
|
+
### appcgi.sysinfo.getTrimMachineType
|
|
45
|
+
|
|
46
|
+
#### Endpoint
|
|
47
|
+
`appcgi.sysinfo.getTrimMachineType`
|
|
48
|
+
|
|
49
|
+
#### Purpose
|
|
50
|
+
返回 NAS 机器类型标识信息。
|
|
51
|
+
|
|
52
|
+
#### Trim CLI Mapping
|
|
53
|
+
```
|
|
54
|
+
fnos-cli system info
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
CLI 行为:
|
|
58
|
+
- 不要求已保存的 session。
|
|
59
|
+
- 将 `response.data` 以 JSON 格式打印;如果 `data` 不存在则报错。
|
|
60
|
+
|
|
61
|
+
#### Request
|
|
62
|
+
| Field | Location | Required | Type | Meaning | Constraints / Notes | Example |
|
|
63
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
64
|
+
| `req` | body | yes | string | Endpoint selector | Fixed value `appcgi.sysinfo.getTrimMachineType` | `appcgi.sysinfo.getTrimMachineType` |
|
|
65
|
+
| `reqid` | body | yes | string | Request correlation ID | Generated per request | `69ba...` |
|
|
66
|
+
|
|
67
|
+
#### Response
|
|
68
|
+
| Field | Always Present | Type | Meaning | Conditions / Notes | Example |
|
|
69
|
+
| --- | --- | --- | --- | --- | --- |
|
|
70
|
+
| `data` | no | object | 机器类型信息 | CLI 优先提取此字段 | `{"type":"trim-xx"}` |
|
|
71
|
+
| `result` | no | string | Terminal marker | `succ`/`fail` | `succ` |
|
|
72
|
+
| `errno` | no | number | 错误码 | 失败时出现 | `65534` |
|
|
73
|
+
| `errmsg` | no | string | 错误描述 | 失败时出现 | `permission denied` |
|
|
74
|
+
|
|
75
|
+
#### Protocol Notes
|
|
76
|
+
- 使用普通 JSON 请求。
|
|
77
|
+
|
|
78
|
+
#### Field Semantics
|
|
79
|
+
- 返回数据的具体字段由后端定义,可能因机型和固件版本而异。
|
|
80
|
+
|
|
81
|
+
#### Errors
|
|
82
|
+
- 后端错误通过统一格式化器输出。
|
|
83
|
+
- 缺少 `data` 时命令会以非零退出码失败。
|
|
84
|
+
|
|
85
|
+
### 其他只读端点
|
|
86
|
+
|
|
87
|
+
以下端点均为只读查询,不要求已保存 session,并打印响应 `data` 对象。
|
|
88
|
+
|
|
89
|
+
| CLI 命令 | Endpoint | Request 参数 | 用途 |
|
|
90
|
+
| --- | --- | --- | --- |
|
|
91
|
+
| `fnos-cli system trim-version` | `appcgi.sysinfo.getTrimVersion` | 无 | 系统版本 |
|
|
92
|
+
| `fnos-cli system kernel-version` | `appcgi.sysinfo.getKernelVersion` | 无 | 内核版本 |
|
|
93
|
+
| `fnos-cli system host-name` | `appcgi.sysinfo.getHostName` | 无 | 主机名 |
|
|
94
|
+
| `fnos-cli system machine-id` | `appcgi.sysinfo.getMachineId` | 无 | 机器 ID |
|
|
95
|
+
| `fnos-cli system uptime` | `appcgi.sysinfo.getUptime` | 无 | 系统运行时间 |
|
|
96
|
+
| `fnos-cli system all-vols` | `appcgi.sysinfo.getAllVolsInfo` | 无 | 全部卷信息 |
|
|
97
|
+
| `fnos-cli system vols` | `appcgi.sysinfo.getVolsList` | 无 | 卷列表 |
|
|
98
|
+
| `fnos-cli system docker` | `appcgi.sysinfo.getDockerInfo` | 无 | Docker 相关系统信息 |
|
|
99
|
+
| `fnos-cli system unix-time` | `appcgi.sysinfo.getUnixTime` | 无 | 系统 Unix 时间 |
|
|
100
|
+
| `fnos-cli system boot-on-power` | `appcgi.sysinfo.getBootOnPowerFlag` | 无 | 通电启动标记 |
|
|
101
|
+
| `fnos-cli system hardware` | `appcgi.sysinfo.getHardwareInfo` | 无 | 硬件信息 |
|
|
102
|
+
| `fnos-cli system reserved-partition` | `appcgi.sysinfo.getReservedPartition` | 无 | 预留分区信息 |
|
|
103
|
+
| `fnos-cli system is-trim-machine` | `appcgi.sysinfo.isTrimMachine` | 无 | 是否为 TRIM 机器 |
|
|
104
|
+
| `fnos-cli system trim-feature` | `appcgi.sysinfo.getTrimMachineFeature` | 无 | 机器能力特性 |
|
|
105
|
+
| `fnos-cli system fan-mode` | `appcgi.sysinfo.getFanMode` | 无 | 风扇模式 |
|
|
106
|
+
| `fnos-cli system trim-disk` | `appcgi.sysinfo.getTrimDisk` | 无 | 系统盘/机器磁盘信息 |
|
|
107
|
+
| `fnos-cli system time-setting --lang zh-CN` | `appcgi.sysinfo.getTimeSetting` | 可选 `lang` | 时间设置 |
|
|
108
|
+
| `fnos-cli system timezone-list --lang zh-CN` | `appcgi.sysinfo.getTimezoneList` | 可选 `lang` | 时区列表 |
|
|
109
|
+
| `fnos-cli system power-plan` | `appcgi.sysinfo.listPowerPlan` | 无 | 电源计划列表 |
|
|
110
|
+
| `fnos-cli system next-power-off-time` | `appcgi.sysinfo.nextPowerOffTime` | 无 | 下一次关机时间 |
|
|
111
|
+
| `fnos-cli system power-plan-status` | `appcgi.sysinfo.getPowerPlanStatus` | 无 | 电源计划启用状态 |
|
|
112
|
+
| `fnos-cli system power-on-seconds` | `appcgi.sysinfo.getPowerOnSeconds` | 无 | 通电秒数 |
|
|
113
|
+
| `fnos-cli system inited-timestamp` | `appcgi.sysinfo.getSystemInitedTimestamp` | 无 | 系统初始化时间戳 |
|
|
114
|
+
|
|
115
|
+
### 泛化请求
|
|
116
|
+
|
|
117
|
+
| CLI 命令 | Endpoint | Request 参数 | 风险控制 |
|
|
118
|
+
| --- | --- | --- | --- |
|
|
119
|
+
| `fnos-cli system request appcgi.sysinfo.* --json '<object>'` | 用户指定的 `appcgi.sysinfo.*` 端点 | JSON 对象,不能包含 `req` 或 `reqid` | 默认需要确认;可用 `--yes` 跳过 |
|
|
120
|
+
|
|
121
|
+
泛化请求约束:
|
|
122
|
+
- endpoint 必须以 `appcgi.sysinfo.` 开头。
|
|
123
|
+
- `--json` 必须是 JSON object。
|
|
124
|
+
- `req` 和 `reqid` 由 CLI 生成,用户 JSON 中禁止提供这两个字段。
|
|
125
|
+
- `system request` 是泛化入口,不区分读写端点,默认统一要求确认。
|
|
126
|
+
- `system request` 使用已保存 session 认证;如果当前目标与保存 session 不一致,会先失败而不是匿名发送配置请求。
|
|
127
|
+
|
|
128
|
+
## 注意事项
|
|
129
|
+
- 返回数据的具体字段结构可能因 NAS 机型和固件版本而异。
|
|
130
|
+
- 当前固定子命令均为读取型查询。
|
|
131
|
+
- 定时开关机功能依赖设备声明的硬件能力。`system power-plan` 收到成功但没有 `data` 的响应时输出 `{"plan":[]}`,与空计划列表一致;空列表不表示硬件支持定时开机。其他系统查询仍会拒绝缺少 `data` 的响应。
|
|
132
|
+
- `errno 100060031` 表示该功能仅受官方硬件支持,CLI 会显示英文提示 `this feature is supported only on official hardware`。`boot-on-power`、`trim-disk`、`power-on-seconds` 等硬件相关查询可能返回该错误。
|
|
133
|
+
- 电源计划、主机名、时间设置和风扇模式的配置端点尚未作为固定命令实现;如需调用,应通过 `system request` 并确认风险。
|