fix: 未指定使用系统dns

This commit is contained in:
akizon77
2025-09-22 10:31:04 +08:00
parent 9da02f615f
commit e4d3703d3b
2 changed files with 32 additions and 27 deletions

View File

@@ -22,15 +22,13 @@ var RootCmd = &cobra.Command{
log.Println("Komari Agent", update.CurrentVersion)
log.Println("Github Repo:", update.Repo)
// 设置自定义DNS解析
// 设置 DNS 解析行为
if flags.CustomDNS != "" {
dnsresolver.SetCustomDNSServer(flags.CustomDNS)
log.Printf("Using custom DNS server: %s", flags.CustomDNS)
} else {
log.Printf("Using default DNS servers, primary: %s (failover servers available)", dnsresolver.DNSServers[0])
if len(dnsresolver.DNSServers) > 1 {
log.Printf("Available failover DNS servers: %v", dnsresolver.DNSServers[1:])
}
// 未设置则使用系统默认 DNS不使用内置列表
log.Printf("Using system default DNS resolver")
}
// Auto discovery
@@ -113,7 +111,7 @@ func init() {
RootCmd.PersistentFlags().StringVar(&flags.CFAccessClientID, "cf-access-client-id", "", "Cloudflare Access Client ID")
RootCmd.PersistentFlags().StringVar(&flags.CFAccessClientSecret, "cf-access-client-secret", "", "Cloudflare Access Client Secret")
RootCmd.PersistentFlags().BoolVar(&flags.MemoryIncludeCache, "memory-include-cache", false, "Include cache/buffer in memory usage")
RootCmd.PersistentFlags().StringVar(&flags.CustomDNS, "custom-dns", "", "Custom DNS server to use (e.g. 8.8.8.8, 114.114.114.114). By default, the program will use multiple built-in DNS servers with failover support.")
RootCmd.PersistentFlags().StringVar(&flags.CustomDNS, "custom-dns", "", "Custom DNS server to use (e.g. 8.8.8.8, 114.114.114.114). By default, the program uses the system DNS resolver.")
RootCmd.PersistentFlags().BoolVar(&flags.EnableGPU, "gpu", false, "Enable detailed GPU monitoring (usage, memory, multi-GPU support)")
RootCmd.PersistentFlags().ParseErrorsWhitelist.UnknownFlags = true
}

View File

@@ -18,6 +18,7 @@ var (
"1.1.1.1:53", // Cloudflare DNS全球
"223.5.5.5:53", // 阿里DNS中国大陆
"119.29.29.29:53", // DNSPod中国大陆
}
// CustomDNSServer 自定义DNS服务器可以通过命令行参数设置
@@ -40,38 +41,44 @@ func getCurrentDNSServer() string {
if CustomDNSServer != "" {
return CustomDNSServer
}
// 如果没有设置自定义DNS返回默认的第一个
return DNSServers[0]
// 如果没有设置自定义DNS返回空字符串,表示应使用系统默认解析器
return ""
}
// GetCustomResolver 返回一个使用指定DNS服务器的解析器
// GetCustomResolver 返回一个解析器
// - 若设置了自定义 DNS使用该服务器并在失败时尝试内置列表作为兜底
// - 若未设置自定义 DNS返回系统默认解析器不使用内置列表
func GetCustomResolver() *net.Resolver {
// 未设置自定义 DNS直接使用系统默认解析器
if getCurrentDNSServer() == "" {
return net.DefaultResolver
}
// 设置了自定义 DNS则构造使用自定义 DNS 的解析器
return &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{
Timeout: 10 * time.Second,
}
d := net.Dialer{Timeout: 10 * time.Second}
// 尝试自定义DNS或默认DNS
// 优先使用自定义 DNS 服务器
dnsServer := getCurrentDNSServer()
conn, err := d.DialContext(ctx, "udp", dnsServer)
if err == nil {
return conn, nil
}
// 如果连接失败尝试其他DNS服务器
for _, server := range DNSServers {
if server != dnsServer { // 避免重复尝试
conn, err := d.DialContext(ctx, "udp", server)
if err == nil {
return conn, nil
}
if dnsServer != "" {
if conn, err := d.DialContext(ctx, "udp", dnsServer); err == nil {
return conn, nil
}
}
// 所有DNS服务器都失败返回最后一次的错误
return nil, err
// 如果自定义DNS不可用则尝试内置列表作为兜底
for _, server := range DNSServers {
if server == dnsServer {
continue
}
if conn, err := d.DialContext(ctx, "udp", server); err == nil {
return conn, nil
}
}
return nil, fmt.Errorf("no available DNS server")
},
}
}