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

feat(dns): 添加DNS解析检测与自动修复功能

- 实现DNS配置检测逻辑,检查DNS服务器配置状态
- 添加DNS解析功能测试,验证域名解析成功率
- 增加网络连通性测试,验证DNS解析IP的可达性
- 实现检测到DNS异常时自动触发远程修复机制
- 添加修复后复检功能,确认DNS解析恢复正常
- 更新PRD文档说明DNS修复功能实现情况
- 优化issue_handler.sh支持非交互模式DNS修复
上级 5a263dd8
......@@ -1632,8 +1632,21 @@ fix_dns_config() {
log_info " nameserver $dns"
done
if confirm_action "是否添加推荐的DNS服务器配置?"; then
log_info "用户确认添加DNS服务器配置"
# === 调整点 1:非交互模式自动同意 ===
local do_add_dns=false
if [ "$NON_INTERACTIVE" = "1" ] && [ "$ASSUME_YES" = "1" ]; then
log_info "非交互模式,自动添加推荐的DNS服务器配置"
do_add_dns=true
else
if confirm_action "是否添加推荐的DNS服务器配置?"; then
log_info "用户确认添加DNS服务器配置"
do_add_dns=true
else
log_info "用户取消添加DNS服务器配置"
fi
fi
if [ "$do_add_dns" = true ]; then
local added_servers=0
# 备份原配置文件
......@@ -1669,13 +1682,18 @@ fix_dns_config() {
if [ "$verify_success" = true ]; then
log_info "DNS服务器配置已成功写入 $config_file"
# 根据网络管理器类型决定是否重启网络服务
# === 调整点 2:重启网络服务时也支持非交互 ===
local restart_network=false
if [ "$network_manager" != "none" ]; then
if confirm_action "是否重启网络服务以应用DNS配置?"; then
if [ "$NON_INTERACTIVE" = "1" ] && [ "$ASSUME_YES" = "1" ]; then
log_info "非交互模式,自动重启网络服务以应用DNS配置"
restart_network=true
else
log_info "用户选择不重启网络服务,DNS配置将在下次网络服务重启时生效"
if confirm_action "是否重启网络服务以应用DNS配置?"; then
restart_network=true
else
log_info "用户选择不重启网络服务,DNS配置将在下次网络服务重启时生效"
fi
fi
else
log_info "未检测到标准网络管理器,无法自动重启网络服务"
......@@ -1723,8 +1741,6 @@ fix_dns_config() {
else
log_info "没有添加新的DNS服务器"
fi
else
log_info "用户取消添加DNS服务器配置"
fi
else
log_info "DNS配置已符合要求"
......
......@@ -90,7 +90,7 @@
tcp6 0 0 :::11211 :::* LISTEN 105/memcached
##### 5、DNS解析问题(✅ 已实现):
检测目标服务器的DNS配置,能否正常进行解析等相关操作
检测目标服务器的DNS配置,能否正常进行解析等相关操作,解析异常则进行远程修复操作,参考NTP远程修复,不需要判断传统或是新统一平台。
##### 6、服务器资源分析(✅ 已实现):
检查目标服务器的磁盘空间情况、内存使用情况、cpu使用情况、防火墙开放端口情况、服务器架构以及操作系统记录
......
......@@ -890,8 +890,8 @@ function Test-DNSResolution {
if ($dnsServers.Count -gt 0) {
Write-Log -Level "SUCCESS" -Message " 检测到 DNS 服务器: $($dnsServers -join ', ')"
$results += @{
Check = "DNS配置"
Status = "正常"
Check = "DNS配置"
Status = "正常"
Details = "DNS服务器: $($dnsServers -join ', ')"
Success = $true
}
......@@ -899,8 +899,8 @@ function Test-DNSResolution {
else {
Write-Log -Level "WARN" -Message " 未检测到 DNS 服务器配置"
$results += @{
Check = "DNS配置"
Status = "异常"
Check = "DNS配置"
Status = "异常"
Details = "未找到DNS服务器配置"
Success = $false
}
......@@ -909,8 +909,8 @@ function Test-DNSResolution {
else {
Write-Log -Level "WARN" -Message " 无法读取 DNS 配置文件"
$results += @{
Check = "DNS配置"
Status = "异常"
Check = "DNS配置"
Status = "异常"
Details = "无法读取 /etc/resolv.conf"
Success = $false
}
......@@ -919,10 +919,10 @@ function Test-DNSResolution {
# 2. 测试 DNS 解析功能
Write-Log -Level "INFO" -Message "测试 DNS 解析功能..."
$dnsTestSuccess = 0
$dnsTestTotal = $DNSTestDomains.Count
$dnsTestTotal = $DNSTestDomains.Count
foreach ($domain in $DNSTestDomains) {
$testCmd = "nslookup $domain 2>&1 | head -n 5 | grep -E 'Name:|Address:' | head -n 2"
$testCmd = "nslookup $domain 2>&1 | head -n 5 | grep -E 'Name:|Address:' | head -n 2"
$testResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $testCmd
if ($testResult.ExitCode -eq 0 -and $testResult.Output -match 'Name:|Address:') {
......@@ -931,7 +931,7 @@ function Test-DNSResolution {
}
else {
# 尝试使用 host 命令
$testCmd2 = "host $domain 2>&1 | head -n 1"
$testCmd2 = "host $domain 2>&1 | head -n 1"
$testResult2 = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $testCmd2
if ($testResult2.ExitCode -eq 0 -and $testResult2.Output -match 'has address|has IPv4') {
......@@ -945,26 +945,26 @@ function Test-DNSResolution {
}
$dnsTestStatus = if ($dnsTestSuccess -eq $dnsTestTotal) { "正常" } elseif ($dnsTestSuccess -gt 0) { "部分正常" } else { "异常" }
$dnsTestColor = if ($dnsTestSuccess -eq $dnsTestTotal) { "SUCCESS" } elseif ($dnsTestSuccess -gt 0) { "WARN" } else { "ERROR" }
$dnsTestColor = if ($dnsTestSuccess -eq $dnsTestTotal) { "SUCCESS" } elseif ($dnsTestSuccess -gt 0) { "WARN" } else { "ERROR" }
Write-Log -Level $dnsTestColor -Message " DNS 解析测试结果: $dnsTestSuccess/$dnsTestTotal 成功"
$results += @{
Check = "DNS解析"
Status = $dnsTestStatus
Details = "测试域名解析: $dnsTestSuccess/$dnsTestTotal 成功"
Success = ($dnsTestSuccess -gt 0)
Check = "DNS解析"
Status = $dnsTestStatus
Details = "测试域名解析: $dnsTestSuccess/$dnsTestTotal 成功"
Success = ($dnsTestSuccess -gt 0)
SuccessCount = $dnsTestSuccess
TotalCount = $dnsTestTotal
TotalCount = $dnsTestTotal
}
# 3. 测试 ping 连通性(可选,验证DNS解析的IP是否可达)
Write-Log -Level "INFO" -Message "测试网络连通性..."
$pingSuccess = 0
$pingTotal = 0
$pingTotal = 0
foreach ($domain in $DNSTestDomains) {
$pingCmd = "ping -c 2 -W 2 $domain 2>&1 | grep -E 'packets transmitted|0% packet loss' | head -n 1"
$pingCmd = "ping -c 2 -W 2 $domain 2>&1 | grep -E 'packets transmitted|0% packet loss' | head -n 1"
$pingResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $pingCmd
$pingTotal++
......@@ -979,20 +979,89 @@ function Test-DNSResolution {
if ($pingTotal -gt 0) {
$pingStatus = if ($pingSuccess -eq $pingTotal) { "正常" } elseif ($pingSuccess -gt 0) { "部分正常" } else { "异常" }
$pingColor = if ($pingSuccess -eq $pingTotal) { "SUCCESS" } elseif ($pingSuccess -gt 0) { "WARN" } else { "ERROR" }
$pingColor = if ($pingSuccess -eq $pingTotal) { "SUCCESS" } elseif ($pingSuccess -gt 0) { "WARN" } else { "ERROR" }
Write-Log -Level $pingColor -Message " 网络连通性测试结果: $pingSuccess/$pingTotal 成功"
$results += @{
Check = "网络连通性"
Status = $pingStatus
Details = "Ping测试: $pingSuccess/$pingTotal 成功"
Success = ($pingSuccess -gt 0)
Check = "网络连通性"
Status = $pingStatus
Details = "Ping测试: $pingSuccess/$pingTotal 成功"
Success = ($pingSuccess -gt 0)
SuccessCount = $pingSuccess
TotalCount = $pingTotal
TotalCount = $pingTotal
}
}
# 4. 如有 DNS 解析异常,则触发远程修复(参考 NTP,平台固定 auto)
$needRepair = $false
foreach ($item in $results) {
if ($item.Check -eq 'DNS配置' -and -not $item.Success) { $needRepair = $true; break }
if ($item.Check -eq 'DNS解析' -and -not $item.Success) { $needRepair = $true; break }
}
if ($needRepair) {
Write-Log -Level "WARN" -Message "[DNS] 检测到 DNS 解析异常,准备执行远程修复 (fix_dns_config)"
try {
$serverForRepair = @{ IP = $Server.IP; User = $Server.User; Pass = $Server.Pass; Port = $Server.Port }
$repairRes = Upload_the_repair_script -Server $serverForRepair -Action "fix_dns_config" -Platform "auto" -RemoteDir "/home/repair_scripts"
# 在结果集中追加一条“修复记录”,方便报告展示
$repairItem = [ordered]@{
Check = "DNS修复"
Status = "未执行"
Details = ""
Success = $false
}
if ($repairRes -and $repairRes['Success']) {
Write-Log -Level "SUCCESS" -Message "[DNS] 远程 DNS 修复已执行成功 (fix_dns_config)"
$repairItem.Status = "已执行"
$repairItem.Details = "远程脚本执行成功 (fix_dns_config)"
$repairItem.Success = $true
# 简单复检:尝试解析一个域名
Write-Log -Level "INFO" -Message "[DNS] 修复后复检 DNS 解析..."
$postCmd = "nslookup www.baidu.com 2>&1 | head -n 5 | grep -E 'Name:|Address:' | head -n 2"
$postResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $postCmd
if ($postResult.ExitCode -eq 0 -and $postResult.Output -match 'Name:|Address:') {
Write-Log -Level "SUCCESS" -Message "[DNS] 复检成功,DNS 解析已恢复正常 (www.baidu.com)"
$repairItem.Details += " | 复检成功 (www.baidu.com)"
}
else {
Write-Log -Level "WARN" -Message "[DNS] 复检仍失败,请人工进一步排查"
$repairItem.Status = "部分成功"
$repairItem.Details += " | 复检仍失败,请人工排查"
}
}
else {
$errMsg = "未知错误"
if ($repairRes -is [hashtable]) {
if ($repairRes.ContainsKey('Error') -and $repairRes['Error']) { $errMsg = [string]::Join(' ', $repairRes['Error']) }
elseif ($repairRes.ContainsKey('Output') -and $repairRes['Output']) { $errMsg = [string]::Join(' ', $repairRes['Output']) }
elseif ($repairRes.ContainsKey('Message') -and $repairRes['Message']) { $errMsg = $repairRes['Message'] }
} elseif ($repairRes) {
$errMsg = $repairRes.ToString()
}
Write-Log -Level "ERROR" -Message "[DNS] 远程 DNS 修复执行失败: $errMsg"
$repairItem.Status = "失败"
$repairItem.Details = "远程修复失败: $errMsg"
}
$results += $repairItem
}
catch {
Write-Log -Level "ERROR" -Message "[DNS] 调用 Upload_the_repair_script 异常: $($_.Exception.Message)"
$results += @{
Check = "DNS修复"
Status = "异常"
Details = "调用修复脚本异常: $($_.Exception.Message)"
Success = $false
}
}
}
return $results
}
......@@ -2812,8 +2881,17 @@ function Upload_the_repair_script {
# 对外服务修复同样走非交互 + 默认 yes
$extraArgs = "--non-interactive --yes"
}
elseif ($Action -eq "fix_dns_config") {
# DNS 修复同样走非交互模式
$extraArgs = "--non-interactive --yes"
}
$execCmd = @(
"set -e",
"cd '$RemoteDir'",
"./issue_handler.sh --action $Action $platArg $extraArgs"
) -join " && "
$execCmd = @("set -e","cd '$RemoteDir'","./issue_handler.sh --action $Action $platArg $extraArgs") -join " && "
Write-Log -Level "INFO" -Message "开始执行远端修复: $execCmd"
$execRes = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $execCmd
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论