hostSync/cmd/update.go

146 lines
4.1 KiB
Go

package cmd
import (
"os"
"github.com/evil7/hostsync/core"
"github.com/evil7/hostsync/utils"
"github.com/spf13/cobra"
)
var (
forceDNS string
forceDoH string
forceServer string
saveConfig bool
)
// updateCmd 更新命令
var updateCmd = &cobra.Command{
Use: "update [blockName]",
Short: "更新域名记录",
Long: `更新域名记录的IP地址。可以更新指定块或所有块。
支持强制使用指定的DNS服务器。
示例:
hostsync update # 更新所有块
hostsync update github # 更新指定块
hostsync update --dns 1.1.1.1 # 强制使用指定DNS更新
hostsync update --doh https://... # 强制使用DoH更新
hostsync update --srv Cloudflare # 强制使用预设服务器更新
hostsync update --save # 更新后保存DNS配置到块
hostsync update github --save # 更新指定块并保存DNS配置`,
Args: cobra.MaximumNArgs(1),
Run: runUpdate,
}
func init() {
updateCmd.Flags().StringVar(&forceDNS, "dns", "", "强制使用指定DNS服务器")
updateCmd.Flags().StringVar(&forceDoH, "doh", "", "强制使用DoH服务器")
updateCmd.Flags().StringVar(&forceServer, "srv", "", "强制使用预设服务器")
updateCmd.Flags().BoolVar(&saveConfig, "save", false, "保存DNS/DoH设置到块配置")
}
func runUpdate(cmd *cobra.Command, args []string) {
utils.CheckAdmin()
hm := core.NewHostsManager()
if err := hm.Load(); err != nil {
utils.LogError("加载hosts文件失败: %v", err)
os.Exit(1)
}
resolver := core.NewDNSResolver(debugMode)
if len(args) == 0 {
// 更新所有块
updateAllBlocks(hm, resolver)
} else {
// 更新指定块
blockName := args[0]
updateBlock(hm, resolver, blockName)
}
}
func updateAllBlocks(hm *core.HostsManager, resolver *core.DNSResolver) {
if len(hm.Blocks) == 0 {
utils.LogInfo("没有找到任何配置块")
return
}
utils.LogInfo("开始更新所有配置块 (%d 个)", len(hm.Blocks))
// 显示保存配置信息
if saveConfig && (forceDNS != "" || forceDoH != "" || forceServer != "") {
utils.LogInfo("将保存DNS配置到所有块设置中")
}
totalProcessed := 0
for name := range hm.Blocks {
utils.LogInfo("更新块: %s", name)
if err := resolver.UpdateBlock(hm, name, forceDNS, forceDoH, forceServer, saveConfig); err != nil {
utils.LogError("更新失败: %v", err)
} else {
totalProcessed++
}
}
if totalProcessed > 0 {
utils.LogSuccess("已处理 %d 个配置块", totalProcessed)
}
// 显示保存结果
if saveConfig && (forceDNS != "" || forceDoH != "" || forceServer != "") {
utils.LogSuccess("DNS配置已保存到所有块设置")
}
}
func updateBlock(hm *core.HostsManager, resolver *core.DNSResolver, blockName string) {
if !utils.ValidateBlockName(blockName) {
utils.LogError("无效的块名称: %s", blockName)
utils.LogInfo("块名称只能包含字母、数字、下划线和连字符")
os.Exit(1)
}
block := hm.GetBlock(blockName)
if block == nil {
utils.LogError("块不存在: %s", blockName)
os.Exit(1)
}
utils.LogInfo("开始更新块: %s", blockName)
// 显示DNS配置信息
if forceDNS != "" {
utils.LogInfo("强制使用DNS: %s", forceDNS)
} else if forceDoH != "" {
utils.LogInfo("强制使用DoH: %s", forceDoH)
} else if forceServer != "" {
utils.LogInfo("强制使用预设服务器: %s", forceServer)
} else {
// 显示块配置的DNS
if block.DNS != "" {
utils.LogInfo("使用DNS: %s", block.DNS)
} else if block.DoH != "" {
utils.LogInfo("使用DoH: %s", block.DoH)
} else if block.Server != "" {
utils.LogInfo("使用预设服务器: %s", block.Server)
} else {
utils.LogInfo("使用系统默认DNS")
}
}
// 显示保存配置信息
if saveConfig && (forceDNS != "" || forceDoH != "" || forceServer != "") {
utils.LogInfo("将保存DNS配置到块设置中")
}
if err := resolver.UpdateBlock(hm, blockName, forceDNS, forceDoH, forceServer, saveConfig); err != nil {
utils.LogError("更新失败: %v", err)
os.Exit(1)
}
// 显示保存结果
if saveConfig && (forceDNS != "" || forceDoH != "" || forceServer != "") {
utils.LogSuccess("DNS配置已保存到块设置")
}
}