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

fix(server): 优化服务器健康检查脚本中的内存检测和IP地址检测

- 修复内存检测命令,使用LC_ALL=C环境变量和CSV输出格式避免本地化问题
- 添加内存检测失败时的备用方案,通过/proc/meminfo计算内存使用情况
- 改进IP地址检测逻辑,添加服务器IP到允许列表中
- 优化grep命令添加2>/dev/null重定向和sort -u去重
- 简化IP检测输出,只显示未授权IP地址,合法IP不再打印
- 修复路径中的中文字符,将/data/第三方/wifi-local改为/data/third_party/wifi-local
- 更新需求文档中的IP检测说明,明确合法地址可不打印
上级 7c5eff59
......@@ -153,7 +153,7 @@
中间件配置文件检测:
1、检测/data/middleware/nginx/config目录下的conf格式文件中的IP地址
注意:如果遇到有172.17.0.1、127.0.0.1的IP地址以及和目标服务器IP地址一致的需判断为正确!检测日志需要打印出配置文件的路径,不要进行修改IP的操作!将单个配置文件内的IP地址检测收集结果后再标注打印,并增加配置项地址。日志需要更简洁明了!
注意:如果遇到有172.17.0.1、127.0.0.1的IP地址以及和目标服务器IP地址一致的需判断为正确!检测日志需要打印出配置文件的路径,不要进行修改IP的操作!将单个配置文件内的IP地址检测收集结果后再标注打印,并增加配置项地址。日志需要更简洁明了!合法地址可以不打印出来。
##### 9、服务器NTP服务检测(✅ 已实现):
检测目标服务器上的ntp服务是否开启并能够正确进行同步时间操作,ntp服务应该分为:ntp和chronyd两种,并且需要检测目标服务器时间和北京时间是否一致。
......@@ -244,5 +244,5 @@
- 目标服务器是会议预定系统,那么需检测22、443、1883和8306是否开启,未开启就是异常,需要执行修复脚本;
- 目标服务器是运维集控系统,那么需检测22、8443、1883和8306是否开启,未开启就是异常,需要执行修复脚本;
##### 服务自检报告输出(✅ 已实现):
##### 15、服务自检报告输出(✅ 已实现):
将服务自检的所有操作步骤与结果输出到日志文件中!自检报告需要补充成md格式!检测报告输出需要带有明显图标,标识错误或正常状态
\ No newline at end of file
......@@ -1111,32 +1111,59 @@ function Test-ServerResources {
# 4. 检测内存使用情况
Write-Log -Level "INFO" -Message "检测内存使用情况..."
$memCmd = 'free -m | grep Mem | awk ''{printf "%.1f %.1f %.1f", $2/1024, $3/1024, ($3/$2)*100}'''
# 强制使用 C 语言环境,输出 CSV,避免本地化小数点和杂质
$memCmd = "LC_ALL=C free -m | awk -v OFS=',' '/^Mem:/ { printf ""%.1f,%.1f,%.1f"", `$2/1024, `$3/1024, (`$3/`$2)*100 }'"
$memResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $memCmd
$memTotal = 0
$memUsed = 0
$memPercent = 0
$memTotal = 0.0
$memUsed = 0.0
$memPercent = 0.0
if ($memResult.ExitCode -eq 0 -and $memResult.Output) {
$memParts = ($memResult.Output -split "`n" | Where-Object { $_ -match '\S' } | Select-Object -First 1) -split '\s+'
if ($memParts.Count -ge 3) {
try {
$memTotal = [math]::Round([double]$memParts[0], 1)
$memUsed = [math]::Round([double]$memParts[1], 1)
$memPercent = [math]::Round([double]$memParts[2], 1)
}
catch {
$memTotal = 0
$memUsed = 0
$memPercent = 0
$line = ($memResult.Output -split "`n" | Where-Object { $_ -match '\S' } | Select-Object -First 1)
if ($line) {
$parts = ($line.Trim() -replace "`r","") -split ','
if ($parts.Count -ge 3) {
try {
$ci = [System.Globalization.CultureInfo]::InvariantCulture
$memTotal = [double]::Parse($parts[0], $ci)
$memUsed = [double]::Parse($parts[1], $ci)
$memPercent = [double]::Parse($parts[2], $ci)
} catch {
# Fallback: 读取 /proc/meminfo 计算
$fallbackCmd = @"
awk -v OFS=',' '
BEGIN { t=0; u=0 }
/^MemTotal:/ { t=`$2 }
/^MemAvailable:/ { a=`$2 }
END {
if (t>0) {
u=t-a;
printf "%.1f,%.1f,%.1f", t/1024/1024, u/1024/1024, (u/t)*100
}
}' /proc/meminfo
"@
$fbRes = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $fallbackCmd
if ($fbRes.ExitCode -eq 0 -and $fbRes.Output) {
$fbLine = ($fbRes.Output -split "`n" | Where-Object { $_ -match '\S' } | Select-Object -First 1)
if ($fbLine) {
$fbParts = ($fbLine.Trim() -replace "`r","") -split ','
if ($fbParts.Count -ge 3) {
$ci = [System.Globalization.CultureInfo]::InvariantCulture
$memTotal = [double]::Parse($fbParts[0], $ci)
$memUsed = [double]::Parse($fbParts[1], $ci)
$memPercent = [double]::Parse($fbParts[2], $ci)
}
}
}
}
}
}
}
$memStatus = if ($memPercent -lt 70) { "正常" } elseif ($memPercent -lt 90) { "警告" } else { "危险" }
$memColor = if ($memPercent -lt 70) { "SUCCESS" } elseif ($memPercent -lt 90) { "WARN" } else { "ERROR" }
Write-Log -Level $memColor -Message " 内存使用: ${memUsed}GB / ${memTotal}GB (${memPercent}%) [$memStatus]"
$results.Memory = @{
Total = $memTotal
......@@ -2145,7 +2172,6 @@ function Check-TraditionalPlatformIPs {
Write-Host "开始检测传统平台配置文件中的IP地址..." -ForegroundColor Yellow
# 定义需要检测的文件路径
$Paths = @(
"/var/www/java/api-java-meeting2.0/config",
"/var/www/java/external-meeting-api/config",
......@@ -2155,30 +2181,29 @@ function Check-TraditionalPlatformIPs {
"/var/www/java/ubains-web-h5/static/h5/config.json",
"/var/www/java/nginx-conf.d"
)
$AllowedIPs = @("172.17.0.1", "127.0.0.1", $ServerIP)
# 定义允许的IP地址
$AllowedIPs = @("172.17.0.1", "127.0.0.1")
$hasUnauthorized = $false
foreach ($Path in $Paths) {
Write-Host "检测路径: $Path" -ForegroundColor Cyan
# 使用 plink 检测文件内容
$Command = "grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' $Path/*"
$Command = "grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' $Path/* 2>/dev/null | sort -u"
$Result = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Command $Command
if ($Result) {
foreach ($IP in $Result) {
if ($Result -and $Result.ExitCode -eq 0 -and $Result.Output) {
$IPs = $Result.Output -split "`n" | Where-Object { $_ -match '^\d{1,3}(\.\d{1,3}){3}$' }
foreach ($IP in $IPs) {
if ($AllowedIPs -notcontains $IP) {
Write-Warning "检测到未授权的IP地址: $IP 在路径: $Path"
} else {
Write-Host "IP地址 $IP 在路径 $Path 是合法的" -ForegroundColor Green
$hasUnauthorized = $true
Write-Warning "未授权IP: $IP (路径: $Path)"
}
}
} else {
Write-Warning "未找到任何IP地址或路径不存在: $Path"
Write-Host "无IP或路径不存在: $Path" -ForegroundColor Yellow
}
}
if (-not $hasUnauthorized) {
Write-Host "配置文件IP均为目标服务器IP/本地环回/默认网桥IP" -ForegroundColor Green
}
Write-Host "传统平台配置文件IP检测完成." -ForegroundColor Green
}
......@@ -2194,7 +2219,6 @@ function Check-NewPlatformIPs {
Write-Host "开始检测新统一平台配置文件中的IP地址..." -ForegroundColor Yellow
# 定义需要检测的文件路径
$Directories = @(
"/data/services/api/auth/auth-sso-auth/config",
"/data/services/api/auth/auth-sso-gatway/config",
......@@ -2219,53 +2243,38 @@ function Check-NewPlatformIPs {
"/data/middleware/nginx/config"
)
# 定义允许的IP地址
$AllowedIPs = @("172.17.0.1", "127.0.0.1", $ServerIP)
$hasUnauthorized = $false
foreach ($Directory in $Directories) {
$Command = "find $Directory -type f \( -name '*.yml' -o -name '*.properties' -o -name 'config.js' -o -name 'config.json' -o -name 'unified*.conf' \)"
$Command = "find $Directory -type f \( -name '*.yml' -o -name '*.properties' -o -name 'config.js' -o -name 'config.json' -o -name 'unified*.conf' \) 2>/dev/null"
$Result = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Command $Command
if ($Result.ExitCode -eq 0) {
if ($Result.ExitCode -eq 0 -and $Result.Output) {
$Files = $Result.Output -split "`n" | Where-Object { $_ -ne "" }
foreach ($File in $Files) {
Write-Host "检测文件: $File" -ForegroundColor Cyan
# 检测文件中的IP地址
$GrepCommand = "grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' $File"
$GrepCommand = "grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' $File 2>/dev/null | sort -u"
$IPResult = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Command $GrepCommand
if ($IPResult.ExitCode -eq 0) {
if ($IPResult.ExitCode -eq 0 -and $IPResult.Output) {
$IPs = $IPResult.Output -split "`n" | Where-Object { $_ -ne "" }
$UnauthorizedIPs = @()
$AuthorizedIPs = @()
foreach ($IP in $IPs) {
if ($AllowedIPs -notcontains $IP) {
$UnauthorizedIPs += $IP
} else {
$AuthorizedIPs += $IP
}
}
foreach ($IP in $IPs) { if ($AllowedIPs -notcontains $IP) { $UnauthorizedIPs += $IP } }
if ($UnauthorizedIPs.Count -gt 0) {
Write-Warning "文件: $File 检测到未授权的IP地址: $($UnauthorizedIPs -join ", ")"
$hasUnauthorized = $true
Write-Warning "文件: $File 未授权IP: $($UnauthorizedIPs -join ', ')"
}
if ($AuthorizedIPs.Count -gt 0) {
Write-Host "文件: $File 合法的IP地址: $($AuthorizedIPs -join ", ")" -ForegroundColor Green
}
} else {
Write-Warning "未找到任何IP地址: $File"
# 合法IP不打印
}
}
} else {
Write-Warning "未找到任何匹配的配置文件: $Directory"
Write-Host "未找到配置文件: $Directory" -ForegroundColor Yellow
}
}
if (-not $hasUnauthorized) {
Write-Host "配置文件IP均为目标服务器IP/本地环回/默认网桥IP" -ForegroundColor Green
}
Write-Host "新统一平台配置文件IP检测完成." -ForegroundColor Green
}
......@@ -2432,7 +2441,7 @@ function Check-FilePermissions {
"/data/third_party/paperless/run.sh",
"/data/third_party/paperless/start.sh",
"/data/third_party/wifi-local/config.ini",
"/data/第三方/wifi-local/startDB.sh",
"/data/third_party/wifi-local/startDB.sh",
"/data/third_party/wifi-local/wifi*",
"/etc/rc.d/rc.local",
"/data/middleware/nginx/config/*.conf",
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论