Просмотр исходного кода

various: pass logger.Logf through to more places

Updates #7537

Signed-off-by: Andrew Dunham <[email protected]>
Change-Id: Id89acab70ea678c8c7ff0f44792d54c7223337c6
Andrew Dunham 3 лет назад
Родитель
Сommit
83fa17d26c

+ 1 - 0
control/controlclient/direct.go

@@ -212,6 +212,7 @@ func NewDirect(opts Options) (*Direct, error) {
 			Forward:          dnscache.Get().Forward, // use default cache's forwarder
 			UseLastGood:      true,
 			LookupIPFallback: dnsfallback.Lookup,
+			Logf:             opts.Logf,
 		}
 		tr := http.DefaultTransport.(*http.Transport).Clone()
 		tr.Proxy = tshttpproxy.ProxyFromEnvironment

+ 2 - 0
control/controlhttp/client.go

@@ -388,12 +388,14 @@ func (a *Dialer) tryURLUpgrade(ctx context.Context, u *url.URL, addr netip.Addr,
 		dns = &dnscache.Resolver{
 			SingleHostStaticResult: []netip.Addr{addr},
 			SingleHost:             u.Hostname(),
+			Logf:                   a.Logf, // not a.logf method; we want to propagate nil-ness
 		}
 	} else {
 		dns = &dnscache.Resolver{
 			Forward:          dnscache.Get().Forward,
 			LookupIPFallback: dnsfallback.Lookup,
 			UseLastGood:      true,
+			Logf:             a.Logf, // not a.logf method; we want to propagate nil-ness
 		}
 	}
 

+ 1 - 0
net/dns/resolver/forwarder.go

@@ -384,6 +384,7 @@ func (f *forwarder) getKnownDoHClientForProvider(urlBase string) (c *http.Client
 	dialer := dnscache.Dialer(nsDialer.DialContext, &dnscache.Resolver{
 		SingleHost:             dohURL.Hostname(),
 		SingleHostStaticResult: allIPs,
+		Logf:                   f.logf,
 	})
 	c = &http.Client{
 		Transport: &http.Transport{

+ 7 - 4
net/dnsfallback/dnsfallback.go

@@ -250,10 +250,13 @@ func SetCachePath(path string) {
 // logfunc stores the logging function to use for this package.
 var logfunc syncs.AtomicValue[logger.Logf]
 
-// SetLogger sets the logging function that this package will use. The default
-// logger if this function is not called is 'log.Printf'.
-func SetLogger(log logger.Logf) {
-	logfunc.Store(log)
+// SetLogger sets the logging function that this package will use, and returns
+// the old value (which may be nil).
+//
+// If this function is never called, or if this function is called with a nil
+// value, 'log.Printf' will be used to print logs.
+func SetLogger(log logger.Logf) (old logger.Logf) {
+	return logfunc.Swap(log)
 }
 
 func logf(format string, args ...any) {

+ 20 - 0
tsnet/tsnet.go

@@ -40,6 +40,7 @@ import (
 	"tailscale.com/logpolicy"
 	"tailscale.com/logtail"
 	"tailscale.com/logtail/filch"
+	"tailscale.com/net/dnsfallback"
 	"tailscale.com/net/memnet"
 	"tailscale.com/net/proxymux"
 	"tailscale.com/net/socks5"
@@ -619,6 +620,25 @@ func (s *Server) logf(format string, a ...interface{}) {
 	log.Printf(format, a...)
 }
 
+// ReplaceGlobalLoggers will replace any Tailscale-specific package-global
+// loggers with this Server's logger. It returns a function that, when called,
+// will undo any changes made.
+//
+// Note that calling this function from multiple Servers will result in the
+// last call taking all logs; logs are not duplicated.
+func (s *Server) ReplaceGlobalLoggers() (undo func()) {
+	var undos []func()
+
+	oldDnsFallback := dnsfallback.SetLogger(s.logf)
+	undos = append(undos, func() { dnsfallback.SetLogger(oldDnsFallback) })
+
+	return func() {
+		for _, fn := range undos {
+			fn()
+		}
+	}
+}
+
 // printAuthURLLoop loops once every few seconds while the server is still running and
 // is in NeedsLogin state, printing out the auth URL.
 func (s *Server) printAuthURLLoop() {