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