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