@@ -33,6 +33,7 @@ import (
33
33
"github.com/mholt/acmez"
34
34
"github.com/mholt/acmez/acme"
35
35
"github.com/miekg/dns"
36
+ "go.uber.org/zap"
36
37
)
37
38
38
39
// httpSolver solves the HTTP challenge. It must be
@@ -357,6 +358,9 @@ type DNSManager struct {
357
358
// that the solver doesn't follow CNAME/NS record.
358
359
OverrideDomain string
359
360
361
+ // An optional logger.
362
+ Logger * zap.Logger
363
+
360
364
// Remember DNS records while challenges are active; i.e.
361
365
// records we have presented and not yet cleaned up.
362
366
// This lets us clean them up quickly and efficiently.
@@ -373,7 +377,9 @@ type DNSManager struct {
373
377
}
374
378
375
379
func (m * DNSManager ) createRecord (ctx context.Context , dnsName , recordType , recordValue string ) (zoneRecord , error ) {
376
- zone , err := findZoneByFQDN (dnsName , recursiveNameservers (m .Resolvers ))
380
+ logger := m .logger ()
381
+
382
+ zone , err := findZoneByFQDN (logger , dnsName , recursiveNameservers (m .Resolvers ))
377
383
if err != nil {
378
384
return zoneRecord {}, fmt .Errorf ("could not determine zone for domain %q: %v" , dnsName , err )
379
385
}
@@ -384,6 +390,14 @@ func (m *DNSManager) createRecord(ctx context.Context, dnsName, recordType, reco
384
390
TTL : m .TTL ,
385
391
}
386
392
393
+ logger .Debug ("creating DNS record" ,
394
+ zap .String ("dns_name" , dnsName ),
395
+ zap .String ("zone" , zone ),
396
+ zap .String ("record_name" , rec .Name ),
397
+ zap .String ("record_type" , rec .Type ),
398
+ zap .String ("record_value" , rec .Value ),
399
+ zap .Duration ("record_ttl" , rec .TTL ))
400
+
387
401
results , err := m .DNSProvider .AppendRecords (ctx , zone , []libdns.Record {rec })
388
402
if err != nil {
389
403
return zoneRecord {}, fmt .Errorf ("adding temporary record for zone %q: %w" , zone , err )
@@ -398,32 +412,34 @@ func (m *DNSManager) createRecord(ctx context.Context, dnsName, recordType, reco
398
412
// wait blocks until the TXT record created in Present() appears in
399
413
// authoritative lookups, i.e. until it has propagated, or until
400
414
// timeout, whichever is first.
401
- func (s * DNSManager ) wait (ctx context.Context , zrec zoneRecord ) error {
415
+ func (m * DNSManager ) wait (ctx context.Context , zrec zoneRecord ) error {
416
+ logger := m .logger ()
417
+
402
418
// if configured to, pause before doing propagation checks
403
419
// (even if they are disabled, the wait might be desirable on its own)
404
- if s .PropagationDelay > 0 {
420
+ if m .PropagationDelay > 0 {
405
421
select {
406
- case <- time .After (s .PropagationDelay ):
422
+ case <- time .After (m .PropagationDelay ):
407
423
case <- ctx .Done ():
408
424
return ctx .Err ()
409
425
}
410
426
}
411
427
412
428
// skip propagation checks if configured to do so
413
- if s .PropagationTimeout == - 1 {
429
+ if m .PropagationTimeout == - 1 {
414
430
return nil
415
431
}
416
432
417
433
// timings
418
- timeout := s .PropagationTimeout
434
+ timeout := m .PropagationTimeout
419
435
if timeout == 0 {
420
436
timeout = defaultDNSPropagationTimeout
421
437
}
422
438
const interval = 2 * time .Second
423
439
424
440
// how we'll do the checks
425
- checkAuthoritativeServers := len (s .Resolvers ) == 0
426
- resolvers := recursiveNameservers (s .Resolvers )
441
+ checkAuthoritativeServers := len (m .Resolvers ) == 0
442
+ resolvers := recursiveNameservers (m .Resolvers )
427
443
428
444
recType := dns .TypeTXT
429
445
if zrec .record .Type == "CNAME" {
@@ -440,8 +456,15 @@ func (s *DNSManager) wait(ctx context.Context, zrec zoneRecord) error {
440
456
case <- ctx .Done ():
441
457
return ctx .Err ()
442
458
}
459
+
460
+ logger .Debug ("checking DNS propagation" ,
461
+ zap .String ("fqdn" , absName ),
462
+ zap .String ("record_type" , zrec .record .Type ),
463
+ zap .String ("expected_value" , zrec .record .Value ),
464
+ zap .Strings ("resolvers" , resolvers ))
465
+
443
466
var ready bool
444
- ready , err = checkDNSPropagation (absName , recType , zrec .record .Value , checkAuthoritativeServers , resolvers )
467
+ ready , err = checkDNSPropagation (logger , absName , recType , zrec .record .Value , checkAuthoritativeServers , resolvers )
445
468
if err != nil {
446
469
return fmt .Errorf ("checking DNS propagation of %q (relative=%s zone=%s resolvers=%v): %w" , absName , zrec .record .Name , zrec .zone , resolvers , err )
447
470
}
@@ -464,25 +487,43 @@ type zoneRecord struct {
464
487
// a context cancellation, and properly-implemented DNS providers should
465
488
// honor cancellation, which would result in cleanup being aborted.
466
489
// Cleanup must always occur.
467
- func (s * DNSManager ) cleanUpRecord (_ context.Context , zrec zoneRecord ) error {
490
+ func (m * DNSManager ) cleanUpRecord (_ context.Context , zrec zoneRecord ) error {
491
+ logger := m .logger ()
492
+
468
493
// clean up the record - use a different context though, since
469
494
// one common reason cleanup is performed is because a context
470
495
// was canceled, and if so, any HTTP requests by this provider
471
496
// should fail if the provider is properly implemented
472
497
// (see issue #200)
473
- timeout := s .PropagationTimeout
498
+ timeout := m .PropagationTimeout
474
499
if timeout <= 0 {
475
500
timeout = defaultDNSPropagationTimeout
476
501
}
477
502
ctx , cancel := context .WithTimeout (context .Background (), timeout )
478
503
defer cancel ()
479
- _ , err := s .DNSProvider .DeleteRecords (ctx , zrec .zone , []libdns.Record {zrec .record })
504
+
505
+ logger .Debug ("deleting DNS record" ,
506
+ zap .String ("zone" , zrec .zone ),
507
+ zap .String ("record_id" , zrec .record .ID ),
508
+ zap .String ("record_name" , zrec .record .Name ),
509
+ zap .String ("record_type" , zrec .record .Type ),
510
+ zap .String ("record_value" , zrec .record .Value ))
511
+
512
+ _ , err := m .DNSProvider .DeleteRecords (ctx , zrec .zone , []libdns.Record {zrec .record })
480
513
if err != nil {
481
514
return fmt .Errorf ("deleting temporary record for name %q in zone %q: %w" , zrec .zone , zrec .record , err )
482
515
}
483
516
return nil
484
517
}
485
518
519
+ func (m * DNSManager ) logger () * zap.Logger {
520
+ logger := m .Logger
521
+ if logger == nil {
522
+ logger = zap .NewNop ()
523
+ }
524
+ return logger .Named ("dns_manager" )
525
+ }
526
+
486
527
const defaultDNSPropagationTimeout = 2 * time .Minute
487
528
488
529
// dnsPresentMemory associates a created DNS record with its zone
0 commit comments