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配置已保存到块设置") } }