fix: sequential

This commit is contained in:
Fernandez Ludovic 2026-02-18 14:15:25 +01:00
commit 3c685f8473
5 changed files with 15 additions and 4 deletions

View file

@ -375,6 +375,7 @@ func displayDNSHelp(w io.Writer, name string) error {
ew.writeln(` - "ARTFILES_HTTP_TIMEOUT": API request timeout in seconds (Default: 30)`)
ew.writeln(` - "ARTFILES_POLLING_INTERVAL": Time between DNS propagation check in seconds (Default: 2)`)
ew.writeln(` - "ARTFILES_PROPAGATION_TIMEOUT": Maximum waiting time for DNS propagation in seconds (Default: 360)`)
ew.writeln(` - "ARTFILES_SEQUENCE_INTERVAL": Time between sequential requests in seconds (Default: 10)`)
ew.writeln(` - "ARTFILES_TTL": The TTL of the TXT record used for the DNS challenge in seconds (Default: 120)`)
ew.writeln()

View file

@ -52,6 +52,7 @@ More information [here]({{% ref "dns#configuration-and-credentials" %}}).
| `ARTFILES_HTTP_TIMEOUT` | API request timeout in seconds (Default: 30) |
| `ARTFILES_POLLING_INTERVAL` | Time between DNS propagation check in seconds (Default: 2) |
| `ARTFILES_PROPAGATION_TIMEOUT` | Maximum waiting time for DNS propagation in seconds (Default: 360) |
| `ARTFILES_SEQUENCE_INTERVAL` | Time between sequential requests in seconds (Default: 10) |
| `ARTFILES_TTL` | The TTL of the TXT record used for the DNS challenge in seconds (Default: 120) |
The environment variable names can be suffixed by `_FILE` to reference a file instead of a value.

View file

@ -23,6 +23,7 @@ const (
EnvUsername = envNamespace + "USERNAME"
EnvPassword = envNamespace + "PASSWORD"
EnvSequenceInterval = envNamespace + "SEQUENCE_INTERVAL"
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
@ -33,6 +34,7 @@ type Config struct {
Username string
Password string
SequenceInterval time.Duration
PropagationTimeout time.Duration
PollingInterval time.Duration
HTTPClient *http.Client
@ -43,6 +45,7 @@ func NewDefaultConfig() *Config {
return &Config{
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 6*time.Minute),
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
SequenceInterval: env.GetOrDefaultSecond(EnvSequenceInterval, 10*time.Second),
HTTPClient: &http.Client{
Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
},
@ -126,7 +129,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
return fmt.Errorf("artfiles: %w", err)
}
rv.Add(subDomain, info.Value)
rv.Set(subDomain, info.Value)
err = d.client.SetRecords(ctx, zone, "TXT", rv)
if err != nil {
@ -166,7 +169,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
return fmt.Errorf("artfiles: %w", err)
}
rv.RemoveValue(subDomain, info.Value)
rv.Delete(subDomain)
err = d.client.SetRecords(ctx, zone, "TXT", rv)
if err != nil {
@ -182,6 +185,12 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
return d.config.PropagationTimeout, d.config.PollingInterval
}
// Sequential All DNS challenges for this provider will be resolved sequentially.
// Returns the interval between each iteration.
func (d *DNSProvider) Sequential() time.Duration {
return d.config.SequenceInterval
}
func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (string, error) {
domains, err := d.client.GetDomains(ctx)
if err != nil {

View file

@ -17,6 +17,7 @@ lego --dns artfiles -d '*.example.com' -d example.com run
[Configuration.Additional]
ARTFILES_POLLING_INTERVAL = "Time between DNS propagation check in seconds (Default: 2)"
ARTFILES_PROPAGATION_TIMEOUT = "Maximum waiting time for DNS propagation in seconds (Default: 360)"
ARTFILES_SEQUENCE_INTERVAL = "Time between sequential requests in seconds (Default: 10)"
ARTFILES_TTL = "The TTL of the TXT record used for the DNS challenge in seconds (Default: 120)"
ARTFILES_HTTP_TIMEOUT = "API request timeout in seconds (Default: 30)"

View file

@ -184,7 +184,7 @@ func TestDNSProvider_Present(t *testing.T) {
servermock.ResponseFromInternal("set_dns.json"),
servermock.CheckQueryParameter().Strict().
With("TXT", `@ "v=spf1 a mx ~all"
_acme-challenge "TheAcmeChallenge" "ADw2sEd82DUgXcQ9hNBZThJs7zVJkR5v9JeSbAb9mZY"
_acme-challenge "ADw2sEd82DUgXcQ9hNBZThJs7zVJkR5v9JeSbAb9mZY"
_dmarc "v=DMARC1;p=reject;sp=reject;adkim=r;aspf=r;pct=100;rua=mailto:someone@in.mailhardener.com,mailto:postmaster@example.tld;ri=86400;ruf=mailto:someone@in.mailhardener.com,mailto:postmaster@example.tld;fo=1;rf=afrf"
_mta-sts "v=STSv1;id=yyyymmddTHHMMSS;"
_smtp._tls "v=TLSRPTv1;rua=mailto:someone@in.mailhardener.com"
@ -212,7 +212,6 @@ func TestDNSProvider_CleanUp(t *testing.T) {
servermock.ResponseFromInternal("set_dns.json"),
servermock.CheckQueryParameter().Strict().
With("TXT", `@ "v=spf1 a mx ~all"
_acme-challenge "TheAcmeChallenge"
_dmarc "v=DMARC1;p=reject;sp=reject;adkim=r;aspf=r;pct=100;rua=mailto:someone@in.mailhardener.com,mailto:postmaster@example.tld;ri=86400;ruf=mailto:someone@in.mailhardener.com,mailto:postmaster@example.tld;fo=1;rf=afrf"
_mta-sts "v=STSv1;id=yyyymmddTHHMMSS;"
_smtp._tls "v=TLSRPTv1;rua=mailto:someone@in.mailhardener.com"