From 0631ffe8310e700fbbfdaa2648cbff2b78dd089c Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 15 Feb 2025 02:55:03 +0700 Subject: [PATCH] all: allow verbose log when connecting to ControlD API So troubleshooting will be easier in case of errors happened. --- cmd/cli/main.go | 3 +++ config.go | 2 +- internal/controld/config.go | 2 +- internal/net/net.go | 13 +++++++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 73a601d..37ed314 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -88,12 +88,15 @@ func initConsoleLogging() { multi := zerolog.MultiLevelWriter(consoleWriter) l := mainLog.Load().Output(multi).With().Timestamp().Logger() mainLog.Store(&l) + switch { case silent: zerolog.SetGlobalLevel(zerolog.NoLevel) case verbose == 1: + ctrld.ProxyLogger.Store(&l) zerolog.SetGlobalLevel(zerolog.InfoLevel) case verbose > 1: + ctrld.ProxyLogger.Store(&l) zerolog.SetGlobalLevel(zerolog.DebugLevel) default: zerolog.SetGlobalLevel(zerolog.NoticeLevel) diff --git a/config.go b/config.go index e1454f9..2e85e76 100644 --- a/config.go +++ b/config.go @@ -529,7 +529,7 @@ func (uc *UpstreamConfig) newDOHTransport(addrs []string) *http.Transport { for i := range addrs { dialAddrs[i] = net.JoinHostPort(addrs[i], port) } - conn, err := pd.DialContext(ctx, network, dialAddrs) + conn, err := pd.DialContext(ctx, network, dialAddrs, ProxyLogger.Load()) if err != nil { return nil, err } diff --git a/internal/controld/config.go b/internal/controld/config.go index fbbd9d4..73bdf6b 100644 --- a/internal/controld/config.go +++ b/internal/controld/config.go @@ -226,7 +226,7 @@ func apiTransport(cdDev bool) *http.Transport { addrs[i] = net.JoinHostPort(ips[i], port) } d := &ctrldnet.ParallelDialer{} - return d.DialContext(ctx, network, addrs) + return d.DialContext(ctx, network, addrs, ctrld.ProxyLogger.Load()) } if router.Name() == ddwrt.Name || runtime.GOOS == "android" { transport.TLSClientConfig = &tls.Config{RootCAs: certs.CACertPool()} diff --git a/internal/net/net.go b/internal/net/net.go index dd1c072..2693fbf 100644 --- a/internal/net/net.go +++ b/internal/net/net.go @@ -3,6 +3,7 @@ package net import ( "context" "errors" + "io" "net" "os" "os/signal" @@ -11,6 +12,7 @@ import ( "syscall" "time" + "github.com/rs/zerolog" "tailscale.com/logtail/backoff" ) @@ -26,7 +28,8 @@ var Dialer = &net.Dialer{ Dial: func(ctx context.Context, network, address string) (net.Conn, error) { d := ParallelDialer{} d.Timeout = 10 * time.Second - return d.DialContext(ctx, "udp", []string{v4BootstrapDNS, v6BootstrapDNS}) + l := zerolog.New(io.Discard) + return d.DialContext(ctx, "udp", []string{v4BootstrapDNS, v6BootstrapDNS}, &l) }, }, } @@ -137,7 +140,7 @@ type ParallelDialer struct { net.Dialer } -func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs []string) (net.Conn, error) { +func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs []string, logger *zerolog.Logger) (net.Conn, error) { if len(addrs) == 0 { return nil, errors.New("empty addresses") } @@ -157,11 +160,16 @@ func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs for _, addr := range addrs { go func(addr string) { defer wg.Done() + logger.Debug().Msgf("dialing to %s", addr) conn, err := d.Dialer.DialContext(ctx, network, addr) + if err != nil { + logger.Debug().Msgf("failed to dial %s: %v", addr, err) + } select { case ch <- ¶llelDialerResult{conn: conn, err: err}: case <-done: if conn != nil { + logger.Debug().Msgf("connection closed: %s", conn.RemoteAddr()) conn.Close() } } @@ -172,6 +180,7 @@ func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs for res := range ch { if res.err == nil { cancel() + logger.Debug().Msgf("connected to %s", res.conn.RemoteAddr()) return res.conn, res.err } errs = append(errs, res.err)