# 需求文档：P3 级检测模块移植（文件权限检测 + 定时任务预期检测）

## 文档信息

- 创建时间：2026-07-22
- 需求来源：用户需求
- 关联模块：service_monitor
- 父需求：`PRD_需求文档_检测项丰富化移植.md`（阶段四）

---

## 1. 背景与目标

### 1.1 背景

服务监测模块已完成阶段一（补全缺失项 + 重构 depth 脚本）、阶段二（安全合规深度 + 中间件连接）和阶段三（P2 级移植：系统类型识别 + 平台服务检测 + 配置IP检测 + Console配置检测）。

### 1.2 目标

移植参考目录中适合巡检架构的 2 个检测模块：

1. **文件权限检测**：检查关键文件/目录的权限是否正确（run.sh 应可执行、配置文件不应过宽），只检测不修复
2. **定时任务预期检测**：检查预期 crontab 条目是否存在（MySQL备份、ujava2守护），只检测不修改

### 1.3 不纳入本次的 P3 模块

| 模块 | 原因 |
|------|------|
| FastDFS 功能验证 | 逻辑复杂（上传/下载/MD5/HTTP），需额外评估 |
| Android 设备检测 | 依赖 Windows adb.exe，在 Linux 巡检目标上无法运行 |
| 数据备份检测 | 属于运维操作（远程拉取+打包下载），非巡检 |
| 配置日志导出 | 同上，属于运维操作 |
| 修复能力检测 | 交互式修复工具，不是检测模块 |

---

## 2. 模块一：文件权限检测（54_file_permission_check.sh）

### 2.1 检测项列表

| KEY | 中文名 | 说明 |
|-----|--------|------|
| `FILE_PERM_STATUS` | 文件权限检测状态 | OK/WARN |
| `FILE_PERM_STATUS_LEVEL` | 文件权限检测状态等级 | 正常/警告 |
| `FILE_PERM_TOTAL_CHECKS` | 检查文件数 | 整数 |
| `FILE_PERM_WRONG_COUNT` | 权限异常数 | 整数 |
| `FILE_PERM_WRONG_LIST` | 权限异常明细 | JSON 数组字符串 |

### 2.2 文件权限检查清单

#### 新平台（new）

| 路径 | 期望权限 | 说明 |
|------|---------|------|
| `/data/services/api/start.sh` | 可执行(755) | API 总启动脚本 |
| `/data/services/api/auth/*/run.sh` | 可执行(755) | SSO 服务启动脚本 |
| `/data/services/api/java-meeting/*/run.sh` | 可执行(755) | 会议服务启动脚本 |
| `/data/services/api/python-cmdb/*.sh` | 可执行(755) | 运维后端脚本 |
| `/data/services/api/python-voice/*.sh` | 可执行(755) | 语音服务脚本 |
| `/data/services/scripts/*.sh` | 可执行(755) | 服务脚本目录 |
| `/data/third_party/paperless/run.sh` | 可执行(755) | 无纸化启动脚本 |
| `/data/third_party/paperless/start.sh` | 可执行(755) | 无纸化启动脚本 |
| `/data/third_party/wifi-local/startDB.sh` | 可执行(755) | WiFi 数据库启动脚本 |
| `/etc/rc.d/rc.local` | 可执行(755) | 开机自启脚本 |
| `/data/middleware/redis/redis.conf` | 644 | Redis 配置文件 |
| `/data/middleware/mysql/conf/my.cnf` | 644 | MySQL 配置文件 |

#### 传统平台（old）

| 路径 | 期望权限 | 说明 |
|------|---------|------|
| `/var/www/java/start.sh` | 可执行(755) | Java 启动脚本（meeting） |
| `/var/www/java/unifiedPlatform/start.sh` | 可执行(755) | 统一平台启动脚本（unified） |
| `/var/www/java/*/run.sh` | 可执行(755) | 服务启动脚本 |
| `/var/www/html/start.sh` | 可执行(755) | upython 启动脚本 |
| `/var/www/paperless/run.sh` | 可执行(755) | 无纸化启动脚本 |
| `/var/www/paperless/start.sh` | 可执行(755) | 无纸化启动脚本 |
| `/var/www/wifi-local/startDB.sh` | 可执行(755) | WiFi 数据库启动脚本 |
| `/etc/rc.d/rc.local` | 可执行(755) | 开机自启脚本 |
| `/var/www/redis/redis-*.conf` | 644 | Redis 配置文件 |
| `/usr/local/docker/mysql/my.cnf` | 644 | MySQL 配置文件 |

### 2.3 检测逻辑

```bash
# 对每个目标路径检查权限
for path in "${CHECK_PATHS[@]}"; do
    # 通配符展开
    for file in $path; do
        [ ! -e "$file" ] && continue
        
        local perm
        perm=$(stat -c '%a' "$file" 2>/dev/null)
        
        # .sh 文件期望可执行（含 x 权限）
        if [[ "$file" == *.sh || "$file" == *rc.local ]]; then
            if [ $((perm & 0111)) -eq 0 ]; then
                # 不可执行
                wrong_list+=(...)
            fi
        # 配置文件期望 644（不可执行）
        else
            if [ $((perm & 0111)) -ne 0 ]; then
                # 可执行（过宽）
                wrong_list+=(...)
            fi
        fi
    done
done
```

### 2.4 依赖

- 命令：`stat`、`find`
- 无需凭据
- 需要先运行 `50_system_profile.sh` 获取平台类型

---

## 3. 模块二：定时任务预期检测（55_cron_expected.sh）

### 3.1 检测项列表

| KEY | 中文名 | 说明 |
|-----|--------|------|
| `CRON_EXPECTED_STATUS` | 定时任务预期检测状态 | OK/WARN |
| `CRON_EXPECTED_STATUS_LEVEL` | 定时任务预期检测状态等级 | 正常/警告 |
| `CRON_EXPECTED_TOTAL` | 预期任务数 | 整数 |
| `CRON_EXPECTED_MISS_COUNT` | 缺失任务数 | 整数 |
| `CRON_EXPECTED_MISS_LIST` | 缺失任务列表 | JSON 数组字符串 |

### 3.2 预期 crontab 条目

| 条目 | 适用平台 | 说明 |
|------|---------|------|
| `bash /usr/local/docker/UbainsmysqlBakUp.sh` | 通用 | MySQL 每日自动备份 |
| `/data/services/scripts/ujava2-startup.sh` | 新平台 | ujava2 每3分钟守护启动 |

### 3.3 检测逻辑

```bash
# 获取当前 crontab
current_crontab=$(crontab -l 2>/dev/null)

# 逐条检查预期任务是否存在
for expected in "${EXPECTED_ENTRIES[@]}"; do
    if ! echo "$current_crontab" | grep -qF "$expected"; then
        miss_list+=("$expected")
    fi
done
```

### 3.4 依赖

- 命令：`crontab`、`grep`
- 无需凭据
- 需要先运行 `50_system_profile.sh` 获取平台类型
- 只检测不修改

---

## 4. 技术方案

### 4.1 模块注册

```python
CheckModule("54_file_permission_check", "文件权限检测", "system",
            {SUITE_FULL}, "54_file_permission_check.sh"),
CheckModule("55_cron_expected", "定时任务预期检测", "system",
            {SUITE_FULL}, "55_cron_expected.sh"),
```

### 4.2 显示名映射

新增约 12 个 KEY 映射：
- 文件权限检测：5 个
- 定时任务预期检测：5 个

### 4.3 配置模板

在 `config.sh.template` 新增：
- 预期 crontab 条目列表

---

## 5. 验收标准

| 标准 | 验证方法 |
|------|---------|
| 2 个检测脚本创建 | 语法检查 `bash -n` 通过 |
| check_modules.py 注册 | `get_suite('full')` 包含新模块 |
| display_names.py 映射 | 新 KEY 有中文名 |
| 单元测试通过 | pytest 全绿 |
| 已有测试不受影响 | 218 个测试全绿 |

---

## 6. 风险评估

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 部分路径不存在 | 检测项跳过 | 存在性检查，graceful 降级 |
| stat 命令参数差异 | 权限获取失败 | 兼容 GNU 和 BSD stat |
| crontab 为空 | 全部标记缺失 | 区分"无 crontab"和"缺失条目" |
