refactor: logs inside DNS providers

This commit is contained in:
Fernandez Ludovic 2026-01-10 05:16:38 +01:00
commit eb28e75200
32 changed files with 95 additions and 143 deletions

View file

@ -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{

View file

@ -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

View file

@ -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)

View file

@ -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"

View file

@ -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
}

View file

@ -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()

View file

@ -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

View file

@ -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()

View file

@ -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)
})

View file

@ -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")
}

View file

@ -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 == "" {

View file

@ -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
}

View file

@ -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()

View file

@ -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,

View file

@ -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)

View file

@ -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)

View file

@ -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)
}

View file

@ -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)

View file

@ -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)

View file

@ -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),

View file

@ -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() {

View file

@ -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.

View file

@ -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(

View file

@ -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
}

View file

@ -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)

View file

@ -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)
}
}()

View file

@ -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 '<obj>.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

View file

@ -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())

View file

@ -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
}

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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)
}