提交 0b8403ea authored 作者: 陈泽健's avatar 陈泽健

feat(service-inspection): 优化服务自检功能增加配置文件与日志导出

- 替换原有的日志导出功能为配置文件与日志文件导出功能
- 添加新统一平台和传统平台的前后端、中间件、第三方服务配置文件导出
- 实现按服务名称分类存储配置文件和日志文件到临时目录
- 添加压缩打包功能,生成服务器IP_时间戳.tar.gz格式的归档文件
- 更新交互提示文本从"导出服务日志"改为"导出配置文件与日志文件"
- 创建新的需求文档说明ERP对接优化和配置文件导出功能要求
上级 9f0ba57b
{
"containers": "NAMES STATUS IMAGE\ncardtable Up 48 minutes uos-cardtable:v1\npaperless Up 49 minutes paperless:v1\nupython_voice Up 49 minutes 139.9.60.86:5000/upython:v13\nupython Up 52 minutes 139.9.60.86:5000/upython:v16\nujava2 Up 56 minutes 139.9.60.86:5000/ujava:v7\nunginx Up About an hour nginx:1.30.2\nungrok Up About an hour ngrok:v1\nustorage Up About an hour ufastdfs:v2\nutracker Up About an hour ufastdfs:v2\nunacos Up About an hour nacos-server:v2.5.2\nuemqx Up 3 minutes emqx/emqx:6.0.0\nuredis Up About an hour redis:8\numysql Up About an hour mysql:8.0\n",
"container_detail": "cardtable: Up 48 minutes\npaperless: Up 49 minutes\nupython_voice: Up 49 minutes\nupython: Up 52 minutes\nujava2: Up 56 minutes\nunginx: Up About an hour\nungrok: Up About an hour\nustorage: Up About an hour\nutracker: Up About an hour\nunacos: Up About an hour\nuemqx: Up 3 minutes\nuredis: Up About an hour\numysql: Up About an hour\n",
"disk": "文件系统 容量 已用 可用 已用% 挂载点\n/dev/mapper/klas-data 81G 67G 15G 83% /data\n",
"sec_headers": "X-Frame-Options: SAMEORIGIN\r\nX-Content-Type-Options: nosniff\r\nX-XSS-Protection: 1; mode=block\r\nStrict-Transport-Security: max-age=31536000; includeSubDomains\r\n",
"log_errors": {
"预定对外服务": 40,
"预定对内服务": 14,
"运维服务": 16,
"讯飞服务": 0
}
}
\ No newline at end of file
[
{
"类别": "SSH配置",
"漏洞": "允许Root直接登录",
"等级": "中",
"描述": "PermitRootLogin设置为yes,建议设置为no或prohibit-password"
},
{
"类别": "SSH配置",
"漏洞": "允许密码登录",
"等级": "中",
"描述": "建议使用密钥认证替代密码认证"
},
{
"类别": "文件权限",
"漏洞": "/etc/shadow权限为0",
"等级": "中",
"描述": "建议设置为640或600"
},
{
"类别": "Nginx配置",
"漏洞": "缺少X-Frame-Options头",
"等级": "低",
"描述": "建议添加X-Frame-Options: DENY或SAMEORIGIN防止点击劫持"
},
{
"类别": "Nginx配置",
"漏洞": "缺少X-Content-Type-Options头",
"等级": "低",
"描述": "建议添加X-Content-Type-Options: nosniff防止MIME类型嗅探"
},
{
"类别": "Nginx配置",
"漏洞": "缺少HSTS头",
"等级": "低",
"描述": "建议添加Strict-Transport-Security强制HTTPS"
},
{
"类别": "Nginx配置",
"漏洞": "缺少X-XSS-Protection头",
"等级": "低",
"描述": "建议添加X-XSS-Protection: 1; mode=block"
}
]
\ No newline at end of file
...@@ -358,7 +358,7 @@ $ExpectedFunctions = @( ...@@ -358,7 +358,7 @@ $ExpectedFunctions = @(
"Test-TraditionalPlatformConsole", "Test-TraditionalPlatformConsole",
"Test-NTPService", "Test-NTPService",
"Test-AndroidDeviceHealth", "Test-AndroidDeviceHealth",
"Export-ServiceLogs", "Export-ConfigAndLogs",
"Show-HealthReport" "Show-HealthReport"
) )
...@@ -2693,17 +2693,17 @@ function Main { ...@@ -2693,17 +2693,17 @@ function Main {
Write-Log -Level "INFO" -Message "跳过现场数据备份 (已禁用)" Write-Log -Level "INFO" -Message "跳过现场数据备份 (已禁用)"
# } # }
# 询问是否导出日志 # 询问是否导出配置文件与日志
Write-Host "" Write-Host ""
Write-Host "==================================================================" -ForegroundColor Cyan Write-Host "==================================================================" -ForegroundColor Cyan
$exportChoice = Read-Host "是否导出服务日志到本地? (y/n) [默认: n]" $exportChoice = Read-Host "是否导出配置文件与日志文件? (y/n) [默认: n]"
$logExportResults = $null $logExportResults = $null
if ($exportChoice -eq "y" -or $exportChoice -eq "Y") { if ($exportChoice -eq "y" -or $exportChoice -eq "Y") {
$logExportResults = Export-ServiceLogs -Server $server -PlatformType $platformType -SystemInfo $systemInfo $logExportResults = Export-ConfigAndLogs -Server $server -PlatformType $platformType
} }
else { else {
Write-Log -Level "INFO" -Message "跳过日志导出" Write-Log -Level "INFO" -Message "跳过配置文件与日志导出"
} }
# 安卓设备自检(按 PRD 15:手动输入设备IP,连接+拉取日志) # 安卓设备自检(按 PRD 15:手动输入设备IP,连接+拉取日志)
......
...@@ -417,26 +417,63 @@ function Show-HealthReport { ...@@ -417,26 +417,63 @@ function Show-HealthReport {
elseif ($failedServices -gt 0) { Write-Host ""; Write-Host " 存在异常服务,请及时处理!" -ForegroundColor Red; $md += "- 结论: $overallIcon 存在异常服务,请及时处理!" } elseif ($failedServices -gt 0) { Write-Host ""; Write-Host " 存在异常服务,请及时处理!" -ForegroundColor Red; $md += "- 结论: $overallIcon 存在异常服务,请及时处理!" }
elseif ($totalServices -eq 0) { Write-Host ""; Write-Host " 未检测到任何服务" -ForegroundColor Yellow; $md += "- 结论: $overallIcon 未检测到任何服务" } elseif ($totalServices -eq 0) { Write-Host ""; Write-Host " 未检测到任何服务" -ForegroundColor Yellow; $md += "- 结论: $overallIcon 未检测到任何服务" }
# 日志导出 # 配置文件与日志导出
if ($LogExportResults) { if ($LogExportResults) {
Write-Host "【日志导出结果】" -ForegroundColor Yellow Write-Host "【配置文件与日志导出结果】" -ForegroundColor Yellow
$md += ""; $md += "## 服务日志导出" $md += ""; $md += "## 配置文件与日志导出"
if ($LogExportResults.Success -and $LogExportResults.ExportedFiles.Count -gt 0) {
if ($LogExportResults.Success) {
Write-Host " 导出状态: 成功" -ForegroundColor Green Write-Host " 导出状态: 成功" -ForegroundColor Green
Write-Host " 导出目录: $($LogExportResults.ExportDir)" -ForegroundColor Cyan
Write-Host " 成功导出 $($LogExportResults.ExportedFiles.Count) 个文件:" -ForegroundColor Green
$md += "- 导出状态: ✅ 成功" $md += "- 导出状态: ✅ 成功"
$md += "- 导出目录: $($LogExportResults.ExportDir)"
$md += "- 成功文件:"
foreach ($file in $LogExportResults.ExportedFiles) { $sizeKB = [math]::Round($file.Size / 1024, 2); Write-Host " - $($file.Name) ($sizeKB KB)" -ForegroundColor Gray; $md += " - $($file.Name) ($sizeKB KB)" }
} elseif ($LogExportResults.ExportedFiles.Count -eq 0 -and $LogExportResults.FailedFiles.Count -eq 0) {
Write-Host " 导出状态: 无需导出的日志文件" -ForegroundColor Yellow
$md += "- 导出状态: ℹ️ 无需导出的日志文件"
} else {
Write-Host " 导出状态: 部分失败" -ForegroundColor Yellow
$md += "- 导出状态: ⚠️ 部分失败"
if ($LogExportResults.FailedFiles.Count -gt 0) { $md += "- 失败文件:"; foreach ($file in $LogExportResults.FailedFiles) { $md += " - $($file.Name): $($file.Reason)" } }
} }
else {
Write-Host " 导出状态: 失败或无文件导出" -ForegroundColor Red
$md += "- 导出状态: ❌ 失败或无文件导出"
}
# 压缩包路径
if ($LogExportResults.ArchiveFile) {
Write-Host " 压缩包: $($LogExportResults.ArchiveFile)" -ForegroundColor Cyan
$md += "- 压缩包: $($LogExportResults.ArchiveFile)"
}
# 本地目录
if ($LogExportResults.ExportDir) {
Write-Host " 本地目录: $($LogExportResults.ExportDir)" -ForegroundColor Cyan
$md += "- 本地目录: $($LogExportResults.ExportDir)"
}
# 已导出服务
if ($LogExportResults.ExportedServices -and $LogExportResults.ExportedServices.Count -gt 0) {
Write-Host " 已导出服务 ($($LogExportResults.ExportedServices.Count) 个):" -ForegroundColor Green
$md += "- 已导出服务 ($($LogExportResults.ExportedServices.Count) 个):"
foreach ($svc in $LogExportResults.ExportedServices) {
$fileList = ($svc.Files -join ', ')
Write-Host " - $($svc.Name): $($svc.Files.Count) 项 ($fileList)" -ForegroundColor Gray
$md += " - $($svc.Name): $($svc.Files.Count) 项 ($fileList)"
}
}
# 跳过的服务
if ($LogExportResults.SkippedServices -and $LogExportResults.SkippedServices.Count -gt 0) {
Write-Host " 跳过的服务 ($($LogExportResults.SkippedServices.Count) 个):" -ForegroundColor Yellow
$md += "- 跳过的服务 ($($LogExportResults.SkippedServices.Count) 个):"
foreach ($svc in $LogExportResults.SkippedServices) {
Write-Host " - $($svc.Name): $($svc.Reason)" -ForegroundColor DarkGray
$md += " - $($svc.Name): $($svc.Reason)"
}
}
# 失败的服务
if ($LogExportResults.FailedServices -and $LogExportResults.FailedServices.Count -gt 0) {
Write-Host " 失败的服务 ($($LogExportResults.FailedServices.Count) 个):" -ForegroundColor Red
$md += "- 失败的服务 ($($LogExportResults.FailedServices.Count) 个):"
foreach ($svc in $LogExportResults.FailedServices) {
Write-Host " - $($svc.Name): $($svc.Reason)" -ForegroundColor DarkGray
$md += " - $($svc.Name): $($svc.Reason)"
}
}
Write-Host "" Write-Host ""
} }
......
# _PRD_服务自检配置文件与日志导出_需求文档.md
> 版本:
> 更新日期:
> 适用范围:服务自检脚本(Windows 远程版本 + Linux 本机版本)
> 实现脚本:
> - Windows 版:`AuxiliaryTool\ScriptTool\ServiceSelfInspection\check_server_health.ps1`
> - Linux 版:`AuxiliaryTool\ScriptTool\ServiceSelfInspection\check_server_health.sh`
> 测试环境:
- 桌面测试目录:[C:\Users\UBAINS\Desktop\Test-module]
- 测试服务器为:192.168.5.44 root Ubains@123
- 代码实现后需自行验证,输出验证结果。
---
## 1. 背景与目标
### 1.1 背景
- 会议预定系统和统一平台部署在 Linux 服务器上,核心服务运行在 Docker 容器中(ujava/upython/upython_voice)。为降低运维成本,需要实现服务健康检查工具,并自动修复常见问题。
### 1.2 目标
- 实现将对应平台上的所有配置文件与日志文件进行压缩导出。
### 1.3 双版本说明
| 版本 | 文件名 | 运行环境 | 版本号 | 说明 |
|------|--------|----------|--------|------|
| Windows 版 | check_server_health.ps1 | Windows 10+ | | 通过 SSH 远程连接 Linux 服务器进行检测 |
| Linux 版 | check_server_health.sh | Linux 服务器 | | 直接在服务器本机运行,无需 SSH 连接 |
**重要说明:**
- 两版本核心功能保持一致,后续功能优化需**同步更新**两个脚本
- 差异部分见下节"版本差异说明"
---
## 2 需求说明
- 新增一个交互步骤,用于导出配置文件与日志文件。
### 新统一平台
#### 前端服务目录:
- ai包:/data/services/web/pc/pc-vue2-ai
- static文件夹下的config.json
- 后台包:/data/services/web/pc/pc-vue2-backstage
- static文件夹下的config.json
- main包:/data/services/web/pc/pc-vue2-main
- static文件夹下的config.json
- meetingV2包:/data/services/web/pc/pc-vue2-meetingV2
- static文件夹下的config.json
- meetingV3包:/data/services/web/pc/pc-vue2-meetingV3
- static文件夹下的config.json
- meetingControl:/data/services/web/pc/pc-vue2-meetingControl
- static文件夹下的config.json
- moniter包:/data/services/web/pc/pc-vue2-moniter
- static文件夹下的config.json
- platform包:/data/services/web/pc/pc-vue2-platform
- static文件夹下的config.json
- voice包:/data/services/web/pc/pc-vue2-voice/pc-vue2-voice
- static文件夹下的config.json
- h5-meeting:/data/services/web/h5/h5-uniapp-meeting
- static文件夹下的config.json
- h5-moniter:/data/services/web/h5/h5-uniapp-moniter
- static文件夹下的config.json
- h5-platform-mobile:/data/services/web/h5/h5-uniapp-platform/meeting-mobile
- static文件夹下的config.json
- h5-platform-platform-mobile:/data/services/web/h5/h5-uniapp-platform/unified-platform-mobile
- static文件夹下的config.json
#### 后端服务目录:
- auth包:/data/services/api/auth/auth-sso-auth
- log.out
- config目录
- gatway包:/data/services/api/auth/auth-sso-gatway
- log.out
- config目录
- system包:/data/services/api/auth/auth-sso-system
- log.out
- config目录
- java2.0包:/data/services/api/java-meeting/java-meeting2.0
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- java-extapi包:/data/services/api/java-meeting/java-meeting-extapi
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- java-scheduling包:/data/services/api/java-meeting/java-message-scheduling
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- java-mqtt包:/data/services/api/java-meeting/java-mqtt
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- java-quartz包:/data/services/api/java-meeting/java-quartz
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- cmdb包:/data/services/api/python-cmdb
- log/uinfo.log、log/error.log和log/uwsgi.log
- setting.conf
- cmdb/bus/config/settingbus.conf
- voice包:/data/services/api/python-voice
- log/uinfo.log和log/uwsgi.log
- setting.conf
- uvoice/bus/config/settingbus.conf
#### 中间件服务目录:
- nginx服务:/data/middleware/nginx
- log目录
- config目录
- redis服务:/data/middleware/redis
- config目录
- log目录
- emqx服务:/data/middleware/emqx
- config目录
- log目录
- mysql服务:/data/middleware/mysql
- log目录
- conf目录
- nacos服务:/data/middleware/nacos
- conf目录
- logs/alipay-jraft.log、logs/cmdb-main.log、logs/config-dump.log、logs/config-fatal.log、logs/config-memory.log、logs/config-notify.log、logs/config-pull.log、logs/core-auth.log、logs/istio-main.log、logs/nacos.log、logs/nacos-persistence.log、logs/naming-distro.log、logs/naming-event.log、logs/naming-performance.log、logs/naming-push.log、logs/naming-raft.log、logs/naming-rt.log、logs/naming-server.log、logs/plugin-control.log、logs/plugin-control-tps.log、logs/protocol-distro.log、logs/protocol-raft.log、logs/remote-digest.log、logs/remote.log、logs/remote-push.log
#### 第三方服务目录:
- paperless服务:/data/third_party/paperless
- application.yml
- nohup.out
- wifi-local服务:/data/third_party/wifi-local
- nohup.out
- config.ini
### 传统平台
#### 前端服务目录:
- 预定前台前端:/var/www/java/ubains-web-2.0
- static文件夹下的config.json
- 预定后台前端:/var/www/java/ubains-web-admin
- static文件夹下的config.json
- 预定视讯前端:/var/www/java/ubains-video-web-3.0
- static文件夹下的config.json
- 预定H5前端:/var/www/java/ubains-web-h5
- static/h5文件夹下的config.json
- 运维前台前端:/var/www/html/web-vue-rms
- static文件夹下的config.json
- 运维H5前端:/var/www/html/web-vue-h5
- static文件夹下的config.json
#### 后端服务目录:
- 预定2.0后端:/var/www/java/api-java-meeting2.0
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- 预定对外后端:/var/www/java/external-meeting-api
- logs/ubains-INFO-AND-ERROR.log、logs/ubains-ERROR.log
- config目录
- 运维后端:/var/www/html
- setting.conf
- log/uinfo.log、log/error.log和log/uwsgi.log
#### 中间件服务目录:
- nginx服务:/var/www/java/nginx-conf.d
- meeting443.conf
- nginx_log目录
- redis服务:/var/www/redis
- *.conf
- data目录
- emqx服务:/var/www/emqx
- config目录
- log目录
- mysql服务:/usr/local/docker/mysql
- logs目录
- fdfs服务:/var/fdfs
- storage/logs目录
- tracker/logs目录
#### 第三方服务目录:
- paperless服务:/var/www/paperless
- application.yml
- nohup.out
- wifi-local服务:/var/www/wifi-local
- config.ini
- nohup.out
### 补充说明
- **替换说明**:本需求将**删除**旧的"是否导出服务日志到本地?"交互及 `Export-ServiceLogs` 功能,**替换**为新的"是否导出配置文件与日志文件?"交互,在同一位置。
- **路径说明**:所有后端服务列出的文件路径均为**相对于服务目录**的路径。例如 cmdb 的 `setting.conf` 实际路径为 `/data/services/api/python-cmdb/setting.conf``cmdb/bus/config/settingbus.conf` 实际路径为 `/data/services/api/python-cmdb/cmdb/bus/config/settingbus.conf`
- **传统平台运维后端**`/var/www/html` 仅导出 `setting.conf` 文件和 `log/` 目录,不导出整个 `/var/www/html` 目录。
- **不存在目录处理**:如果某个服务的目录在服务器上不存在,则跳过该服务并在报告中记录,不影响其他服务的导出。
- **文件大小限制**:不对导出文件做大小限制,全量导出。
### 操作流程
1. 删除旧的"是否导出服务日志到本地?"交互步骤,替换为新的"是否导出配置文件与日志文件?"交互步骤,输入y则进行导出操作,输入n则不进行导出操作。
2. 按照对应平台进行配置文件与日志文件导出操作
- 新统一平台
- 传统平台
3. 将相关服务的配置文件与日志文件,先拷贝至/tmp/config_and_log/目录下,并根据服务名称进行分类存放。
4. 将/tmp目录下的config_and_log目录进行压缩操作,压缩成tar.gz格式。命名规则:服务器IP_时间.tar.gz
5. 将tar.gz文件下载
- windows版本:下载到当前脚本所在目录的config_and_log目录下,并删除/tmp/config_and_log目录和/tmp下的压缩包。
- linux版本:下载到当前脚本所在目录的config_and_log目录下,并删除/tmp/config_and_log目录和/tmp下的压缩包。
6. 服务自检报告需要补充配置文件与日志文件导出的结果,及所在目录。
## 需求规范
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 报告生成优化需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/FunctionalTestReportGeneration]
## ERP对接文档
- 需求文档路径:[Docs/PRD/自动化生成功能测试报告/ERP对接PRD/PRD_测试列表_测试报告_例子说明.md]
## 功能需求
### 功能目标
**目标:** 对接获取人员列表接口以及调整上传文件接口的抄送人传参和创建人员传参。然后通过交互模式下输入的创建人姓名、抄送人姓名,最终通过接口传参实现。
### 需求描述
- 获取人员接口:
- 根据[Docs/PRD/自动化生成功能测试报告/ERP对接PRD/PRD_测试列表_测试报告_例子说明.md]第538–541实现获取人员列表。
- 上传文件接口调整:
- 根据[Docs/PRD/自动化生成功能测试报告/ERP对接PRD/PRD_测试列表_测试报告_例子说明.md]第182行。
- createuser_name通过交互模式,用户输入姓名。从获取人员列表中做提取ID。
- copyuserList通过交互模式,用户输入姓名,从获取人员列表中做提取ID,注意参数格式如下:
- "copyuserList": [1, 24, 31]
- 最终在上传文件接口中,将createuser_name、createuser_id、copyuserList作为参数传入。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论