forked from go-acme/lego
-
Notifications
You must be signed in to change notification settings - Fork 2
/
autodns.go
127 lines (103 loc) · 3.07 KB
/
autodns.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package autodns
import (
"fmt"
"net/http"
"net/url"
"time"
"github.com/go-acme/lego/v3/challenge/dns01"
"github.com/go-acme/lego/v3/platform/config/env"
)
const (
envAPIUser = "AUTODNS_API_USER"
envAPIPassword = "AUTODNS_API_PASSWORD"
envAPIEndpoint = "AUTODNS_ENDPOINT"
envAPIEndpointContext = "AUTODNS_CONTEXT"
envTTL = "AUTODNS_TTL"
envPropagationTimeout = "AUTODNS_PROPAGATION_TIMEOUT"
envPollingInterval = "AUTODNS_POLLING_INTERVAL"
envHTTPTimeout = "AUTODNS_HTTP_TIMEOUT"
)
const (
defaultEndpointContext int = 4
defaultTTL int = 600
)
type Config struct {
Endpoint *url.URL
Username string
Password string
Context int
TTL int
PropagationTimeout time.Duration
PollingInterval time.Duration
HTTPClient *http.Client
}
func NewDefaultConfig() *Config {
endpoint, _ := url.Parse(env.GetOrDefaultString(envAPIEndpoint, defaultEndpoint))
return &Config{
Endpoint: endpoint,
Context: env.GetOrDefaultInt(envAPIEndpointContext, defaultEndpointContext),
TTL: env.GetOrDefaultInt(envTTL, defaultTTL),
PropagationTimeout: env.GetOrDefaultSecond(envPropagationTimeout, 2*time.Minute),
PollingInterval: env.GetOrDefaultSecond(envPollingInterval, 2*time.Second),
HTTPClient: &http.Client{
Timeout: env.GetOrDefaultSecond(envHTTPTimeout, 30*time.Second),
},
}
}
type DNSProvider struct {
config *Config
}
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
return d.config.PropagationTimeout, d.config.PollingInterval
}
func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(envAPIUser, envAPIPassword)
if err != nil {
return nil, fmt.Errorf("autodns: %v", err)
}
config := NewDefaultConfig()
config.Username = values[envAPIUser]
config.Password = values[envAPIPassword]
return NewDNSProviderConfig(config)
}
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
if config == nil {
return nil, fmt.Errorf("autodns: config is nil")
}
if config.Username == "" {
return nil, fmt.Errorf("autodns: missing user")
}
if config.Password == "" {
return nil, fmt.Errorf("autodns: missing password")
}
return &DNSProvider{config: config}, nil
}
// Present creates a TXT record to fulfill the dns-01 challenge
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
fqdn, value := dns01.GetRecord(domain, keyAuth)
records := []*ResourceRecord{{
Name: fqdn,
TTL: int64(d.config.TTL),
Type: "TXT",
Value: value,
}}
_, err := d.addTxtRecord(domain, records)
if err != nil {
return fmt.Errorf("autodns: %v", err)
}
return nil
}
// CleanUp removes the TXT record previously created
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
fqdn, value := dns01.GetRecord(domain, keyAuth)
records := []*ResourceRecord{{
Name: fqdn,
TTL: int64(d.config.TTL),
Type: "TXT",
Value: value,
}}
if err := d.removeTXTRecord(domain, records); err != nil {
return fmt.Errorf("autodns: %v", err)
}
return nil
}