133 lines
4.3 KiB
Markdown
133 lines
4.3 KiB
Markdown
# Bash Go Service
|
||
|
||
`bash_go_service` 是 `execve_hook` 项目的配套后端服务,主要负责配置管理、进程间通信以及与外部服务的交互。它由多个微服务组件构成,共同支撑起整个智能 Bash 环境的功能。
|
||
|
||
## 核心组件
|
||
|
||
### 1. Backend Service (`backend-service`)
|
||
|
||
这是主服务模块,负责处理来自 `execve_hook` 的请求。
|
||
|
||
- **Socket 服务**: 监听 Unix Domain Socket (`/etc/exec_hook/exec.sock`),接收 C 客户端发送的命令执行信息(文件名、参数、环境变量、错误日志路径等)。
|
||
- **业务逻辑**: 解析接收到的数据,进行错误分析(如读取错误日志),并生成相应的建议或反馈。
|
||
- **外部交互**: 可能与远程服务器(如 Machine Registry)通信,上报数据或获取策略。
|
||
- **任务管理**: 使用 `WorkerPool` 管理多个后台任务,包括配置管理、Socket 服务、版本检查等。
|
||
- **守护进程**: 支持以守护进程模式运行 (`daemon` 命令),并提供 `force` 和 `quit` 命令来管理服务状态。
|
||
|
||
### 2. Config Loader (`config-loader`)
|
||
|
||
负责管理 `execve_hook` 所需的配置数据。
|
||
|
||
- **共享内存管理**: 使用 System V 共享内存机制(`shmget`, `shmat`),将解析后的配置数据写入共享内存。
|
||
- **配置同步**: 确保 C 代码(`execve_hook`)能够高效地读取最新的拦截规则,而无需频繁读取磁盘文件。
|
||
- **配置来源**: 支持从本地文件(如 YAML)或远程服务器加载配置。
|
||
- **初始化**: 启动时会清理并重新初始化共享内存,确保配置的一致性。
|
||
|
||
### 3. Shared Library (`shared`)
|
||
|
||
包含所有服务共用的代码库。
|
||
|
||
- **Constants**: 定义了 Socket 路径、共享内存 Key、命令常量等。
|
||
- **Logger**: 统一的日志处理模块。
|
||
- **Utils**: 通用工具函数。
|
||
|
||
### 4. Updater (`updater`)
|
||
|
||
负责服务的自动更新检查和升级流程。
|
||
|
||
- **替换逻辑**: 接收旧文件路径、新文件路径和目标路径,执行原子替换操作。
|
||
- **回滚机制**: 如果替换失败或新程序启动失败,会自动回滚到旧版本。
|
||
- **自动重启**: 更新完成后可选择自动重启服务。
|
||
|
||
### 5. Version (`version`)
|
||
|
||
版本管理模块,用于处理版本号和构建信息。
|
||
|
||
### 6. Welcome (`welcome`)
|
||
|
||
可能用于处理用户登录后的欢迎信息或初始化操作。
|
||
|
||
## 架构交互
|
||
|
||
```mermaid
|
||
graph TD
|
||
subgraph "C Side (execve_hook)"
|
||
Hook[execve_interceptor]
|
||
Client[Socket Client]
|
||
end
|
||
|
||
subgraph "Go Side (bash_go_service)"
|
||
Socket[Backend Service]
|
||
Loader[Config Loader]
|
||
SHM[(Shared Memory)]
|
||
Updater[Updater]
|
||
end
|
||
|
||
Loader -->|Write Config| SHM
|
||
Hook -->|Read Config| SHM
|
||
|
||
Client -->|Send Exec Info| Socket
|
||
Socket -->|Analyze & Reply| Client
|
||
|
||
Socket -->|Check Update| Updater
|
||
Updater -->|Replace Binary| Socket
|
||
```
|
||
|
||
## 配置说明 (`config/config.yaml`)
|
||
|
||
配置文件主要包含以下部分:
|
||
|
||
```yaml
|
||
machine_registry:
|
||
endpoint: "http://localhost:3001/endpoint" # 远程注册/上报接口
|
||
log:
|
||
level: DEBUG # 日志级别
|
||
bash_config:
|
||
loader: SERVER # 配置加载方式
|
||
watch_interval: 86400 # 配置检查间隔
|
||
update_checker:
|
||
interval: 86400 # 更新检查间隔
|
||
reporter:
|
||
show_msg: false # 是否显示上报消息
|
||
```
|
||
|
||
## 构建与运行
|
||
|
||
项目使用 Go Workspaces (`go.work`) 管理多模块依赖。
|
||
|
||
### 编译
|
||
|
||
进入各个服务的 `cmd` 目录进行编译,例如:
|
||
|
||
```bash
|
||
# 编译 Backend Service
|
||
cd backend-service/cmd
|
||
go build -o ../../bin/backend-service
|
||
|
||
# 编译 Config Loader
|
||
cd config-loader/cmd/manager
|
||
go build -o ../../../bin/config-loader
|
||
|
||
# 编译 Updater
|
||
cd updater/cmd
|
||
go build -o ../../bin/updater
|
||
```
|
||
|
||
### 运行
|
||
|
||
确保配置文件存在,并直接运行编译后的二进制文件。通常需要 root 权限以创建 Socket 文件和操作共享内存。
|
||
|
||
```bash
|
||
# 启动 Backend Service (支持 daemon 模式)
|
||
sudo ./bin/backend-service daemon
|
||
|
||
# 运行 Config Loader (通常由 Backend Service 调用或独立运行)
|
||
sudo ./bin/config-loader
|
||
```
|
||
|
||
## 依赖管理
|
||
|
||
- 使用 `go.work` 管理工作区。
|
||
- 各个子模块有独立的 `go.mod`。
|
||
- 共享代码通过 `shared` 模块引用。
|