From 5aca118dbb0e07b7cfa4a17e9f595f7adbfa7fc3 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Mon, 27 May 2024 15:40:25 +0700 Subject: [PATCH] all: always reset DNS before initializing OS resolver So ctrld could always get the correct nameservers used by system to be used for its OS resolver. --- cmd/cli/cli.go | 13 ++++++++----- cmd/cli/prog.go | 4 +++- resolver.go | 16 +++++++++++----- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index f4018c4..bdae37a 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -182,7 +182,7 @@ func initCLI() { return } - status, err := s.Status() + status, _ := s.Status() isCtrldRunning := status == service.StatusRunning // If pin code was set, do not allow running start command. @@ -500,7 +500,6 @@ func initCLI() { iface = runningIface(s) tasks := []task{ {s.Stop, false}, - {func() error { resetDnsNoLog(p); return nil }, false}, {s.Start, true}, } if doTasks(tasks) { @@ -509,10 +508,12 @@ func initCLI() { mainLog.Load().Warn().Err(err).Msg("Service was restarted, but could not ping the control server") return } - if cc := newSocketControlClient(s, dir); cc == nil { + cc := newSocketControlClient(s, dir) + if cc == nil { mainLog.Load().Notice().Msg("Service was not restarted") os.Exit(1) } + _, _ = cc.post(ifacePath, nil) mainLog.Load().Notice().Msg("Service restarted") } }, @@ -927,13 +928,15 @@ NOTE: Uninstalling will set DNS to values provided by DHCP.`, return true } tasks := []task{ - resetDnsTask(p, s), {s.Stop, false}, {s.Start, false}, } if doTasks(tasks) { if dir, err := socketDir(); err == nil { - return newSocketControlClient(s, dir) != nil + if cc := newSocketControlClient(s, dir); cc != nil { + _, _ = cc.post(ifacePath, nil) + return true + } } } return false diff --git a/cmd/cli/prog.go b/cmd/cli/prog.go index 8dd83b5..8e35575 100644 --- a/cmd/cli/prog.go +++ b/cmd/cli/prog.go @@ -206,8 +206,10 @@ func (p *prog) preRun() { } func (p *prog) postRun() { - mainLog.Load().Debug().Msgf("initialized OS resolver with nameservers: %v", ctrld.OsNameservers) if !service.Interactive() { + p.resetDNS() + ns := ctrld.InitializeOsResolver() + mainLog.Load().Debug().Msgf("initialized OS resolver with nameservers: %v", ns) p.setDNS() } } diff --git a/resolver.go b/resolver.go index bfb3394..49ac652 100644 --- a/resolver.go +++ b/resolver.go @@ -32,12 +32,8 @@ const ( const bootstrapDNS = "76.76.2.22" -// OsNameservers is the list of DNS nameservers used by OS resolver. -// This reads OS settings at the time ctrld process starts. -var OsNameservers = defaultNameservers() - // or is the Resolver used for ResolverTypeOS. -var or = &osResolver{nameservers: OsNameservers} +var or = &osResolver{nameservers: defaultNameservers()} // defaultNameservers returns nameservers used by the OS. // If no nameservers can be found, ctrld bootstrap nameserver will be used. @@ -49,6 +45,16 @@ func defaultNameservers() []string { return ns } +// InitializeOsResolver initializes OS resolver using the current system DNS settings. +// It returns the nameservers that is going to be used by the OS resolver. +// +// It's the caller's responsibility to ensure the system DNS is in a clean state before +// calling this function. +func InitializeOsResolver() []string { + or.nameservers = defaultNameservers() + return or.nameservers +} + // Resolver is the interface that wraps the basic DNS operations. // // Resolve resolves the DNS query, return the result and the corresponding error.