fnos-cli 0.2.0 → 0.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,116 @@
1
+ # 变更日志
2
+
3
+ 本文档记录 fnos-cli 的所有重要变更。
4
+
5
+ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
+ 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [0.3.0] - 2026-07-20
9
+
10
+ ### 新增
11
+
12
+ - 接入 fnos 0.4.0 的 21 个领域和全部 111 条业务命令
13
+ - 支持两步验证、token 重用、WSS endpoint 和 SSL 证书验证
14
+ - 新增基于固定版本 fnos-mock-server 的完整 CLI 冒烟测试
15
+ - 新增自动生成的完整命令参考
16
+
17
+ ### 修复
18
+
19
+ - 修复可选位置参数把超时值当成业务参数的问题
20
+ - 修复 `file.ls` 错误要求 `--path` 的问题
21
+ - 对密码、验证码、token、secret 和签名材料执行统一日志脱敏
22
+ - 兼容 fnos 0.4.0 重复请求主机名时响应被握手处理器消费的问题
23
+
24
+ ## [0.2.2] - 2026-02-16
25
+
26
+ ### 修复
27
+
28
+ - 版本号从 package.json 动态读取,避免硬编码导致版本不同步
29
+
30
+ ## [0.2.1] - 2026-02-16
31
+
32
+ ### 变更
33
+
34
+ - 升级 fnos 依赖至 0.2.1
35
+
36
+ ## [0.2.0] - 2026-02-01
37
+
38
+ ### 新增
39
+
40
+ - 所有命令(login 和 logout 除外)支持 `-e/-u/-p` 命令行凭证参数,允许临时使用不同的服务器凭证而不影响已保存的配置
41
+
42
+ ### 修复
43
+
44
+ - `logout` 命令现在只清除登录认证配置项,不再删除整个 settings.json 文件
45
+
46
+ ## [0.1.0] - 2026-01-30
47
+
48
+ ### 新增
49
+
50
+ #### 功能
51
+ - **认证系统**
52
+ - 实现 `login` 命令,支持保存登录凭证
53
+ - 实现 `logout` 命令,支持清除保存的凭证
54
+ - 凭证保存在权限为 600 的 `~/.fnos/settings.json`
55
+
56
+ - **资源监控**
57
+ - `resmon.cpu` - CPU 资源监控
58
+ - `resmon.gpu` - GPU 资源监控
59
+ - `resmon.mem` - 内存资源监控
60
+ - `resmon.disk` - 磁盘资源监控
61
+ - `resmon.net` - 网络资源监控
62
+ - `resmon.gen` - 通用资源监控,支持自定义监控项
63
+
64
+ - **存储管理**
65
+ - `store.general` - 存储通用信息
66
+ - `store.calcSpace` - 计算存储空间
67
+ - `store.listDisk` - 列出磁盘信息,支持过滤热备盘
68
+ - `store.diskSmart` - 获取磁盘 SMART 信息
69
+ - `store.state` - 获取存储状态
70
+
71
+ - **系统信息**
72
+ - `sysinfo.getHostName` - 获取主机名
73
+ - `sysinfo.getTrimVersion` - 获取 Trim 版本
74
+ - `sysinfo.getMachineId` - 获取机器 ID
75
+ - `sysinfo.getHardwareInfo` - 获取硬件信息
76
+ - `sysinfo.getUptime` - 获取系统运行时间
77
+
78
+ - **用户管理**
79
+ - `user.info` - 获取用户信息
80
+ - `user.listUG` - 列出用户和组
81
+ - `user.groupUsers` - 获取用户分组信息
82
+ - `user.isAdmin` - 检查当前用户是否为管理员
83
+
84
+ - **网络管理**
85
+ - `network.list` - 列出网络信息,支持类型过滤
86
+ - `network.detect` - 检测网络接口
87
+
88
+ - **文件操作**
89
+ - `file.ls` - 列出文件和目录
90
+ - `file.mkdir` - 创建目录
91
+ - `file.rm` - 删除文件或目录,支持移动到回收站
92
+
93
+ - **SAC (UPS)**
94
+ - `sac.upsStatus` - 获取 UPS 状态信息
95
+
96
+ #### 全局选项
97
+ - `--raw` - 输出原始 JSON 响应
98
+ - `-v` - 显示 info 级别日志(输出到 stderr)
99
+ - `-vv` - 显示 debug 级别日志(输出到 stderr)
100
+ - `-vvv` - 显示 silly 级别日志(输出到 stderr)
101
+
102
+ #### 帮助系统
103
+ - `fnos --help` - 显示所有一级命令和全局选项
104
+ - `fnos <command> --help` - 显示命令的二级命令列表
105
+ - `fnos <command>.<subcommand> --help` - 显示子命令的详细帮助
106
+
107
+ #### 日志系统
108
+ - Winston 日志框架集成
109
+ - 日志文件自动保存在 `~/.fnos/logs/`
110
+ - 日志文件命名格式:`fnos-YYYY-MM-DD-{random}.log`
111
+ - 支持四级日志级别(error、info、debug、silly)
112
+
113
+ #### 输出格式化
114
+ - 智能格式化输出(对象、数组、基本类型)
115
+ - 支持 JSON 原始输出模式
116
+ - 数组数据表格化显示
package/README.md CHANGED
@@ -1,38 +1,28 @@
1
1
  # fnos-cli
2
2
 
3
- 飞牛 fnOS 系统的命令行客户端 (CLI)
3
+ [![npm version](https://badge.fury.io/js/fnos-cli.svg)](https://www.npmjs.com/package/fnos-cli)
4
+ ![License](https://img.shields.io/npm/l/fnos-cli)
4
5
 
5
- ## 简介
6
+ 飞牛 fnOS 系统的命令行客户端,通过 WebSocket/WSS 调用 fnOS API。
6
7
 
7
- fnos-cli 是一个用于与飞牛 fnOS 系统交互的命令行工具,通过 WebSocket 协议连接到 fnOS 服务器,提供资源监控、存储管理、系统信息查询、用户管理、网络管理、文件操作和 UPS 状态监控等功能。
8
+ ## 功能
8
9
 
9
- ## 功能特性
10
-
11
- - 🔐 **安全的认证机制** - 支持登录/登出,凭证加密保存
12
- - 📊 **资源监控** - CPU、GPU、内存、磁盘、网络监控
13
- - 💾 **存储管理** - 查看存储信息、磁盘列表、SMART 信息
14
- - ℹ️ **系统信息** - 主机名、版本、硬件信息、运行时间等
15
- - 👤 **用户管理** - 用户信息、用户组、权限管理
16
- - 🌐 **网络管理** - 网络接口信息、网络检测
17
- - 📁 **文件操作** - 文件列表、创建目录、删除文件
18
- - 🔋 **UPS 监控** - UPS 状态信息
19
- - 📝 **灵活的输出格式** - 支持 JSON 原始输出和格式化输出
20
- - 🐛 **多级日志** - 支持 info、debug、silly 三种日志级别
10
+ - 提供 21 个业务领域、111 条查询命令
11
+ - 支持密码登录、token 重用和两步验证
12
+ - 支持 `ws://`、`wss://` 以及可选的严格证书验证
13
+ - 支持原始 JSON 和格式化输出
14
+ - 密码、验证码、token、secret 和签名材料统一日志脱敏
15
+ - 凭证保存在权限为 0600 的本地设置文件中
21
16
 
22
17
  ## 安装
23
18
 
24
- ### 前置要求
25
-
26
- - Node.js >= 16.0.0
27
- - npm >= 8.0.0
28
-
29
- ### 从 npm 安装
19
+ 需要 Node.js 18 或更高版本、npm 8 或更高版本。
30
20
 
31
21
  ```bash
32
22
  npm install -g fnos-cli
33
23
  ```
34
24
 
35
- ### 从源码安装
25
+ 从源码运行:
36
26
 
37
27
  ```bash
38
28
  git clone <repository-url>
@@ -41,301 +31,122 @@ npm install
41
31
  npm link
42
32
  ```
43
33
 
44
- ## 快速开始
45
-
46
- ### 1. 登录
47
-
48
- 首次使用需要登录到 fnOS 系统:
34
+ ## 登录与认证
49
35
 
50
- ```bash
51
- fnos login -e <endpoint> -u <username> -p <password>
52
- ```
53
-
54
- 例如:
36
+ 首次使用可保存登录凭证:
55
37
 
56
38
  ```bash
57
- fnos login -e nas-9.timandes.net:5666 -u SystemMonitor -p yourpassword
39
+ fnos login -e nas.example.com:5666 -u admin -p password
58
40
  ```
59
41
 
60
- 登录成功后,凭证会保存在 `~/.fnos/settings.json` 文件中,后续命令无需重复输入。
42
+ 设置写入 `~/.fnos/settings.json`。后续命令会优先重用有效 token;token 失效时回退到密码登录并升级旧凭证格式。
61
43
 
62
- ### 2. 使用命令行凭证参数
63
-
64
- 除了使用 `login` 保存凭证外,您还可以直接在命令中提供连接参数:
44
+ 也可为单条业务命令临时提供完整凭证,这些参数不会写入设置:
65
45
 
66
46
  ```bash
67
- fnos <command> -e <endpoint> -u <username> -p <password>
47
+ fnos resmon.cpu -e nas.example.com:5666 -u admin -p password
68
48
  ```
69
49
 
70
- 例如:
71
-
72
- ```bash
73
- fnos resmon.cpu -e nas-9.timandes.net:5666 -u SystemMonitor -p yourpassword
74
- ```
75
-
76
- **注意事项**:
77
- - 三个参数(`-e`、`-u`、`-p`)必须同时提供,不能只提供部分参数
78
- - 使用命令行参数提供的凭证**不会**保存到配置文件中,适合临时使用
79
- - 如果未提供这三个参数,会自动使用已保存的凭证(需要先执行 `login`)
80
- - 这种方式适合自动化脚本或临时连接到不同服务器
81
-
82
- ### 3. 使用命令
83
-
84
- 登录后即可执行各种命令:
85
-
86
- ```bash
87
- # 查看 CPU 使用情况
88
- fnos resmon.cpu
89
-
90
- # 查看存储信息
91
- fnos store.general
92
-
93
- # 查看系统信息
94
- fnos sysinfo.getHostName
95
-
96
- # 列出文件
97
- fnos file.ls --path /home/user
98
- ```
99
-
100
- ### 3. 登出
101
-
102
- 如需清除保存的凭证:
50
+ `-e`、`-u`、`-p` 必须同时提供。退出并只清除认证字段:
103
51
 
104
52
  ```bash
105
53
  fnos logout
106
54
  ```
107
55
 
108
- ## 命令参考
56
+ ### 两步验证
109
57
 
110
- ### 全局选项
111
-
112
- | 选项 | 说明 |
113
- |------|------|
114
- | `--raw` | 输出原始 JSON 响应 |
115
- | `-v` | 显示 info 级别日志(输出到 stderr) |
116
- | `-vv` | 显示 debug 级别日志(输出到 stderr) |
117
- | `-vvv` | 显示 silly 级别日志(输出到 stderr) |
118
- | `-h, --help` | 显示帮助信息 |
119
- | `-V, --version` | 显示版本信息 |
120
-
121
- **注意**:
122
- - 命令结果输出到 **stdout**
123
- - 所有日志输出到 **stderr**
124
- - 默认情况下(无 `-v`),只显示错误日志到 stderr
125
- - 使用 `-v`、`-vv`、`-vvv` 可以控制日志详细程度
126
-
127
- **输出重定向示例**:
58
+ 需要两步验证的账户可在登录或业务命令中提供六位验证码:
128
59
 
129
60
  ```bash
130
- # 只保存命令结果,忽略所有日志
131
- fnos resmon.cpu > output.json 2>/dev/null
132
-
133
- # 只保存日志,忽略命令结果
134
- fnos resmon.cpu -v 2>log.txt 1>/dev/null
135
-
136
- # 分别保存命令结果和日志
137
- fnos resmon.cpu -v > output.json 2>log.txt
138
-
139
- # 查看命令结果,隐藏日志
140
- fnos resmon.cpu 2>/dev/null
61
+ fnos login -e wss://nas.example.com:5667 -u admin -p password --twofa-code 123456 --trust-device --verify-ssl
141
62
  ```
142
63
 
143
- ### 认证参数
64
+ 验证码不会写入设置或日志。若账户尚未绑定两步验证,CLI 会提示先在 fnOS 网页端完成绑定。
144
65
 
145
- 所有命令(`login` 和 `logout` 除外)都支持以下可选的认证参数:
66
+ ### WSS
146
67
 
147
- | 参数 | 说明 |
148
- |------|------|
149
- | `-e, --endpoint <endpoint>` | 服务器端点(例如:nas-9.timandes.net:5666) |
150
- | `-u, --username <username>` | 用户名 |
151
- | `-p, --password <password>` | 密码 |
68
+ endpoint 中直接使用 `wss://`。默认兼容 fnOS 常见的自签名证书;需要严格验证证书时添加 `--verify-ssl`。当 fnOS 把 WS 重定向到 HTTPS 时,错误会同时显示原地址和重定向地址,并提示改用 `wss://`。
152
69
 
153
- **使用规则**:
70
+ ## 命令参考
154
71
 
155
- 1. **三个参数必须同时提供**:如果提供任何一个参数,必须同时提供另外两个参数
156
- 2. **临时使用不保存**:通过命令行参数提供的凭证不会被保存到配置文件
157
- 3. **优先使用命令行参数**:如果同时提供了命令行参数和配置文件中有保存的凭证,优先使用命令行参数
158
- 4. **回退到配置文件**:如果未提供这三个参数,会自动使用 `login` 保存的凭证
72
+ fnos-cli 提供 21 个领域、111 条业务命令。完整参数、类型和默认值见 [命令参考](docs/commands.md)。
159
73
 
160
- **示例**:
74
+ 常用示例:
161
75
 
162
76
  ```bash
163
- # 使用命令行参数(临时使用,不保存)
164
- fnos resmon.cpu -e nas-9.timandes.net:5666 -u SystemMonitor -p yourpassword
165
-
166
- # 错误示例:只提供部分参数
167
- fnos resmon.cpu -e nas-9.timandes.net:5666
168
- # Error: When using -e/--endpoint, you must also provide -u/--username and -p/--password.
169
-
170
- # 使用已保存的凭证(需要先执行 login)
171
- fnos login -e nas-9.timandes.net:5666 -u SystemMonitor -p yourpassword
172
- fnos resmon.cpu # 不需要再提供参数
77
+ fnos resmon.systemFan
78
+ fnos docker.listContainers --all true
79
+ fnos backup.listTasks --direction 0
80
+ fnos network.getInfo --if-name eth0
81
+ fnos security.getProcessTraffic --processes '[{"pid":1001,"process":"demo"}]'
173
82
  ```
174
83
 
175
- ### 资源监控命令
84
+ 原有 26 条命令名称保持兼容,既有 camelCase 参数也保留为隐藏别名。
176
85
 
177
- | 命令 | 说明 |
178
- |------|------|
179
- | `fnos resmon.cpu` | CPU 资源监控 |
180
- | `fnos resmon.gpu` | GPU 资源监控 |
181
- | `fnos resmon.mem` | 内存资源监控 |
182
- | `fnos resmon.disk` | 磁盘资源监控 |
183
- | `fnos resmon.net` | 网络资源监控 |
184
- | `fnos resmon.gen --items <items>` | 通用资源监控 |
185
-
186
- 示例:
187
-
188
- ```bash
189
- fnos resmon.cpu --raw
190
- fnos resmon.gen --items storeSpeed,netSpeed,cpuBusy,memPercent
191
- ```
192
-
193
- ### 存储管理命令
86
+ ### 全局选项
194
87
 
195
- | 命令 | 说明 |
196
- |------|------|
197
- | `fnos store.general` | 存储通用信息 |
198
- | `fnos store.calcSpace` | 计算存储空间 |
199
- | `fnos store.listDisk [--noHotSpare]` | 列出磁盘信息 |
200
- | `fnos store.diskSmart --disk <disk>` | 获取磁盘 SMART 信息 |
201
- | `fnos store.state [--name] [--uuid]` | 获取存储状态 |
88
+ | 选项 | 说明 |
89
+ |---|---|
90
+ | `--raw` | 输出原始 JSON |
91
+ | `-v, --verbose` | 输出 info 日志到 stderr |
92
+ | `-vv, --debug` | 输出 debug 日志到 stderr |
93
+ | `-vvv, --silly` | 输出 silly 日志到 stderr |
94
+ | `-V, --version` | 显示版本 |
95
+ | `-h, --help` | 显示帮助 |
202
96
 
203
- 示例:
97
+ 命令结果写入 stdout,日志写入 stderr:
204
98
 
205
99
  ```bash
206
- fnos store.listDisk --noHotSpare false
207
- fnos store.diskSmart --disk nvme0n1
100
+ fnos resmon.cpu --raw > result.json 2> fnos.log
208
101
  ```
209
102
 
210
- ### 系统信息命令
211
-
212
- | 命令 | 说明 |
213
- |------|------|
214
- | `fnos sysinfo.getHostName` | 获取主机名 |
215
- | `fnos sysinfo.getTrimVersion` | 获取 Trim 版本 |
216
- | `fnos sysinfo.getMachineId` | 获取机器 ID |
217
- | `fnos sysinfo.getHardwareInfo` | 获取硬件信息 |
218
- | `fnos sysinfo.getUptime` | 获取系统运行时间 |
219
-
220
- ### 用户管理命令
103
+ ## 配置与日志
221
104
 
222
- | 命令 | 说明 |
223
- |------|------|
224
- | `fnos user.info` | 获取用户信息 |
225
- | `fnos user.listUG` | 列出用户和组 |
226
- | `fnos user.groupUsers` | 获取用户分组信息 |
227
- | `fnos user.isAdmin` | 检查当前用户是否为管理员 |
105
+ - `~/.fnos/settings.json`:登录凭证,权限固定为 0600
106
+ - `~/.fnos/logs/`:日志文件目录
228
107
 
229
- ### 网络管理命令
108
+ 密码目前以本地设置值保存,并非系统钥匙串或加密保险库。请保护用户主目录权限,不要共享设置文件。
230
109
 
231
- | 命令 | 说明 |
232
- |------|------|
233
- | `fnos network.list [--type]` | 列出网络信息 |
234
- | `fnos network.detect --ifName <name>` | 检测网络接口 |
110
+ ## 开发
235
111
 
236
- 示例:
112
+ ### 运行测试
237
113
 
238
114
  ```bash
239
- fnos network.list --type 0
240
- fnos network.detect --ifName eth0
115
+ npm test # 离线单元测试
116
+ npm run test:smoke # 需要 127.0.0.1:5666 上运行固定版本 fnos-mock-server
117
+ npm run test:all # 单元测试和冒烟测试
241
118
  ```
242
119
 
243
- ### 文件操作命令
120
+ 冒烟测试固定使用 fnos-mock-server 提交 `d9592a05a8e07082b954921acfae3a9a915f3c01`、Python 3.11 和 `uv`,并设置 `FNOS_MOCK_TWOFA_USERS=twofauser`。
244
121
 
245
- | 命令 | 说明 |
246
- |------|------|
247
- | `fnos file.ls [--path]` | 列出文件和目录 |
248
- | `fnos file.mkdir --path <path>` | 创建目录 |
249
- | `fnos file.rm --files <files> [--moveToTrashbin]` | 删除文件或目录 |
250
-
251
- 示例:
122
+ 重新生成命令参考:
252
123
 
253
124
  ```bash
254
- fnos file.ls --path /home/user
255
- fnos file.mkdir --path /home/user/newdir
256
- fnos file.rm --files file1.txt,file2.txt --moveToTrashbin false
125
+ npm run docs:commands
257
126
  ```
258
127
 
259
- ### SAC 命令
260
-
261
- | 命令 | 说明 |
262
- |------|------|
263
- | `fnos sac.upsStatus` | 获取 UPS 状态信息 |
264
-
265
- ## 配置文件
266
-
267
- fnos 将配置和凭证保存在用户主目录下的 `.fnos` 文件夹中:
268
-
269
- - `~/.fnos/settings.json` - 登录凭证(文件权限 600)
270
- - `~/.fnos/logs/` - 日志文件目录
271
-
272
- ## 日志
273
-
274
- ### 日志输出
275
-
276
- - **控制台输出**:所有日志输出到 **stderr**(标准错误流)
277
- - **文件输出**:日志文件保存在 `~/.fnos/logs/` 目录
278
- - **命令输出**:命令结果输出到 **stdout**(标准输出流)
279
-
280
- ### 日志级别
281
-
282
- | 级别 | 说明 | 使用方式 |
283
- |------|------|----------|
284
- | `error` | 仅错误信息 | 默认(无 `-v`) |
285
- | `info` | 常规信息 | 使用 `-v` |
286
- | `debug` | 调试信息 | 使用 `-vv` |
287
- | `silly` | 详细信息 | 使用 `-vvv` |
288
-
289
- ### 日志文件
290
-
291
- 日志文件按日期和随机数命名,格式为:`fnos-YYYY-MM-DD-{random}.log`
292
-
293
- 日志文件始终记录所有级别的日志(从 error 到 silly),不受 `-v` 参数影响。
294
-
295
- ### 默认行为
296
-
297
- - **不使用 `-v`**:只显示错误日志到 stderr,命令结果输出到 stdout
298
- - **使用 `-v`**:显示 info 及以上级别的日志到 stderr
299
- - **使用 `-vv`**:显示 debug 及以上级别的日志到 stderr
300
- - **使用 `-vvv`**:显示所有级别的日志到 stderr
301
-
302
- 这种设计遵循 Unix 工具的最佳实践,让用户可以灵活地分别处理命令输出和日志。
303
-
304
- ## 开发
305
-
306
128
  ### 项目结构
307
129
 
308
- ```
130
+ ```text
309
131
  fnos-cli/
310
- ├── bin/
311
- │ └── fnos # 可执行文件
132
+ ├── bin/fnos
312
133
  ├── src/
313
- │ ├── commands/ # 命令实现
314
- │ │ ├── auth.js # 认证命令
315
- │ │ └── index.js # 命令注册
316
- │ ├── utils/ # 工具函数
317
- │ │ ├── client.js # FnosClient 包装器
318
- │ ├── formatter.js # 输出格式化
319
- │ │ ├── logger.js # 日志配置
320
- │ │ └── settings.js # 设置管理
321
- │ ├── constants.js # 常量定义
322
- │ └── index.js # CLI 入口
323
- ├── constitution.md # 项目原则
324
- ├── package.json # 项目配置
325
- └── README.md # 本文件
326
- ```
327
-
328
- ### 运行测试
329
-
330
- ```bash
331
- npm test
134
+ │ ├── commands/
135
+ │ │ ├── catalog/
136
+ │ │ ├── auth.js
137
+ ├── options.js
138
+ │ │ └── runner.js
139
+ └── utils/
140
+ ├── scripts/generate-command-reference.js
141
+ ├── docs/commands.md
142
+ └── test/
332
143
  ```
333
144
 
334
145
  ## 依赖项
335
146
 
336
- - [fnos](https://www.npmjs.com/package/fnos) @ 0.2.0 - fnOS TypeScript SDK
337
- - [commander](https://www.npmjs.com/package/commander) @ 11.1.0 - 命令行框架
338
- - [winston](https://www.npmjs.com/package/winston) @ 3.19.0 - 日志框架
147
+ - [fnos](https://www.npmjs.com/package/fnos) @ 0.4.0
148
+ - [Commander.js](https://www.npmjs.com/package/commander) @ 11.1.0
149
+ - [Winston](https://www.npmjs.com/package/winston) @ 3.19.0
339
150
 
340
151
  ## 许可证
341
152
 
@@ -343,10 +154,4 @@ Apache License 2.0
343
154
 
344
155
  ## 贡献
345
156
 
346
- 欢迎提交 Issue 和 Pull Request
347
-
348
-
349
- ## 致谢
350
-
351
- 感谢 飞牛fnOS 团队提供的优质NAS系统。
352
-
157
+ 欢迎提交 Issue 和 Pull Request
package/bin/fnos CHANGED
@@ -1,3 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- require('../src/index.js');
3
+ require('../src').main().catch((error) => {
4
+ const { errorMessage } = require('../src/utils/errors');
5
+ console.error(`Error: ${errorMessage(error)}`);
6
+ process.exitCode = error.exitCode || 1;
7
+ });