From eb28e752000b4263e28e9da7d9db311b99b3d5fc Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Sat, 10 Jan 2026 05:16:38 +0100 Subject: [PATCH] refactor: logs inside DNS providers --- providers/dns/bluecat/bluecat.go | 2 +- providers/dns/cloudflare/cloudflare.go | 5 +-- providers/dns/cloudns/cloudns.go | 2 +- providers/dns/desec/desec.go | 2 +- providers/dns/designate/designate.go | 6 +-- providers/dns/dynu/internal/client.go | 2 +- providers/dns/edgedns/edgedns.go | 3 -- providers/dns/exec/exec.go | 2 +- providers/dns/exec/exec_test.go | 25 ++++++------ providers/dns/exec/log_mock_test.go | 39 +++++++++---------- providers/dns/gandiv5/gandiv5.go | 2 +- providers/dns/gandiv5/internal/client.go | 9 ----- providers/dns/gcloud/googlecloud.go | 5 +-- providers/dns/hetzner/hetzner.go | 5 ++- providers/dns/hurricane/internal/client.go | 4 +- providers/dns/infomaniak/internal/client.go | 18 +-------- providers/dns/inwx/inwx.go | 8 ++-- providers/dns/joker/internal/dmapi/client.go | 6 --- providers/dns/joker/internal/svc/client.go | 2 + providers/dns/joker/joker.go | 3 -- providers/dns/joker/provider_dmapi.go | 15 +------ providers/dns/joker/provider_svc.go | 14 ++++++- providers/dns/liara/liara.go | 2 +- providers/dns/namecheap/internal/ip.go | 10 ++--- providers/dns/namecheap/namecheap.go | 11 ++---- providers/dns/netcup/netcup.go | 6 +-- providers/dns/ns1/ns1.go | 15 +++---- providers/dns/octenium/octenium.go | 2 +- .../dns/oraclecloud/configurationprovider.go | 2 +- providers/dns/pdns/pdns.go | 2 +- providers/dns/stackpath/stackpath.go | 16 +++++--- providers/dns/variomedia/variomedia.go | 3 -- 32 files changed, 100 insertions(+), 148 deletions(-) diff --git a/providers/dns/bluecat/bluecat.go b/providers/dns/bluecat/bluecat.go index 823d85489..81f49141a 100644 --- a/providers/dns/bluecat/bluecat.go +++ b/providers/dns/bluecat/bluecat.go @@ -138,7 +138,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { } if d.config.Debug { - log.Infof("fqdn: %s; viewID: %d; ZoneID: %d; zone: %s", info.EffectiveFQDN, viewID, parentZoneID, name) + log.Info("bluecat: debug information.", "fqdn", info.EffectiveFQDN, "viewID", viewID, "zoneID", parentZoneID, "zone", name) } txtRecord := internal.Entity{ diff --git a/providers/dns/cloudflare/cloudflare.go b/providers/dns/cloudflare/cloudflare.go index d9190dce2..b248aafd2 100644 --- a/providers/dns/cloudflare/cloudflare.go +++ b/providers/dns/cloudflare/cloudflare.go @@ -13,7 +13,6 @@ import ( "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/providers/dns/cloudflare/internal" ) @@ -185,8 +184,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { d.recordIDs[token] = response.ID d.recordIDsMu.Unlock() - log.Infof("cloudflare: new record for %s, ID %s", domain, response.ID) - return nil } @@ -217,7 +214,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { err = d.client.DeleteDNSRecord(ctx, zoneID, recordID) if err != nil { - log.Printf("cloudflare: failed to delete TXT record: %v", err) + return fmt.Errorf("cloudflare: failed to delete TXT record: %w", err) } // Delete record ID from map diff --git a/providers/dns/cloudns/cloudns.go b/providers/dns/cloudns/cloudns.go index 25b4eb831..69ad6c95e 100644 --- a/providers/dns/cloudns/cloudns.go +++ b/providers/dns/cloudns/cloudns.go @@ -176,7 +176,7 @@ func (d *DNSProvider) waitNameservers(ctx context.Context, domain string, zone * return fmt.Errorf("nameserver sync on %s: %w", domain, err) } - log.Infof("[%s] Sync %d/%d complete", domain, syncProgress.Updated, syncProgress.Total) + log.Info(fmt.Sprintf("Sync %d/%d complete", syncProgress.Updated, syncProgress.Total), "domain", domain) if !syncProgress.Complete { return fmt.Errorf("nameserver sync on %s not complete", domain) diff --git a/providers/dns/desec/desec.go b/providers/dns/desec/desec.go index 266bbac94..c582be3b3 100644 --- a/providers/dns/desec/desec.go +++ b/providers/dns/desec/desec.go @@ -5,12 +5,12 @@ import ( "context" "errors" "fmt" - "log" "net/http" "time" "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" + "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" "github.com/nrdcg/desec" diff --git a/providers/dns/designate/designate.go b/providers/dns/designate/designate.go index 40752cce1..53e9facd5 100644 --- a/providers/dns/designate/designate.go +++ b/providers/dns/designate/designate.go @@ -4,7 +4,6 @@ package designate import ( "errors" "fmt" - "log" "os" "slices" "sync" @@ -12,6 +11,7 @@ import ( "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" + "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" @@ -155,7 +155,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { if existingRecord != nil { if slices.Contains(existingRecord.Records, info.Value) { - log.Printf("designate: the record already exists: %s", info.Value) + log.Debug("designate: the record already exists.", "value", info.Value) return nil } @@ -229,7 +229,7 @@ func (d *DNSProvider) createRecord(zoneID, fqdn, value string) error { func (d *DNSProvider) updateRecord(record *recordsets.RecordSet, value string) error { if slices.Contains(record.Records, value) { - log.Printf("skip: the record already exists: %s", value) + log.Debug("skip: the record already exists.", "value", value) return nil } diff --git a/providers/dns/dynu/internal/client.go b/providers/dns/dynu/internal/client.go index 79224911e..8c8544ce9 100644 --- a/providers/dns/dynu/internal/client.go +++ b/providers/dns/dynu/internal/client.go @@ -122,7 +122,7 @@ func (c *Client) doRetry(ctx context.Context, method, uri string, body []byte, r } notify := func(err error, duration time.Duration) { - log.Printf("client retries because of %v", err) + log.Warn("client retries.", "error", err) } bo := backoff.NewExponentialBackOff() diff --git a/providers/dns/edgedns/edgedns.go b/providers/dns/edgedns/edgedns.go index 934dbb713..18af1b582 100644 --- a/providers/dns/edgedns/edgedns.go +++ b/providers/dns/edgedns/edgedns.go @@ -15,7 +15,6 @@ import ( "github.com/akamai/AkamaiOPEN-edgegrid-golang/v11/pkg/session" "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" ) @@ -158,8 +157,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { } if record != nil { - log.Infof("TXT record already exists. Updating target") - if containsValue(record.Target, info.Value) { // have a record and have entry already return nil diff --git a/providers/dns/exec/exec.go b/providers/dns/exec/exec.go index 3533dcb25..a6fef30c9 100644 --- a/providers/dns/exec/exec.go +++ b/providers/dns/exec/exec.go @@ -135,7 +135,7 @@ func (d *DNSProvider) run(ctx context.Context, command, domain, token, keyAuth s scanner := bufio.NewScanner(stdout) for scanner.Scan() { - log.Println(scanner.Text()) + log.Info(scanner.Text()) } err = cmd.Wait() diff --git a/providers/dns/exec/exec_test.go b/providers/dns/exec/exec_test.go index 3fef6c339..12f12b3e9 100644 --- a/providers/dns/exec/exec_test.go +++ b/providers/dns/exec/exec_test.go @@ -2,6 +2,7 @@ package exec import ( "fmt" + "log/slog" "os" "strings" "testing" @@ -13,14 +14,14 @@ import ( ) func TestDNSProvider_Present(t *testing.T) { - backupLogger := log.Logger + backupLogger := log.Default() defer func() { - log.Logger = backupLogger + log.SetDefault(backupLogger) }() - logRecorder := &LogRecorder{} - log.Logger = logRecorder + logHandler := &LogHandler{} + log.SetDefault(slog.New(logHandler)) type expected struct { args string @@ -64,8 +65,8 @@ func TestDNSProvider_Present(t *testing.T) { var message string - logRecorder.On("Println", mock.Anything).Run(func(args mock.Arguments) { - message = args.String(0) + logHandler.On("Handle", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { + message = args.Get(1).(slog.Record).Message fmt.Fprintln(os.Stdout, "XXX", message) }) @@ -88,14 +89,14 @@ func TestDNSProvider_Present(t *testing.T) { } func TestDNSProvider_CleanUp(t *testing.T) { - backupLogger := log.Logger + backupLogger := log.Default() defer func() { - log.Logger = backupLogger + log.SetDefault(backupLogger) }() - logRecorder := &LogRecorder{} - log.Logger = logRecorder + logHandler := &LogHandler{} + log.SetDefault(slog.New(logHandler)) type expected struct { args string @@ -139,8 +140,8 @@ func TestDNSProvider_CleanUp(t *testing.T) { var message string - logRecorder.On("Println", mock.Anything).Run(func(args mock.Arguments) { - message = args.String(0) + logHandler.On("Handle", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { + message = args.Get(1).(slog.Record).Message fmt.Fprintln(os.Stdout, "XXX", message) }) diff --git a/providers/dns/exec/log_mock_test.go b/providers/dns/exec/log_mock_test.go index 65753dcf8..ce768a9a3 100644 --- a/providers/dns/exec/log_mock_test.go +++ b/providers/dns/exec/log_mock_test.go @@ -1,31 +1,30 @@ package exec -import "github.com/stretchr/testify/mock" +import ( + "context" + "log/slog" -type LogRecorder struct { + "github.com/stretchr/testify/mock" +) + +type LogHandler struct { mock.Mock } -func (*LogRecorder) Fatal(args ...any) { +func (l *LogHandler) Enabled(ctx context.Context, level slog.Level) bool { + return true +} + +func (l *LogHandler) Handle(ctx context.Context, record slog.Record) error { + l.Called(ctx, record) + + return nil +} + +func (l *LogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { panic("implement me") } -func (*LogRecorder) Fatalln(args ...any) { - panic("implement me") -} - -func (*LogRecorder) Fatalf(format string, args ...any) { - panic("implement me") -} - -func (*LogRecorder) Print(args ...any) { - panic("implement me") -} - -func (l *LogRecorder) Println(args ...any) { - l.Called(args...) -} - -func (*LogRecorder) Printf(format string, args ...any) { +func (l *LogHandler) WithGroup(name string) slog.Handler { panic("implement me") } diff --git a/providers/dns/gandiv5/gandiv5.go b/providers/dns/gandiv5/gandiv5.go index 1851eae06..9e736f2ad 100644 --- a/providers/dns/gandiv5/gandiv5.go +++ b/providers/dns/gandiv5/gandiv5.go @@ -96,7 +96,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { } if config.APIKey != "" { - log.Print("gandiv5: API Key is deprecated, use Personal Access Token instead") + log.Warn("gandiv5: API Key is deprecated, use Personal Access Token instead") } if config.APIKey == "" && config.PersonalAccessToken == "" { diff --git a/providers/dns/gandiv5/internal/client.go b/providers/dns/gandiv5/internal/client.go index d5aa81b1b..e9f6d892e 100644 --- a/providers/dns/gandiv5/internal/client.go +++ b/providers/dns/gandiv5/internal/client.go @@ -10,7 +10,6 @@ import ( "net/url" "time" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/providers/dns/internal/errutils" ) @@ -99,10 +98,6 @@ func (c *Client) addTXTRecord(ctx context.Context, domain, name string, newRecor return fmt.Errorf("unable to create TXT record for domain %s and name %s: %w", domain, name, err) } - if message.Message != "" { - log.Infof("API response: %s", message.Message) - } - return nil } @@ -121,10 +116,6 @@ func (c *Client) DeleteTXTRecord(ctx context.Context, domain, name string) error return fmt.Errorf("unable to delete TXT record for domain %s and name %s: %w", domain, name, err) } - if message.Message != "" { - log.Infof("API response: %s", message.Message) - } - return nil } diff --git a/providers/dns/gcloud/googlecloud.go b/providers/dns/gcloud/googlecloud.go index 9b1c36dfa..74405616f 100644 --- a/providers/dns/gcloud/googlecloud.go +++ b/providers/dns/gcloud/googlecloud.go @@ -212,7 +212,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { rrd = append(rrd, data) if data == info.Value { - log.Printf("skip: the record already exists: %s", info.Value) return nil } } @@ -257,7 +256,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { func (d *DNSProvider) applyChanges(ctx context.Context, zone string, change *gdns.Change) error { if d.config.Debug { data, _ := json.Marshal(change) - log.Printf("change (Create): %s", string(data)) + log.Info("change (Create)", "data", string(data)) } chg, err := d.client.Changes.Create(d.config.Project, zone, change).Do() @@ -283,7 +282,7 @@ func (d *DNSProvider) applyChanges(ctx context.Context, zone string, change *gdn func() error { if d.config.Debug { data, _ := json.Marshal(change) - log.Printf("change (Get): %s", string(data)) + log.Info("change (Get)", "data", string(data)) } chg, err = d.client.Changes.Get(d.config.Project, zone, chgID).Do() diff --git a/providers/dns/hetzner/hetzner.go b/providers/dns/hetzner/hetzner.go index ef21f0ee6..33b3344df 100644 --- a/providers/dns/hetzner/hetzner.go +++ b/providers/dns/hetzner/hetzner.go @@ -3,6 +3,7 @@ package hetzner import ( "errors" + "fmt" "net/http" "time" @@ -75,7 +76,7 @@ func NewDNSProvider() (*DNSProvider, error) { return &DNSProvider{provider: provider}, nil case foundAPIKey: - log.Warnf("APIKey (legacy Hetzner DNS API) is deprecated, please use APIToken (Hetzner Cloud API) instead.") + log.Warn("APIKey (legacy Hetzner DNS API) is deprecated, please use APIToken (Hetzner Cloud API) instead.") provider, err := legacy.NewDNSProvider() if err != nil { @@ -118,7 +119,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { return &DNSProvider{provider: provider}, nil case config.APIKey != "": - log.Warnf("%s (legacy Hetzner DNS API) is deprecated, please use %s (Hetzner Cloud API) instead.", EnvAPIKey, EnvAPIToken) + log.Warn(fmt.Sprintf("%s (legacy Hetzner DNS API) is deprecated, please use %s (Hetzner Cloud API) instead.", EnvAPIKey, EnvAPIToken)) cfg := &legacy.Config{ APIKey: config.APIKey, diff --git a/providers/dns/hurricane/internal/client.go b/providers/dns/hurricane/internal/client.go index 0cb546530..e7d476f52 100644 --- a/providers/dns/hurricane/internal/client.go +++ b/providers/dns/hurricane/internal/client.go @@ -5,13 +5,13 @@ import ( "context" "fmt" "io" - "log" "net/http" "net/url" "strings" "sync" "time" + "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/providers/dns/internal/errutils" "golang.org/x/time/rate" ) @@ -108,7 +108,7 @@ func evaluateBody(body, hostname string) error { case codeGood: return nil case codeNoChg: - log.Printf("%s: unchanged content written to TXT record %s", body, hostname) + log.Debug("unchanged content written to TXT record.", "hostname", hostname, "body", body) return nil case codeAbuse: return fmt.Errorf("%s: blocked hostname for abuse: %s", body, hostname) diff --git a/providers/dns/infomaniak/internal/client.go b/providers/dns/infomaniak/internal/client.go index 978f2bb7c..58eaa0889 100644 --- a/providers/dns/infomaniak/internal/client.go +++ b/providers/dns/infomaniak/internal/client.go @@ -9,11 +9,9 @@ import ( "net/http" "net/url" "strconv" - "strings" "time" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/providers/dns/internal/errutils" "golang.org/x/oauth2" ) @@ -72,17 +70,9 @@ func (c *Client) DeleteDNSRecord(ctx context.Context, domainID uint64, recordID // GetDomainByName gets a Domain object from its name. func (c *Client) GetDomainByName(ctx context.Context, name string) (*DNSDomain, error) { - name = dns01.UnFqdn(name) - // Try to find the most specific domain - // starts with the FQDN, then remove each left label until we have a match - for { - i := strings.Index(name, ".") - if i == -1 { - break - } - - domain, err := c.getDomainByName(ctx, name) + for n := range dns01.UnFqdnDomainsSeq(dns01.UnFqdn(name)) { + domain, err := c.getDomainByName(ctx, n) if err != nil { return nil, err } @@ -90,10 +80,6 @@ func (c *Client) GetDomainByName(ctx context.Context, name string) (*DNSDomain, if domain != nil { return domain, nil } - - log.Infof("domain %q not found, trying with %q", name, name[i+1:]) - - name = name[i+1:] } return nil, fmt.Errorf("domain not found %s", name) diff --git a/providers/dns/inwx/inwx.go b/providers/dns/inwx/inwx.go index 30e14d624..6c9973427 100644 --- a/providers/dns/inwx/inwx.go +++ b/providers/dns/inwx/inwx.go @@ -87,7 +87,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { } if config.Sandbox { - log.Infof("inwx: sandbox mode is enabled") + log.Info("inwx: sandbox mode is enabled.") } client := goinwx.NewClient(config.Username, config.Password, &goinwx.ClientOptions{Sandbox: config.Sandbox}) @@ -112,7 +112,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { defer func() { errL := d.client.Account.Logout() if errL != nil { - log.Infof("inwx: failed to log out: %v", errL) + log.Warn("inwx: failed to log out.", "error", errL) } }() @@ -159,7 +159,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { defer func() { errL := d.client.Account.Logout() if errL != nil { - log.Infof("inwx: failed to log out: %v", errL) + log.Warn("inwx: failed to log out.", "error", errL) } }() @@ -220,7 +220,7 @@ func (d *DNSProvider) twoFactorAuth(info *goinwx.LoginResponse) error { // To avoid using the same TAN twice, we wait until the next TOTP period. sleep := d.computeSleep(time.Now()) if sleep != 0 { - log.Infof("inwx: waiting %s for next TOTP token", sleep) + log.Info("inwx: waiting for the next TOTP token", "sleep", sleep) time.Sleep(sleep) } diff --git a/providers/dns/joker/internal/dmapi/client.go b/providers/dns/joker/internal/dmapi/client.go index 26ee62db7..37e281715 100644 --- a/providers/dns/joker/internal/dmapi/client.go +++ b/providers/dns/joker/internal/dmapi/client.go @@ -15,7 +15,6 @@ import ( "time" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/providers/dns/internal/errutils" ) @@ -45,7 +44,6 @@ type Client struct { token *Token muToken sync.Mutex - Debug bool BaseURL string HTTPClient *http.Client } @@ -90,10 +88,6 @@ func (c *Client) postRequest(ctx context.Context, cmd string, data url.Values) ( data.Set("auth-sid", getSessionID(ctx)) } - if c.Debug { - log.Infof("postRequest:\n\tURL: %q\n\tData: %v", endpoint, data) - } - req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, strings.NewReader(data.Encode())) if err != nil { return nil, fmt.Errorf("unable to create request: %w", err) diff --git a/providers/dns/joker/internal/svc/client.go b/providers/dns/joker/internal/svc/client.go index f3c14b8f7..935caefea 100644 --- a/providers/dns/joker/internal/svc/client.go +++ b/providers/dns/joker/internal/svc/client.go @@ -69,6 +69,8 @@ func (c *Client) SendRequest(ctx context.Context, zone, label, value string) err return errutils.NewHTTPDoError(req, err) } + defer func() { _ = resp.Body.Close() }() + raw, err := io.ReadAll(resp.Body) if err != nil { return errutils.NewReadResponseError(req, resp.StatusCode, err) diff --git a/providers/dns/joker/joker.go b/providers/dns/joker/joker.go index ab6f41198..77488777c 100644 --- a/providers/dns/joker/joker.go +++ b/providers/dns/joker/joker.go @@ -18,7 +18,6 @@ const ( EnvAPIKey = envNamespace + "API_KEY" EnvUsername = envNamespace + "USERNAME" EnvPassword = envNamespace + "PASSWORD" - EnvDebug = envNamespace + "DEBUG" EnvMode = envNamespace + "API_MODE" EnvTTL = envNamespace + "TTL" @@ -35,7 +34,6 @@ const ( // Config is used to configure the creation of the DNSProvider. type Config struct { - Debug bool APIKey string Username string Password string @@ -51,7 +49,6 @@ type Config struct { func NewDefaultConfig() *Config { return &Config{ APIMode: env.GetOrDefaultString(EnvMode, modeDMAPI), - Debug: env.GetOrDefaultBool(EnvDebug, false), TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL), PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 2*time.Minute), PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval), diff --git a/providers/dns/joker/provider_dmapi.go b/providers/dns/joker/provider_dmapi.go index 2b136e7f6..68bba5fc6 100644 --- a/providers/dns/joker/provider_dmapi.go +++ b/providers/dns/joker/provider_dmapi.go @@ -8,7 +8,6 @@ import ( "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" "github.com/go-acme/lego/v5/providers/dns/joker/internal/dmapi" @@ -62,8 +61,6 @@ func newDmapiProviderConfig(config *Config) (*dmapiProvider, error) { Password: config.Password, }) - client.Debug = config.Debug - if config.HTTPClient != nil { client.HTTPClient = config.HTTPClient } @@ -93,13 +90,9 @@ func (d *dmapiProvider) Present(domain, token, keyAuth string) error { return fmt.Errorf("joker: %w", err) } - if d.config.Debug { - log.Infof("[%s] joker: adding TXT record %q to zone %q with value %q", domain, subDomain, zone, info.Value) - } - ctx, err := d.client.CreateAuthenticatedContext(context.Background()) if err != nil { - return err + return fmt.Errorf("joker: create authenticated context: %w", err) } response, err := d.client.GetZone(ctx, zone) @@ -131,13 +124,9 @@ func (d *dmapiProvider) CleanUp(domain, token, keyAuth string) error { return fmt.Errorf("joker: %w", err) } - if d.config.Debug { - log.Infof("[%s] joker: removing entry %q from zone %q", domain, subDomain, zone) - } - ctx, err := d.client.CreateAuthenticatedContext(context.Background()) if err != nil { - return err + return fmt.Errorf("joker: create authenticated context: %w", err) } defer func() { diff --git a/providers/dns/joker/provider_svc.go b/providers/dns/joker/provider_svc.go index 0da8f139a..35e1cb7ed 100644 --- a/providers/dns/joker/provider_svc.go +++ b/providers/dns/joker/provider_svc.go @@ -73,7 +73,12 @@ func (d *svcProvider) Present(domain, token, keyAuth string) error { return fmt.Errorf("joker: %w", err) } - return d.client.SendRequest(context.Background(), dns01.UnFqdn(zone), subDomain, info.Value) + err = d.client.SendRequest(context.Background(), dns01.UnFqdn(zone), subDomain, info.Value) + if err != nil { + return fmt.Errorf("joker: send request: %w", err) + } + + return nil } // CleanUp removes the TXT record matching the specified parameters. @@ -90,7 +95,12 @@ func (d *svcProvider) CleanUp(domain, token, keyAuth string) error { return fmt.Errorf("joker: %w", err) } - return d.client.SendRequest(context.Background(), dns01.UnFqdn(zone), subDomain, "") + err = d.client.SendRequest(context.Background(), dns01.UnFqdn(zone), subDomain, "") + if err != nil { + return fmt.Errorf("joker: send request: %w", err) + } + + return nil } // Sequential All DNS challenges for this provider will be resolved sequentially. diff --git a/providers/dns/liara/liara.go b/providers/dns/liara/liara.go index b055f71d3..3664a5332 100644 --- a/providers/dns/liara/liara.go +++ b/providers/dns/liara/liara.go @@ -106,7 +106,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { retryClient.HTTPClient = config.HTTPClient } - retryClient.Logger = log.Logger + retryClient.Logger = log.Default() client := internal.NewClient( clientdebug.Wrap( diff --git a/providers/dns/namecheap/internal/ip.go b/providers/dns/namecheap/internal/ip.go index ac53b74f7..b1338ea2e 100644 --- a/providers/dns/namecheap/internal/ip.go +++ b/providers/dns/namecheap/internal/ip.go @@ -7,7 +7,7 @@ import ( "net/http" "time" - "github.com/go-acme/lego/v5/log" + "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" "github.com/go-acme/lego/v5/providers/dns/internal/errutils" ) @@ -15,11 +15,13 @@ const getIPURL = "https://dynamicdns.park-your-domain.com/getip" // GetClientIP returns the client's public IP address. // It uses namecheap's IP discovery service to perform the lookup. -func GetClientIP(ctx context.Context, client *http.Client, debug bool) (addr string, err error) { +func GetClientIP(ctx context.Context, client *http.Client) (addr string, err error) { if client == nil { client = &http.Client{Timeout: 5 * time.Second} } + client = clientdebug.Wrap(client) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, getIPURL, http.NoBody) if err != nil { return "", fmt.Errorf("unable to create request: %w", err) @@ -37,9 +39,5 @@ func GetClientIP(ctx context.Context, client *http.Client, debug bool) (addr str return "", errutils.NewReadResponseError(req, resp.StatusCode, err) } - if debug { - log.Println("Client IP:", string(clientIP)) - } - return string(clientIP), nil } diff --git a/providers/dns/namecheap/namecheap.go b/providers/dns/namecheap/namecheap.go index 26c723dd3..4d13e17ba 100644 --- a/providers/dns/namecheap/namecheap.go +++ b/providers/dns/namecheap/namecheap.go @@ -39,7 +39,6 @@ const ( EnvAPIKey = envNamespace + "API_KEY" EnvSandbox = envNamespace + "SANDBOX" - EnvDebug = envNamespace + "DEBUG" EnvTTL = envNamespace + "TTL" EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT" @@ -51,7 +50,6 @@ var _ challenge.ProviderTimeout = (*DNSProvider)(nil) // Config is used to configure the creation of the DNSProvider. type Config struct { - Debug bool BaseURL string APIUser string APIKey string @@ -71,7 +69,6 @@ func NewDefaultConfig() *Config { return &Config{ BaseURL: baseURL, - Debug: env.GetOrDefaultBool(EnvDebug, false), TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL), PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, time.Hour), PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, 15*time.Second), @@ -115,7 +112,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { } if config.ClientIP == "" { - clientIP, err := internal.GetClientIP(context.Background(), config.HTTPClient, config.Debug) + clientIP, err := internal.GetClientIP(context.Background(), config.HTTPClient) if err != nil { return nil, fmt.Errorf("namecheap: %w", err) } @@ -166,10 +163,8 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { records = append(records, record) - if d.config.Debug { - for _, h := range records { - log.Printf("%-5.5s %-30.30s %-6s %-70.70s", h.Type, h.Name, h.TTL, h.Address) - } + for _, h := range records { + log.Debug(fmt.Sprintf("%-5.5s %-30.30s %-6s %-70.70s", h.Type, h.Name, h.TTL, h.Address)) } err = d.client.SetHosts(ctx, pr.sld, pr.tld, records) diff --git a/providers/dns/netcup/netcup.go b/providers/dns/netcup/netcup.go index bcaea28eb..6e40d0e2e 100644 --- a/providers/dns/netcup/netcup.go +++ b/providers/dns/netcup/netcup.go @@ -119,7 +119,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { defer func() { err = d.client.Logout(ctx) if err != nil { - log.Printf("netcup: %v", err) + log.Warn("netcup: failed to logout.", "error", err) } }() @@ -135,7 +135,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { records, err := d.client.GetDNSRecords(ctx, zone) if err != nil { // skip no existing records - log.Infof("no existing records, error ignored: %v", err) + log.Info("No existing records, error ignored.", "zone", zone, "error", err) } records = append(records, record) @@ -165,7 +165,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { defer func() { err = d.client.Logout(ctx) if err != nil { - log.Printf("netcup: %v", err) + log.Warn("netcup: failed to logout.", "error", err) } }() diff --git a/providers/dns/ns1/ns1.go b/providers/dns/ns1/ns1.go index e6b01376a..f12f6b5df 100644 --- a/providers/dns/ns1/ns1.go +++ b/providers/dns/ns1/ns1.go @@ -9,7 +9,6 @@ import ( "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" "gopkg.in/ns1/ns1-go.v2/rest" @@ -104,8 +103,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { // Create a new record if errors.Is(err, rest.ErrRecordMissing) || record == nil { - log.Infof("Create a new record for [zone: %s, fqdn: %s, domain: %s]", zone.Zone, info.EffectiveFQDN, domain) - // Work through a bug in the NS1 API library that causes 400 Input validation failed (Value None for field '.filters' is not of type ...) // So the `tags` and `blockedTags` parameters should be initialized to empty. record = dns.NewRecord(zone.Zone, dns01.UnFqdn(info.EffectiveFQDN), "TXT", make(map[string]string), make([]string, 0)) @@ -114,24 +111,22 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { _, err = d.client.Records.Create(record) if err != nil { - return fmt.Errorf("ns1: failed to create record [zone: %q, fqdn: %q]: %w", zone.Zone, info.EffectiveFQDN, err) + return fmt.Errorf("ns1: create record [zone: %q, fqdn: %q]: %w", zone.Zone, info.EffectiveFQDN, err) } return nil } if err != nil { - return fmt.Errorf("ns1: failed to get the existing record: %w", err) + return fmt.Errorf("ns1: get the existing record: %w", err) } // Update the existing records record.Answers = append(record.Answers, &dns.Answer{Rdata: []string{info.Value}}) - log.Infof("Update an existing record for [zone: %s, fqdn: %s, domain: %s]", zone.Zone, info.EffectiveFQDN, domain) - _, err = d.client.Records.Update(record) if err != nil { - return fmt.Errorf("ns1: failed to update record [zone: %q, fqdn: %q]: %w", zone.Zone, info.EffectiveFQDN, err) + return fmt.Errorf("ns1: update record [zone: %q, fqdn: %q]: %w", zone.Zone, info.EffectiveFQDN, err) } return nil @@ -150,7 +145,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { _, err = d.client.Records.Delete(zone.Zone, name, "TXT") if err != nil { - return fmt.Errorf("ns1: failed to delete record [zone: %q, domain: %q]: %w", zone.Zone, name, err) + return fmt.Errorf("ns1: delete record [zone: %q, domain: %q]: %w", zone.Zone, name, err) } return nil @@ -172,7 +167,7 @@ func (d *DNSProvider) getHostedZone(fqdn string) (*dns.Zone, error) { zone, _, err := d.client.Zones.Get(authZone, false) if err != nil { - return nil, fmt.Errorf("failed to get zone [authZone: %q, fqdn: %q]: %w", authZone, fqdn, err) + return nil, fmt.Errorf("get zone [authZone: %q, fqdn: %q]: %w", authZone, fqdn, err) } return zone, nil diff --git a/providers/dns/octenium/octenium.go b/providers/dns/octenium/octenium.go index 775a4e6c7..9bf1ebf83 100644 --- a/providers/dns/octenium/octenium.go +++ b/providers/dns/octenium/octenium.go @@ -91,7 +91,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { retryClient := retryablehttp.NewClient() retryClient.RetryMax = 5 retryClient.HTTPClient = client.HTTPClient - retryClient.Logger = log.Logger + retryClient.Logger = log.Default() client.HTTPClient = clientdebug.Wrap(retryClient.StandardClient()) diff --git a/providers/dns/oraclecloud/configurationprovider.go b/providers/dns/oraclecloud/configurationprovider.go index d1dd29a76..7acee8cec 100644 --- a/providers/dns/oraclecloud/configurationprovider.go +++ b/providers/dns/oraclecloud/configurationprovider.go @@ -133,7 +133,7 @@ func getEnvFileWithStrictFallback(keys ...string) []byte { fileContents, err := os.ReadFile(fileVarValue) if err != nil { - log.Printf("Failed to read the file %s (defined by env var %s): %s", fileVarValue, key, err) + log.Debug("Failed to read the file.", "filepath", fileVarValue, "envVar", key, "error", err) return nil } diff --git a/providers/dns/pdns/pdns.go b/providers/dns/pdns/pdns.go index e69f65b1a..08608956a 100644 --- a/providers/dns/pdns/pdns.go +++ b/providers/dns/pdns/pdns.go @@ -113,7 +113,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { if config.APIVersion <= 0 { err := client.SetAPIVersion(context.Background()) if err != nil { - log.Warnf("pdns: failed to get API version %v", err) + log.Warn("pdns: failed to get API version.", "error", err) } } diff --git a/providers/dns/stackpath/stackpath.go b/providers/dns/stackpath/stackpath.go index bd6c09878..34db07b87 100644 --- a/providers/dns/stackpath/stackpath.go +++ b/providers/dns/stackpath/stackpath.go @@ -10,7 +10,6 @@ import ( "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" "github.com/go-acme/lego/v5/providers/dns/stackpath/internal" @@ -105,7 +104,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { zone, err := d.client.GetZones(ctx, info.EffectiveFQDN) if err != nil { - return fmt.Errorf("stackpath: %w", err) + return fmt.Errorf("stackpath: get zones: %w", err) } subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, zone.Domain) @@ -120,7 +119,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { Data: info.Value, } - return d.client.CreateZoneRecord(ctx, zone, record) + err = d.client.CreateZoneRecord(ctx, zone, record) + if err != nil { + return fmt.Errorf("stackpath: create zone record: %w", err) + } + + return nil } // CleanUp removes the TXT record matching the specified parameters. @@ -131,7 +135,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { zone, err := d.client.GetZones(ctx, info.EffectiveFQDN) if err != nil { - return fmt.Errorf("stackpath: %w", err) + return fmt.Errorf("stackpath: get zones: %w", err) } subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, zone.Domain) @@ -141,13 +145,13 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { records, err := d.client.GetZoneRecords(ctx, subDomain, zone) if err != nil { - return err + return fmt.Errorf("stackpath: get zone records: %w", err) } for _, record := range records { err = d.client.DeleteZoneRecord(ctx, zone, record) if err != nil { - log.Printf("stackpath: failed to delete TXT record: %v", err) + return fmt.Errorf("stackpath: delete zone record: %w", err) } } diff --git a/providers/dns/variomedia/variomedia.go b/providers/dns/variomedia/variomedia.go index 1325972a0..df9e2da52 100644 --- a/providers/dns/variomedia/variomedia.go +++ b/providers/dns/variomedia/variomedia.go @@ -13,7 +13,6 @@ import ( "github.com/cenkalti/backoff/v5" "github.com/go-acme/lego/v5/challenge" "github.com/go-acme/lego/v5/challenge/dns01" - "github.com/go-acme/lego/v5/log" "github.com/go-acme/lego/v5/platform/config/env" "github.com/go-acme/lego/v5/platform/wait" "github.com/go-acme/lego/v5/providers/dns/internal/clientdebug" @@ -195,8 +194,6 @@ func (d *DNSProvider) waitJob(ctx context.Context, domain, id string) error { return fmt.Errorf("apply change on %s: %w", domain, err) } - log.Infof("variomedia: [%s] %s: %s %s", domain, result.Data.ID, result.Data.Attributes.JobType, result.Data.Attributes.Status) - if result.Data.Attributes.Status != "done" { return fmt.Errorf("apply change on %s: status: %s", domain, result.Data.Attributes.Status) }