Files
csm/wiki/client.md
iven 60ee38a3c2 feat: 新增补丁管理和异常检测插件及相关功能
feat(protocol): 添加补丁管理和行为指标协议类型
feat(client): 实现补丁管理插件采集功能
feat(server): 添加补丁管理和异常检测API
feat(database): 新增补丁状态和异常检测相关表
feat(web): 添加补丁管理和异常检测前端页面
fix(security): 增强输入验证和防注入保护
refactor(auth): 重构认证检查逻辑
perf(service): 优化Windows服务恢复策略
style: 统一健康评分显示样式
docs: 更新知识库文档
2026-04-11 15:59:53 +08:00

89 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Client客户端代理
## 设计思想
`csm-client` 是部署在医院终端设备上的 Windows 代理程序,设计为:
1. **无人值守运行** — 支持控制台模式(开发调试)和 Windows 服务模式(生产部署)
2. **自动重连** — 指数退避策略1s → 60s断线后 drain stale frames
3. **插件化采集** — 每个插件独立 task通过 `watch` channel 接收配置,通过 `mpsc` channel 上报数据
4. **单入口 data channel** — 所有插件共享一个 `mpsc::channel::<Frame>(1024)`network 模块统一发送
关键设计决策:
- **watch + mpsc 双通道** — `watch` 用于服务器推送配置到插件(多消费者最新值),`mpsc` 用于插件上报数据到网络层(多生产者有序队列)
- **device_uid 持久化** — UUID 首次生成后写入 `device_uid.txt`,与可执行文件同目录
- **device_secret 持久化** — 注册成功后写入 `device_secret.txt`,重启后自动认证
## 代码逻辑
### 启动流程
```
main() → load device_uid → load device_secret → create ClientState
→ create data channel (mpsc 1024)
→ create watch channels for each plugin config
→ spawn core tasks (monitor, asset, usb)
→ spawn plugin tasks (11 plugins)
→ reconnect loop: connect_and_run() with exponential backoff
```
### 网络层 (`network/mod.rs`)
- `connect_and_run()` — TCP 连接、注册/认证、双工读写循环
- `handle_server_message()` — 根据 MessageType 分发服务器下发的帧到对应 watch channel
- `PluginChannels` — 持有所有插件的 `watch::Sender`,用于接收服务器推送的配置
- 注册流程:发送 Register → 收到 RegisterResponse含 device_secret→ 持久化 secret
- 认证流程:已有 device_secret 时,心跳帧携带 HMAC-SHA256 签名
### 插件统一模板
每个插件遵循相同模式:
```rust
pub async fn start(
mut config_rx: watch::Receiver<PluginConfig>,
data_tx: mpsc::Sender<Frame>,
device_uid: String,
) {
loop {
tokio::select! {
result = config_rx.changed() => { /* 更新 config */ }
_ = interval.tick() => {
if !config.enabled { continue; }
// 采集数据 → Frame::new_json() → data_tx.send()
}
}
}
}
```
### 双模式运行
- **控制台模式**: 直接 `cargo run -p csm-client`Ctrl+C 优雅退出
- **服务模式**: `--install` 注册 Windows 服务、`--service` 以服务方式运行、`--uninstall` 卸载
## 关联模块
- [[protocol]] — 使用 Frame 构造上报帧,解析服务器下发帧
- [[server]] — TCP 连接的对端,接收帧并处理
- [[plugins]] — 每个插件的具体实现逻辑
## 关键文件
| 文件 | 职责 |
|------|------|
| `crates/client/src/main.rs` | 启动入口、插件 channel 创建、task spawn、重连循环 |
| `crates/client/src/network/mod.rs` | TCP 连接、注册认证、双工读写、服务器消息分发 |
| `crates/client/src/service.rs` | Windows 服务安装/卸载/运行(`#[cfg(target_os = "windows")]` |
| `crates/client/src/monitor/mod.rs` | 核心设备状态采集CPU/内存/进程) |
| `crates/client/src/asset/mod.rs` | 硬件/软件资产采集 |
| `crates/client/src/usb/mod.rs` | USB 设备插拔监控 |
| `crates/client/src/web_filter/mod.rs` | 上网拦截插件 |
| `crates/client/src/usage_timer/mod.rs` | 使用时长记录插件 |
| `crates/client/src/software_blocker/mod.rs` | 软件禁止安装插件 |
| `crates/client/src/popup_blocker/mod.rs` | 弹窗拦截插件 |
| `crates/client/src/usb_audit/mod.rs` | U盘文件操作审计插件 |
| `crates/client/src/watermark/mod.rs` | 屏幕水印插件 |
| `crates/client/src/disk_encryption/mod.rs` | 磁盘加密检测插件 |
| `crates/client/src/print_audit/mod.rs` | 打印审计插件 |
| `crates/client/src/clipboard_control/mod.rs` | 剪贴板管控插件 |
| `crates/client/src/patch/mod.rs` | 补丁管理插件 |