forked from TrueCloudLab/lego
chore: wrap errors. (#1070)
This commit is contained in:
parent
9d31db300b
commit
2da1ce06ea
114 changed files with 584 additions and 565 deletions
|
@ -31,12 +31,12 @@ func (a *AccountService) New(req acme.Account) (acme.ExtendedAccount, error) {
|
||||||
func (a *AccountService) NewEAB(accMsg acme.Account, kid string, hmacEncoded string) (acme.ExtendedAccount, error) {
|
func (a *AccountService) NewEAB(accMsg acme.Account, kid string, hmacEncoded string) (acme.ExtendedAccount, error) {
|
||||||
hmac, err := base64.RawURLEncoding.DecodeString(hmacEncoded)
|
hmac, err := base64.RawURLEncoding.DecodeString(hmacEncoded)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return acme.ExtendedAccount{}, fmt.Errorf("acme: could not decode hmac key: %v", err)
|
return acme.ExtendedAccount{}, fmt.Errorf("acme: could not decode hmac key: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
eabJWS, err := a.core.signEABContent(a.core.GetDirectory().NewAccountURL, kid, hmac)
|
eabJWS, err := a.core.signEABContent(a.core.GetDirectory().NewAccountURL, kid, hmac)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return acme.ExtendedAccount{}, fmt.Errorf("acme: error signing eab content: %v", err)
|
return acme.ExtendedAccount{}, fmt.Errorf("acme: error signing eab content: %w", err)
|
||||||
}
|
}
|
||||||
accMsg.ExternalAccountBinding = eabJWS
|
accMsg.ExternalAccountBinding = eabJWS
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,7 @@ func (a *Core) retrievablePost(uri string, content []byte, response interface{})
|
||||||
func (a *Core) signedPost(uri string, content []byte, response interface{}) (*http.Response, error) {
|
func (a *Core) signedPost(uri string, content []byte, response interface{}) (*http.Response, error) {
|
||||||
signedContent, err := a.jws.SignContent(uri, content)
|
signedContent, err := a.jws.SignContent(uri, content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to post JWS message -> failed to sign content -> %v", err)
|
return nil, fmt.Errorf("failed to post JWS message -> failed to sign content -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
signedBody := bytes.NewBuffer([]byte(signedContent.FullSerialize()))
|
signedBody := bytes.NewBuffer([]byte(signedContent.FullSerialize()))
|
||||||
|
@ -155,7 +155,7 @@ func (a *Core) GetDirectory() acme.Directory {
|
||||||
func getDirectory(do *sender.Doer, caDirURL string) (acme.Directory, error) {
|
func getDirectory(do *sender.Doer, caDirURL string) (acme.Directory, error) {
|
||||||
var dir acme.Directory
|
var dir acme.Directory
|
||||||
if _, err := do.Get(caDirURL, &dir); err != nil {
|
if _, err := do.Get(caDirURL, &dir); err != nil {
|
||||||
return dir, fmt.Errorf("get directory at '%s': %v", caDirURL, err)
|
return dir, fmt.Errorf("get directory at '%s': %w", caDirURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if dir.NewAccountURL == "" {
|
if dir.NewAccountURL == "" {
|
||||||
|
|
|
@ -57,7 +57,7 @@ func (n *Manager) Nonce() (string, error) {
|
||||||
func (n *Manager) getNonce() (string, error) {
|
func (n *Manager) getNonce() (string, error) {
|
||||||
resp, err := n.do.Head(n.nonceURL)
|
resp, err := n.do.Head(n.nonceURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to get nonce from HTTP HEAD -> %v", err)
|
return "", fmt.Errorf("failed to get nonce from HTTP HEAD -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetFromResponse(resp)
|
return GetFromResponse(resp)
|
||||||
|
@ -71,7 +71,7 @@ func GetFromResponse(resp *http.Response) (string, error) {
|
||||||
|
|
||||||
nonce := resp.Header.Get("Replay-Nonce")
|
nonce := resp.Header.Get("Replay-Nonce")
|
||||||
if nonce == "" {
|
if nonce == "" {
|
||||||
return "", fmt.Errorf("server did not respond with a proper nonce header")
|
return "", errors.New("server did not respond with a proper nonce header")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nonce, nil
|
return nonce, nil
|
||||||
|
|
|
@ -65,12 +65,12 @@ func (j *JWS) SignContent(url string, content []byte) (*jose.JSONWebSignature, e
|
||||||
|
|
||||||
signer, err := jose.NewSigner(signKey, &options)
|
signer, err := jose.NewSigner(signKey, &options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create jose signer -> %v", err)
|
return nil, fmt.Errorf("failed to create jose signer -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
signed, err := signer.Sign(content)
|
signed, err := signer.Sign(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to sign content -> %v", err)
|
return nil, fmt.Errorf("failed to sign content -> %w", err)
|
||||||
}
|
}
|
||||||
return signed, nil
|
return signed, nil
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ func (j *JWS) SignEABContent(url, kid string, hmac []byte) (*jose.JSONWebSignatu
|
||||||
jwk := jose.JSONWebKey{Key: j.privKey}
|
jwk := jose.JSONWebKey{Key: j.privKey}
|
||||||
jwkJSON, err := jwk.Public().MarshalJSON()
|
jwkJSON, err := jwk.Public().MarshalJSON()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("acme: error encoding eab jwk key: %v", err)
|
return nil, fmt.Errorf("acme: error encoding eab jwk key: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
signer, err := jose.NewSigner(
|
signer, err := jose.NewSigner(
|
||||||
|
@ -94,12 +94,12 @@ func (j *JWS) SignEABContent(url, kid string, hmac []byte) (*jose.JSONWebSignatu
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create External Account Binding jose signer -> %v", err)
|
return nil, fmt.Errorf("failed to create External Account Binding jose signer -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
signed, err := signer.Sign(jwkJSON)
|
signed, err := signer.Sign(jwkJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to External Account Binding sign content -> %v", err)
|
return nil, fmt.Errorf("failed to External Account Binding sign content -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return signed, nil
|
return signed, nil
|
||||||
|
|
|
@ -70,7 +70,7 @@ func (d *Doer) Post(url string, body io.Reader, bodyType string, response interf
|
||||||
func (d *Doer) newRequest(method, uri string, body io.Reader, opts ...RequestOption) (*http.Request, error) {
|
func (d *Doer) newRequest(method, uri string, body io.Reader, opts ...RequestOption) (*http.Request, error) {
|
||||||
req, err := http.NewRequest(method, uri, body)
|
req, err := http.NewRequest(method, uri, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create request: %v", err)
|
return nil, fmt.Errorf("failed to create request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("User-Agent", d.formatUserAgent())
|
req.Header.Set("User-Agent", d.formatUserAgent())
|
||||||
|
@ -78,7 +78,7 @@ func (d *Doer) newRequest(method, uri string, body io.Reader, opts ...RequestOpt
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
err = opt(req)
|
err = opt(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create request: %v", err)
|
return nil, fmt.Errorf("failed to create request: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ func (d *Doer) do(req *http.Request, response interface{}) (*http.Response, erro
|
||||||
|
|
||||||
err = json.Unmarshal(raw, response)
|
err = json.Unmarshal(raw, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, fmt.Errorf("failed to unmarshal %q to type %T: %v", raw, response, err)
|
return resp, fmt.Errorf("failed to unmarshal %q to type %T: %w", raw, response, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,13 +122,13 @@ func checkError(req *http.Request, resp *http.Response) error {
|
||||||
if resp.StatusCode >= http.StatusBadRequest {
|
if resp.StatusCode >= http.StatusBadRequest {
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d :: %s :: %s :: %v", resp.StatusCode, req.Method, req.URL, err)
|
return fmt.Errorf("%d :: %s :: %s :: %w", resp.StatusCode, req.Method, req.URL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var errorDetails *acme.ProblemDetails
|
var errorDetails *acme.ProblemDetails
|
||||||
err = json.Unmarshal(body, &errorDetails)
|
err = json.Unmarshal(body, &errorDetails)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d ::%s :: %s :: %v :: %s", resp.StatusCode, req.Method, req.URL, err, string(body))
|
return fmt.Errorf("%d ::%s :: %s :: %w :: %s", resp.StatusCode, req.Method, req.URL, err, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
errorDetails.Method = req.Method
|
errorDetails.Method = req.Method
|
||||||
|
|
|
@ -167,7 +167,7 @@ func PEMBlock(data interface{}) *pem.Block {
|
||||||
func pemDecode(data []byte) (*pem.Block, error) {
|
func pemDecode(data []byte) (*pem.Block, error) {
|
||||||
pemBlock, _ := pem.Decode(data)
|
pemBlock, _ := pem.Decode(data)
|
||||||
if pemBlock == nil {
|
if pemBlock == nil {
|
||||||
return nil, fmt.Errorf("PEM decode did not yield a valid block. Is the certificate in the right format?")
|
return nil, errors.New("PEM decode did not yield a valid block. Is the certificate in the right format?")
|
||||||
}
|
}
|
||||||
|
|
||||||
return pemBlock, nil
|
return pemBlock, nil
|
||||||
|
@ -180,7 +180,7 @@ func PemDecodeTox509CSR(pem []byte) (*x509.CertificateRequest, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if pemBlock.Type != "CERTIFICATE REQUEST" {
|
if pemBlock.Type != "CERTIFICATE REQUEST" {
|
||||||
return nil, fmt.Errorf("PEM block is not a certificate request")
|
return nil, errors.New("PEM block is not a certificate request")
|
||||||
}
|
}
|
||||||
|
|
||||||
return x509.ParseCertificateRequest(pemBlock.Bytes)
|
return x509.ParseCertificateRequest(pemBlock.Bytes)
|
||||||
|
|
|
@ -317,7 +317,7 @@ func (c *Certifier) Revoke(cert []byte) error {
|
||||||
|
|
||||||
x509Cert := certificates[0]
|
x509Cert := certificates[0]
|
||||||
if x509Cert.IsCA {
|
if x509Cert.IsCA {
|
||||||
return fmt.Errorf("certificate bundle starts with a CA certificate")
|
return errors.New("certificate bundle starts with a CA certificate")
|
||||||
}
|
}
|
||||||
|
|
||||||
revokeMsg := acme.RevokeCertMessage{
|
revokeMsg := acme.RevokeCertMessage{
|
||||||
|
|
|
@ -93,7 +93,7 @@ func (c *Challenge) PreSolve(authz acme.Authorization) error {
|
||||||
|
|
||||||
err = c.provider.Present(authz.Identifier.Value, chlng.Token, keyAuth)
|
err = c.provider.Present(authz.Identifier.Value, chlng.Token, keyAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("[%s] acme: error presenting token: %s", domain, err)
|
return fmt.Errorf("[%s] acme: error presenting token: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package dns01
|
package dns01
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -98,7 +99,7 @@ func lookupNameservers(fqdn string) ([]string, error) {
|
||||||
|
|
||||||
zone, err := FindZoneByFqdn(fqdn)
|
zone, err := FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not determine the zone: %v", err)
|
return nil, fmt.Errorf("could not determine the zone: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := dnsQuery(zone, dns.TypeNS, recursiveNameservers, true)
|
r, err := dnsQuery(zone, dns.TypeNS, recursiveNameservers, true)
|
||||||
|
@ -115,7 +116,7 @@ func lookupNameservers(fqdn string) ([]string, error) {
|
||||||
if len(authoritativeNss) > 0 {
|
if len(authoritativeNss) > 0 {
|
||||||
return authoritativeNss, nil
|
return authoritativeNss, nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("could not determine authoritative nameservers")
|
return nil, errors.New("could not determine authoritative nameservers")
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindPrimaryNsByFqdn determines the primary nameserver of the zone apex for the given fqdn
|
// FindPrimaryNsByFqdn determines the primary nameserver of the zone apex for the given fqdn
|
||||||
|
|
|
@ -51,7 +51,7 @@ func (c *Challenge) Solve(authz acme.Authorization) error {
|
||||||
|
|
||||||
err = c.provider.Present(authz.Identifier.Value, chlng.Token, keyAuth)
|
err = c.provider.Present(authz.Identifier.Value, chlng.Token, keyAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("[%s] acme: error presenting token: %v", domain, err)
|
return fmt.Errorf("[%s] acme: error presenting token: %w", domain, err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
err := c.provider.CleanUp(authz.Identifier.Value, chlng.Token, keyAuth)
|
err := c.provider.CleanUp(authz.Identifier.Value, chlng.Token, keyAuth)
|
||||||
|
|
|
@ -37,7 +37,7 @@ func (s *ProviderServer) Present(domain, token, keyAuth string) error {
|
||||||
var err error
|
var err error
|
||||||
s.listener, err = net.Listen("tcp", s.GetAddress())
|
s.listener, err = net.Listen("tcp", s.GetAddress())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not start HTTP server for challenge -> %v", err)
|
return fmt.Errorf("could not start HTTP server for challenge -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.done = make(chan bool)
|
s.done = make(chan bool)
|
||||||
|
|
|
@ -79,7 +79,7 @@ func (c *SolverManager) chooseSolver(authz acme.Authorization) solver {
|
||||||
func validate(core *api.Core, domain string, chlg acme.Challenge) error {
|
func validate(core *api.Core, domain string, chlg acme.Challenge) error {
|
||||||
chlng, err := core.Challenges.New(chlg.URL)
|
chlng, err := core.Challenges.New(chlg.URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to initiate challenge: %v", err)
|
return fmt.Errorf("failed to initiate challenge: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
valid, err := checkChallengeStatus(chlng)
|
valid, err := checkChallengeStatus(chlng)
|
||||||
|
|
|
@ -57,7 +57,7 @@ func (c *Challenge) Solve(authz acme.Authorization) error {
|
||||||
|
|
||||||
err = c.provider.Present(domain, chlng.Token, keyAuth)
|
err = c.provider.Present(domain, chlng.Token, keyAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("[%s] acme: error presenting token: %v", challenge.GetTargetedDomain(authz), err)
|
return fmt.Errorf("[%s] acme: error presenting token: %w", challenge.GetTargetedDomain(authz), err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
err := c.provider.CleanUp(domain, chlng.Token, keyAuth)
|
err := c.provider.CleanUp(domain, chlng.Token, keyAuth)
|
||||||
|
|
|
@ -66,7 +66,7 @@ func (s *ProviderServer) Present(domain, token, keyAuth string) error {
|
||||||
// Create the listener with the created tls.Config.
|
// Create the listener with the created tls.Config.
|
||||||
s.listener, err = tls.Listen("tcp", s.GetAddress(), tlsConf)
|
s.listener, err = tls.Listen("tcp", s.GetAddress(), tlsConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not start HTTPS server for challenge -> %v", err)
|
return fmt.Errorf("could not start HTTPS server for challenge -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shut the server down when we're finished.
|
// Shut the server down when we're finished.
|
||||||
|
|
|
@ -1480,7 +1480,7 @@ func displayDNSHelp(name string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ew.err != nil {
|
if ew.err != nil {
|
||||||
return fmt.Errorf("error: %v", ew.err)
|
return fmt.Errorf("error: %w", ew.err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.Flush()
|
return w.Flush()
|
||||||
|
|
|
@ -288,7 +288,7 @@ func goTool() (string, error) {
|
||||||
|
|
||||||
goBin, err := exec.LookPath("go" + exeSuffix)
|
goBin, err := exec.LookPath("go" + exeSuffix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("cannot find go tool: %v", err)
|
return "", fmt.Errorf("cannot find go tool: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return goBin, nil
|
return goBin, nil
|
||||||
|
|
|
@ -56,7 +56,7 @@ func displayDNSHelp(name string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ew.err != nil {
|
if ew.err != nil {
|
||||||
return fmt.Errorf("error: %v", ew.err)
|
return fmt.Errorf("error: %w", ew.err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.Flush()
|
return w.Flush()
|
||||||
|
|
|
@ -11,12 +11,12 @@ import (
|
||||||
func For(msg string, timeout, interval time.Duration, f func() (bool, error)) error {
|
func For(msg string, timeout, interval time.Duration, f func() (bool, error)) error {
|
||||||
log.Infof("Wait for %s [timeout: %s, interval: %s]", msg, timeout, interval)
|
log.Infof("Wait for %s [timeout: %s, interval: %s]", msg, timeout, interval)
|
||||||
|
|
||||||
var lastErr string
|
var lastErr error
|
||||||
timeUp := time.After(timeout)
|
timeUp := time.After(timeout)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-timeUp:
|
case <-timeUp:
|
||||||
return fmt.Errorf("time limit exceeded: last error: %s", lastErr)
|
return fmt.Errorf("time limit exceeded: last error: %w", lastErr)
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ func For(msg string, timeout, interval time.Duration, f func() (bool, error)) er
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastErr = err.Error()
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(interval)
|
time.Sleep(interval)
|
||||||
|
|
|
@ -45,7 +45,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get(apiBaseEnvVar, storagePathEnvVar)
|
values, err := env.Get(apiBaseEnvVar, storagePathEnvVar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("acme-dns: %v", err)
|
return nil, fmt.Errorf("acme-dns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client := goacmedns.NewClient(values[apiBaseEnvVar])
|
client := goacmedns.NewClient(values[apiBaseEnvVar])
|
||||||
|
|
|
@ -49,7 +49,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("ALICLOUD_ACCESS_KEY", "ALICLOUD_SECRET_KEY")
|
values, err := env.Get("ALICLOUD_ACCESS_KEY", "ALICLOUD_SECRET_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("alicloud: %v", err)
|
return nil, fmt.Errorf("alicloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -79,7 +79,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := alidns.NewClientWithOptions(config.RegionID, conf, credential)
|
client, err := alidns.NewClientWithOptions(config.RegionID, conf, credential)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("alicloud: credentials failed: %v", err)
|
return nil, fmt.Errorf("alicloud: credentials failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config, client: client}, nil
|
return &DNSProvider{config: config, client: client}, nil
|
||||||
|
@ -97,14 +97,14 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneName, err := d.getHostedZone(domain)
|
zoneName, err := d.getHostedZone(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("alicloud: %v", err)
|
return fmt.Errorf("alicloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordAttributes := d.newTxtRecord(zoneName, fqdn, value)
|
recordAttributes := d.newTxtRecord(zoneName, fqdn, value)
|
||||||
|
|
||||||
_, err = d.client.AddDomainRecord(recordAttributes)
|
_, err = d.client.AddDomainRecord(recordAttributes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("alicloud: API call failed: %v", err)
|
return fmt.Errorf("alicloud: API call failed: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -115,12 +115,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
records, err := d.findTxtRecords(domain, fqdn)
|
records, err := d.findTxtRecords(domain, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("alicloud: %v", err)
|
return fmt.Errorf("alicloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.getHostedZone(domain)
|
_, err = d.getHostedZone(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("alicloud: %v", err)
|
return fmt.Errorf("alicloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, rec := range records {
|
for _, rec := range records {
|
||||||
|
@ -128,7 +128,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
request.RecordId = rec.RecordId
|
request.RecordId = rec.RecordId
|
||||||
_, err = d.client.DeleteDomainRecord(request)
|
_, err = d.client.DeleteDomainRecord(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("alicloud: %v", err)
|
return fmt.Errorf("alicloud: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -145,7 +145,7 @@ func (d *DNSProvider) getHostedZone(domain string) (string, error) {
|
||||||
|
|
||||||
response, err := d.client.DescribeDomains(request)
|
response, err := d.client.DescribeDomains(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("API call failed: %v", err)
|
return "", fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
domains = append(domains, response.Domains.Domain...)
|
domains = append(domains, response.Domains.Domain...)
|
||||||
|
@ -200,7 +200,7 @@ func (d *DNSProvider) findTxtRecords(domain, fqdn string) ([]alidns.Record, erro
|
||||||
|
|
||||||
result, err := d.client.DescribeDomainRecords(request)
|
result, err := d.client.DescribeDomainRecords(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return records, fmt.Errorf("API call has failed: %v", err)
|
return records, fmt.Errorf("API call has failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordName := d.extractRecordName(fqdn, zoneName)
|
recordName := d.extractRecordName(fqdn, zoneName)
|
||||||
|
|
|
@ -47,7 +47,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("AURORA_USER_ID", "AURORA_KEY")
|
values, err := env.Get("AURORA_USER_ID", "AURORA_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("aurora: %v", err)
|
return nil, fmt.Errorf("aurora: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -74,12 +74,12 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
tr, err := auroradns.NewTokenTransport(config.UserID, config.Key)
|
tr, err := auroradns.NewTokenTransport(config.UserID, config.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("aurora: %v", err)
|
return nil, fmt.Errorf("aurora: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := auroradns.NewClient(tr.Client(), auroradns.WithBaseURL(config.BaseURL))
|
client, err := auroradns.NewClient(tr.Client(), auroradns.WithBaseURL(config.BaseURL))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("aurora: %v", err)
|
return nil, fmt.Errorf("aurora: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
|
@ -95,7 +95,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("aurora: could not determine zone for domain: '%s'. %s", domain, err)
|
return fmt.Errorf("aurora: could not determine zone for domain %q: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Aurora will happily create the TXT record when it is provided a fqdn,
|
// 1. Aurora will happily create the TXT record when it is provided a fqdn,
|
||||||
|
@ -111,7 +111,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getZoneInformationByName(authZone)
|
zone, err := d.getZoneInformationByName(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("aurora: could not create record: %v", err)
|
return fmt.Errorf("aurora: could not create record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record := auroradns.Record{
|
record := auroradns.Record{
|
||||||
|
@ -123,7 +123,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
newRecord, _, err := d.client.CreateRecord(zone.ID, record)
|
newRecord, _, err := d.client.CreateRecord(zone.ID, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("aurora: could not create record: %v", err)
|
return fmt.Errorf("aurora: could not create record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.recordIDsMu.Lock()
|
d.recordIDsMu.Lock()
|
||||||
|
@ -147,7 +147,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not determine zone for domain: %q. %v", domain, err)
|
return fmt.Errorf("could not determine zone for domain %q: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
authZone = dns01.UnFqdn(authZone)
|
authZone = dns01.UnFqdn(authZone)
|
||||||
|
@ -187,5 +187,5 @@ func (d *DNSProvider) getZoneInformationByName(name string) (auroradns.Zone, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return auroradns.Zone{}, fmt.Errorf("could not find Zone record")
|
return auroradns.Zone{}, errors.New("could not find Zone record")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package autodns
|
package autodns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -63,7 +64,7 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get(envAPIUser, envAPIPassword)
|
values, err := env.Get(envAPIUser, envAPIPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("autodns: %v", err)
|
return nil, fmt.Errorf("autodns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -75,15 +76,15 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
|
||||||
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, fmt.Errorf("autodns: config is nil")
|
return nil, errors.New("autodns: config is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Username == "" {
|
if config.Username == "" {
|
||||||
return nil, fmt.Errorf("autodns: missing user")
|
return nil, errors.New("autodns: missing user")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Password == "" {
|
if config.Password == "" {
|
||||||
return nil, fmt.Errorf("autodns: missing password")
|
return nil, errors.New("autodns: missing password")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config}, nil
|
return &DNSProvider{config: config}, nil
|
||||||
|
@ -102,7 +103,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err := d.addTxtRecord(domain, records)
|
_, err := d.addTxtRecord(domain, records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("autodns: %v", err)
|
return fmt.Errorf("autodns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -120,7 +121,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
}}
|
}}
|
||||||
|
|
||||||
if err := d.removeTXTRecord(domain, records); err != nil {
|
if err := d.removeTXTRecord(domain, records); err != nil {
|
||||||
return fmt.Errorf("autodns: %v", err)
|
return fmt.Errorf("autodns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -139,7 +139,7 @@ func (d *DNSProvider) sendRequest(req *http.Request, result interface{}) error {
|
||||||
|
|
||||||
err = json.Unmarshal(raw, result)
|
err = json.Unmarshal(raw, result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshaling %T error [status code=%d]: %v: %s", result, resp.StatusCode, err, string(raw))
|
return fmt.Errorf("unmarshaling %T error [status code=%d]: %w: %s", result, resp.StatusCode, err, string(raw))
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -157,7 +157,7 @@ func checkResponse(resp *http.Response) error {
|
||||||
|
|
||||||
raw, err := ioutil.ReadAll(resp.Body)
|
raw, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to read body: status code=%d, error=%v", resp.StatusCode, err)
|
return fmt.Errorf("unable to read body: status code=%d, error=%w", resp.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
||||||
|
|
|
@ -89,7 +89,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if config.SubscriptionID == "" {
|
if config.SubscriptionID == "" {
|
||||||
subsID, err := getMetadata(config, "subscriptionId")
|
subsID, err := getMetadata(config, "subscriptionId")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("azure: %v", err)
|
return nil, fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if subsID == "" {
|
if subsID == "" {
|
||||||
|
@ -101,7 +101,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if config.ResourceGroup == "" {
|
if config.ResourceGroup == "" {
|
||||||
resGroup, err := getMetadata(config, "resourceGroupName")
|
resGroup, err := getMetadata(config, "resourceGroupName")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("azure: %v", err)
|
return nil, fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if resGroup == "" {
|
if resGroup == "" {
|
||||||
|
@ -126,7 +126,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZoneID(ctx, fqdn)
|
zone, err := d.getHostedZoneID(ctx, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("azure: %v", err)
|
return fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rsc := dns.NewRecordSetsClient(d.config.SubscriptionID)
|
rsc := dns.NewRecordSetsClient(d.config.SubscriptionID)
|
||||||
|
@ -139,7 +139,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
detailedError, ok := err.(autorest.DetailedError)
|
detailedError, ok := err.(autorest.DetailedError)
|
||||||
if !ok || detailedError.StatusCode != http.StatusNotFound {
|
if !ok || detailedError.StatusCode != http.StatusNotFound {
|
||||||
return fmt.Errorf("azure: %v", err)
|
return fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = rsc.CreateOrUpdate(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, rec, "", "")
|
_, err = rsc.CreateOrUpdate(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, rec, "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("azure: %v", err)
|
return fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZoneID(ctx, fqdn)
|
zone, err := d.getHostedZoneID(ctx, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("azure: %v", err)
|
return fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
relative := toRelativeRecord(fqdn, dns01.ToFqdn(zone))
|
relative := toRelativeRecord(fqdn, dns01.ToFqdn(zone))
|
||||||
|
@ -190,7 +190,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = rsc.Delete(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, "")
|
_, err = rsc.Delete(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("azure: %v", err)
|
return fmt.Errorf("azure: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("BINDMAN_MANAGER_ADDRESS")
|
values, err := env.Get("BINDMAN_MANAGER_ADDRESS")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bindman: %v", err)
|
return nil, fmt.Errorf("bindman: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -59,12 +59,12 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.BaseURL == "" {
|
if config.BaseURL == "" {
|
||||||
return nil, fmt.Errorf("bindman: bindman manager address missing")
|
return nil, errors.New("bindman: bindman manager address missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
bClient, err := client.New(config.BaseURL, config.HTTPClient)
|
bClient, err := client.New(config.BaseURL, config.HTTPClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bindman: %v", err)
|
return nil, fmt.Errorf("bindman: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config, client: bClient}, nil
|
return &DNSProvider{config: config, client: bClient}, nil
|
||||||
|
@ -77,7 +77,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
||||||
|
|
||||||
if err := d.client.AddRecord(fqdn, "TXT", value); err != nil {
|
if err := d.client.AddRecord(fqdn, "TXT", value); err != nil {
|
||||||
return fmt.Errorf("bindman: %v", err)
|
return fmt.Errorf("bindman: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
fqdn, _ := dns01.GetRecord(domain, keyAuth)
|
fqdn, _ := dns01.GetRecord(domain, keyAuth)
|
||||||
|
|
||||||
if err := d.client.RemoveRecord(fqdn, "TXT"); err != nil {
|
if err := d.client.RemoveRecord(fqdn, "TXT"); err != nil {
|
||||||
return fmt.Errorf("bindman: %v", err)
|
return fmt.Errorf("bindman: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("BLUECAT_SERVER_URL", "BLUECAT_USER_NAME", "BLUECAT_PASSWORD", "BLUECAT_CONFIG_NAME", "BLUECAT_DNS_VIEW")
|
values, err := env.Get("BLUECAT_SERVER_URL", "BLUECAT_USER_NAME", "BLUECAT_PASSWORD", "BLUECAT_CONFIG_NAME", "BLUECAT_DNS_VIEW")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bluecat: %v", err)
|
return nil, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -81,7 +81,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.BaseURL == "" || config.UserName == "" || config.Password == "" || config.ConfigName == "" || config.DNSView == "" {
|
if config.BaseURL == "" || config.UserName == "" || config.Password == "" || config.ConfigName == "" || config.DNSView == "" {
|
||||||
return nil, fmt.Errorf("bluecat: credentials missing")
|
return nil, errors.New("bluecat: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config}, nil
|
return &DNSProvider{config: config}, nil
|
||||||
|
@ -174,7 +174,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
var txtRec entityResponse
|
var txtRec entityResponse
|
||||||
err = json.NewDecoder(resp.Body).Decode(&txtRec)
|
err = json.NewDecoder(resp.Body).Decode(&txtRec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("bluecat: %v", err)
|
return fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
queryArgs = map[string]string{
|
queryArgs = map[string]string{
|
||||||
"objectId": strconv.FormatUint(uint64(txtRec.ID), 10),
|
"objectId": strconv.FormatUint(uint64(txtRec.ID), 10),
|
||||||
|
|
|
@ -42,7 +42,7 @@ func (d *DNSProvider) login() error {
|
||||||
|
|
||||||
authBytes, err := ioutil.ReadAll(resp.Body)
|
authBytes, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("bluecat: %v", err)
|
return fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
authResp := string(authBytes)
|
authResp := string(authBytes)
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ func (d *DNSProvider) lookupConfID() (uint, error) {
|
||||||
var conf entityResponse
|
var conf entityResponse
|
||||||
err = json.NewDecoder(resp.Body).Decode(&conf)
|
err = json.NewDecoder(resp.Body).Decode(&conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("bluecat: %v", err)
|
return 0, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
return conf.ID, nil
|
return conf.ID, nil
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ func (d *DNSProvider) lookupViewID(viewName string) (uint, error) {
|
||||||
var view entityResponse
|
var view entityResponse
|
||||||
err = json.NewDecoder(resp.Body).Decode(&view)
|
err = json.NewDecoder(resp.Body).Decode(&view)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("bluecat: %v", err)
|
return 0, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return view.ID, nil
|
return view.ID, nil
|
||||||
|
@ -187,7 +187,7 @@ func (d *DNSProvider) getZone(parentID uint, name string) (uint, error) {
|
||||||
var zone entityResponse
|
var zone entityResponse
|
||||||
err = json.NewDecoder(resp.Body).Decode(&zone)
|
err = json.NewDecoder(resp.Body).Decode(&zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("bluecat: %v", err)
|
return 0, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return zone.ID, nil
|
return zone.ID, nil
|
||||||
|
@ -215,12 +215,12 @@ func (d *DNSProvider) sendRequest(method, resource string, payload interface{},
|
||||||
|
|
||||||
body, err := json.Marshal(payload)
|
body, err := json.Marshal(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bluecat: %v", err)
|
return nil, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := http.NewRequest(method, url, bytes.NewReader(body))
|
req, err := http.NewRequest(method, url, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bluecat: %v", err)
|
return nil, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
if len(d.token) > 0 {
|
if len(d.token) > 0 {
|
||||||
|
@ -235,7 +235,7 @@ func (d *DNSProvider) sendRequest(method, resource string, payload interface{},
|
||||||
req.URL.RawQuery = q.Encode()
|
req.URL.RawQuery = q.Encode()
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("bluecat: %v", err)
|
return nil, fmt.Errorf("bluecat: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package checkdomain
|
package checkdomain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -59,7 +60,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get(envToken)
|
values, err := env.Get(envToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("checkdomain: %v", err)
|
return nil, fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -67,7 +68,7 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
|
||||||
endpoint, err := url.Parse(env.GetOrDefaultString(envEndpoint, defaultEndpoint))
|
endpoint, err := url.Parse(env.GetOrDefaultString(envEndpoint, defaultEndpoint))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("checkdomain: invalid %s: %v", envEndpoint, err)
|
return nil, fmt.Errorf("checkdomain: invalid %s: %w", envEndpoint, err)
|
||||||
}
|
}
|
||||||
config.Endpoint = endpoint
|
config.Endpoint = endpoint
|
||||||
|
|
||||||
|
@ -76,11 +77,11 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
|
||||||
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if config.Endpoint == nil {
|
if config.Endpoint == nil {
|
||||||
return nil, fmt.Errorf("checkdomain: invalid endpoint")
|
return nil, errors.New("checkdomain: invalid endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Token == "" {
|
if config.Token == "" {
|
||||||
return nil, fmt.Errorf("checkdomain: missing token")
|
return nil, errors.New("checkdomain: missing token")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.HTTPClient == nil {
|
if config.HTTPClient == nil {
|
||||||
|
@ -97,12 +98,12 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
domainID, err := d.getDomainIDByName(domain)
|
domainID, err := d.getDomainIDByName(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.checkNameservers(domainID)
|
err = d.checkNameservers(domainID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name, value := dns01.GetRecord(domain, keyAuth)
|
name, value := dns01.GetRecord(domain, keyAuth)
|
||||||
|
@ -115,7 +116,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -125,19 +126,19 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
domainID, err := d.getDomainIDByName(domain)
|
domainID, err := d.getDomainIDByName(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.checkNameservers(domainID)
|
err = d.checkNameservers(domainID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name, value := dns01.GetRecord(domain, keyAuth)
|
name, value := dns01.GetRecord(domain, keyAuth)
|
||||||
|
|
||||||
err = d.deleteTXTRecord(domainID, name, value)
|
err = d.deleteTXTRecord(domainID, name, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("checkdomain: %v", err)
|
return fmt.Errorf("checkdomain: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.domainIDMu.Lock()
|
d.domainIDMu.Lock()
|
||||||
|
|
|
@ -3,6 +3,7 @@ package checkdomain
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -124,13 +125,13 @@ func (d *DNSProvider) getDomainIDByName(name string) (int, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return domainNotFound, fmt.Errorf("domain not found")
|
return domainNotFound, errors.New("domain not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) listDomains() ([]*Domain, error) {
|
func (d *DNSProvider) listDomains() ([]*Domain, error) {
|
||||||
req, err := d.makeRequest(http.MethodGet, "/v1/domains", http.NoBody)
|
req, err := d.makeRequest(http.MethodGet, "/v1/domains", http.NoBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to make request: %v", err)
|
return nil, fmt.Errorf("failed to make request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checkdomain also provides a query param 'query' which allows filtering domains for a string.
|
// Checkdomain also provides a query param 'query' which allows filtering domains for a string.
|
||||||
|
@ -149,7 +150,7 @@ func (d *DNSProvider) listDomains() ([]*Domain, error) {
|
||||||
|
|
||||||
var res DomainListingResponse
|
var res DomainListingResponse
|
||||||
if err := d.sendRequest(req, &res); err != nil {
|
if err := d.sendRequest(req, &res); err != nil {
|
||||||
return nil, fmt.Errorf("failed to send domain listing request: %v", err)
|
return nil, fmt.Errorf("failed to send domain listing request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the first response,
|
// This is the first response,
|
||||||
|
@ -197,7 +198,7 @@ func (d *DNSProvider) checkNameservers(domainID int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !found1 || !found2 {
|
if !found1 || !found2 {
|
||||||
return fmt.Errorf("not using checkdomain nameservers, can not update records")
|
return errors.New("not using checkdomain nameservers, can not update records")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -206,7 +207,7 @@ func (d *DNSProvider) checkNameservers(domainID int) error {
|
||||||
func (d *DNSProvider) createRecord(domainID int, record *Record) error {
|
func (d *DNSProvider) createRecord(domainID int, record *Record) error {
|
||||||
bs, err := json.Marshal(record)
|
bs, err := json.Marshal(record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("encoding record failed: %v", err)
|
return fmt.Errorf("encoding record failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := d.makeRequest(http.MethodPost, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), bytes.NewReader(bs))
|
req, err := d.makeRequest(http.MethodPost, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), bytes.NewReader(bs))
|
||||||
|
@ -277,7 +278,7 @@ func (d *DNSProvider) getDomainInfo(domainID int) (*DomainResponse, error) {
|
||||||
func (d *DNSProvider) listRecords(domainID int, recordType string) ([]*Record, error) {
|
func (d *DNSProvider) listRecords(domainID int, recordType string) ([]*Record, error) {
|
||||||
req, err := d.makeRequest(http.MethodGet, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), http.NoBody)
|
req, err := d.makeRequest(http.MethodGet, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), http.NoBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to make request: %v", err)
|
return nil, fmt.Errorf("failed to make request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
q := req.URL.Query()
|
q := req.URL.Query()
|
||||||
|
@ -296,7 +297,7 @@ func (d *DNSProvider) listRecords(domainID int, recordType string) ([]*Record, e
|
||||||
|
|
||||||
var res RecordListingResponse
|
var res RecordListingResponse
|
||||||
if err := d.sendRequest(req, &res); err != nil {
|
if err := d.sendRequest(req, &res); err != nil {
|
||||||
return nil, fmt.Errorf("failed to send record listing request: %v", err)
|
return nil, fmt.Errorf("failed to send record listing request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the first response, so we update totalPages and allocate the slice memory.
|
// This is the first response, so we update totalPages and allocate the slice memory.
|
||||||
|
@ -315,7 +316,7 @@ func (d *DNSProvider) listRecords(domainID int, recordType string) ([]*Record, e
|
||||||
func (d *DNSProvider) replaceRecords(domainID int, records []*Record) error {
|
func (d *DNSProvider) replaceRecords(domainID int, records []*Record) error {
|
||||||
bs, err := json.Marshal(records)
|
bs, err := json.Marshal(records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("encoding record failed: %v", err)
|
return fmt.Errorf("encoding record failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := d.makeRequest(http.MethodPut, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), bytes.NewReader(bs))
|
req, err := d.makeRequest(http.MethodPut, fmt.Sprintf("/v1/domains/%d/nameservers/records", domainID), bytes.NewReader(bs))
|
||||||
|
@ -391,7 +392,7 @@ func (d *DNSProvider) sendRequest(req *http.Request, result interface{}) error {
|
||||||
|
|
||||||
err = json.Unmarshal(raw, result)
|
err = json.Unmarshal(raw, result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshaling %T error [status code=%d]: %v: %s", result, resp.StatusCode, err, string(raw))
|
return fmt.Errorf("unmarshaling %T error [status code=%d]: %w: %s", result, resp.StatusCode, err, string(raw))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -409,7 +410,7 @@ func checkResponse(resp *http.Response) error {
|
||||||
|
|
||||||
raw, err := ioutil.ReadAll(resp.Body)
|
raw, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to read body: status code=%d, error=%v", resp.StatusCode, err)
|
return fmt.Errorf("unable to read body: status code=%d, error=%w", resp.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
||||||
|
|
|
@ -102,7 +102,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := newClient(config)
|
client, err := newClient(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cloudflare: %v", err)
|
return nil, fmt.Errorf("cloudflare: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
|
@ -124,12 +124,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cloudflare: %v", err)
|
return fmt.Errorf("cloudflare: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.client.ZoneIDByName(authZone)
|
zoneID, err := d.client.ZoneIDByName(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cloudflare: failed to find zone %s: %v", authZone, err)
|
return fmt.Errorf("cloudflare: failed to find zone %s: %w", authZone, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsRecord := cloudflare.DNSRecord{
|
dnsRecord := cloudflare.DNSRecord{
|
||||||
|
@ -141,7 +141,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
response, err := d.client.CreateDNSRecord(zoneID, dnsRecord)
|
response, err := d.client.CreateDNSRecord(zoneID, dnsRecord)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cloudflare: failed to create TXT record: %v", err)
|
return fmt.Errorf("cloudflare: failed to create TXT record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !response.Success {
|
if !response.Success {
|
||||||
|
@ -163,12 +163,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cloudflare: %v", err)
|
return fmt.Errorf("cloudflare: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.client.ZoneIDByName(authZone)
|
zoneID, err := d.client.ZoneIDByName(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cloudflare: failed to find zone %s: %v", authZone, err)
|
return fmt.Errorf("cloudflare: failed to find zone %s: %w", authZone, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the record's unique ID from when we created it
|
// get the record's unique ID from when we created it
|
||||||
|
@ -181,7 +181,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.DeleteDNSRecord(zoneID, recordID)
|
err = d.client.DeleteDNSRecord(zoneID, recordID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("cloudflare: failed to delete TXT record: %v", err)
|
log.Printf("cloudflare: failed to delete TXT record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete record ID from map
|
// Delete record ID from map
|
||||||
|
|
|
@ -46,7 +46,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("CLOUDNS_AUTH_ID", "CLOUDNS_AUTH_PASSWORD")
|
values, err := env.Get("CLOUDNS_AUTH_ID", "CLOUDNS_AUTH_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ClouDNS: %v", err)
|
return nil, fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -64,7 +64,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := internal.NewClient(config.AuthID, config.AuthPassword)
|
client, err := internal.NewClient(config.AuthID, config.AuthPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ClouDNS: %v", err)
|
return nil, fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.HTTPClient = config.HTTPClient
|
client.HTTPClient = config.HTTPClient
|
||||||
|
@ -78,12 +78,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.client.GetZone(fqdn)
|
zone, err := d.client.GetZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ClouDNS: %v", err)
|
return fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.client.AddTxtRecord(zone.Name, fqdn, value, d.config.TTL)
|
err = d.client.AddTxtRecord(zone.Name, fqdn, value, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ClouDNS: %v", err)
|
return fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -95,12 +95,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.client.GetZone(fqdn)
|
zone, err := d.client.GetZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ClouDNS: %v", err)
|
return fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record, err := d.client.FindTxtRecord(zone.Name, fqdn)
|
record, err := d.client.FindTxtRecord(zone.Name, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ClouDNS: %v", err)
|
return fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if record == nil {
|
if record == nil {
|
||||||
|
@ -109,7 +109,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.RemoveTxtRecord(record.ID, zone.Name)
|
err = d.client.RemoveTxtRecord(record.ID, zone.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ClouDNS: %v", err)
|
return fmt.Errorf("ClouDNS: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,11 +43,11 @@ type TXTRecords map[string]TXTRecord
|
||||||
// NewClient creates a ClouDNS client
|
// NewClient creates a ClouDNS client
|
||||||
func NewClient(authID string, authPassword string) (*Client, error) {
|
func NewClient(authID string, authPassword string) (*Client, error) {
|
||||||
if authID == "" {
|
if authID == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: authID")
|
return nil, errors.New("credentials missing: authID")
|
||||||
}
|
}
|
||||||
|
|
||||||
if authPassword == "" {
|
if authPassword == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: authPassword")
|
return nil, errors.New("credentials missing: authPassword")
|
||||||
}
|
}
|
||||||
|
|
||||||
baseURL, err := url.Parse(defaultBaseURL)
|
baseURL, err := url.Parse(defaultBaseURL)
|
||||||
|
@ -96,7 +96,7 @@ func (c *Client) GetZone(authFQDN string) (*Zone, error) {
|
||||||
|
|
||||||
if len(result) > 0 {
|
if len(result) > 0 {
|
||||||
if err = json.Unmarshal(result, &zone); err != nil {
|
if err = json.Unmarshal(result, &zone); err != nil {
|
||||||
return nil, fmt.Errorf("zone unmarshaling error: %v", err)
|
return nil, fmt.Errorf("zone unmarshaling error: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ func (c *Client) FindTxtRecord(zoneName, fqdn string) (*TXTRecord, error) {
|
||||||
|
|
||||||
var records TXTRecords
|
var records TXTRecords
|
||||||
if err = json.Unmarshal(result, &records); err != nil {
|
if err = json.Unmarshal(result, &records); err != nil {
|
||||||
return nil, fmt.Errorf("TXT record unmarshaling error: %v: %s", err, string(result))
|
return nil, fmt.Errorf("TXT record unmarshaling error: %w: %s", err, string(result))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, record := range records {
|
for _, record := range records {
|
||||||
|
@ -166,7 +166,7 @@ func (c *Client) AddTxtRecord(zoneName string, fqdn, value string, ttl int) erro
|
||||||
|
|
||||||
resp := apiResponse{}
|
resp := apiResponse{}
|
||||||
if err = json.Unmarshal(raw, &resp); err != nil {
|
if err = json.Unmarshal(raw, &resp); err != nil {
|
||||||
return fmt.Errorf("apiResponse unmarshaling error: %v: %s", err, string(raw))
|
return fmt.Errorf("apiResponse unmarshaling error: %w: %s", err, string(raw))
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.Status != "Success" {
|
if resp.Status != "Success" {
|
||||||
|
@ -193,7 +193,7 @@ func (c *Client) RemoveTxtRecord(recordID int, zoneName string) error {
|
||||||
|
|
||||||
resp := apiResponse{}
|
resp := apiResponse{}
|
||||||
if err = json.Unmarshal(raw, &resp); err != nil {
|
if err = json.Unmarshal(raw, &resp); err != nil {
|
||||||
return fmt.Errorf("apiResponse unmarshaling error: %v: %s", err, string(raw))
|
return fmt.Errorf("apiResponse unmarshaling error: %w: %s", err, string(raw))
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.Status != "Success" {
|
if resp.Status != "Success" {
|
||||||
|
@ -235,7 +235,7 @@ func (c *Client) buildRequest(method string, url *url.URL) (*http.Request, error
|
||||||
|
|
||||||
req, err := http.NewRequest(method, url.String(), nil)
|
req, err := http.NewRequest(method, url.String(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid request: %v", err)
|
return nil, fmt.Errorf("invalid request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return req, nil
|
return req, nil
|
||||||
|
|
|
@ -46,7 +46,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("CLOUDXNS_API_KEY", "CLOUDXNS_SECRET_KEY")
|
values, err := env.Get("CLOUDXNS_API_KEY", "CLOUDXNS_SECRET_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: %v", err)
|
return nil, fmt.Errorf("CloudXNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -45,11 +46,11 @@ type TXTRecord struct {
|
||||||
// NewClient creates a CloudXNS client
|
// NewClient creates a CloudXNS client
|
||||||
func NewClient(apiKey string, secretKey string) (*Client, error) {
|
func NewClient(apiKey string, secretKey string) (*Client, error) {
|
||||||
if apiKey == "" {
|
if apiKey == "" {
|
||||||
return nil, fmt.Errorf("CloudXNS: credentials missing: apiKey")
|
return nil, errors.New("CloudXNS: credentials missing: apiKey")
|
||||||
}
|
}
|
||||||
|
|
||||||
if secretKey == "" {
|
if secretKey == "" {
|
||||||
return nil, fmt.Errorf("CloudXNS: credentials missing: secretKey")
|
return nil, errors.New("CloudXNS: credentials missing: secretKey")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Client{
|
return &Client{
|
||||||
|
@ -84,7 +85,7 @@ func (c *Client) GetDomainInformation(fqdn string) (*Data, error) {
|
||||||
if len(result) > 0 {
|
if len(result) > 0 {
|
||||||
err = json.Unmarshal(result, &domains)
|
err = json.Unmarshal(result, &domains)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: domains unmarshaling error: %v", err)
|
return nil, fmt.Errorf("CloudXNS: domains unmarshaling error: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +108,7 @@ func (c *Client) FindTxtRecord(zoneID, fqdn string) (*TXTRecord, error) {
|
||||||
var records []TXTRecord
|
var records []TXTRecord
|
||||||
err = json.Unmarshal(result, &records)
|
err = json.Unmarshal(result, &records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: TXT record unmarshaling error: %v", err)
|
return nil, fmt.Errorf("CloudXNS: TXT record unmarshaling error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, record := range records {
|
for _, record := range records {
|
||||||
|
@ -123,7 +124,7 @@ func (c *Client) FindTxtRecord(zoneID, fqdn string) (*TXTRecord, error) {
|
||||||
func (c *Client) AddTxtRecord(info *Data, fqdn, value string, ttl int) error {
|
func (c *Client) AddTxtRecord(info *Data, fqdn, value string, ttl int) error {
|
||||||
id, err := strconv.Atoi(info.ID)
|
id, err := strconv.Atoi(info.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CloudXNS: invalid zone ID: %v", err)
|
return fmt.Errorf("CloudXNS: invalid zone ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
payload := TXTRecord{
|
payload := TXTRecord{
|
||||||
|
@ -137,7 +138,7 @@ func (c *Client) AddTxtRecord(info *Data, fqdn, value string, ttl int) error {
|
||||||
|
|
||||||
body, err := json.Marshal(payload)
|
body, err := json.Marshal(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CloudXNS: record unmarshaling error: %v", err)
|
return fmt.Errorf("CloudXNS: record unmarshaling error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = c.doRequest(http.MethodPost, "record", body)
|
_, err = c.doRequest(http.MethodPost, "record", body)
|
||||||
|
@ -158,7 +159,7 @@ func (c *Client) doRequest(method, uri string, body []byte) (json.RawMessage, er
|
||||||
|
|
||||||
resp, err := c.HTTPClient.Do(req)
|
resp, err := c.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: %v", err)
|
return nil, fmt.Errorf("CloudXNS: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
@ -171,7 +172,7 @@ func (c *Client) doRequest(method, uri string, body []byte) (json.RawMessage, er
|
||||||
var r apiResponse
|
var r apiResponse
|
||||||
err = json.Unmarshal(content, &r)
|
err = json.Unmarshal(content, &r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: response unmashaling error: %v: %s", err, toUnreadableBodyMessage(req, content))
|
return nil, fmt.Errorf("CloudXNS: response unmashaling error: %w: %s", err, toUnreadableBodyMessage(req, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Code != 1 {
|
if r.Code != 1 {
|
||||||
|
@ -185,7 +186,7 @@ func (c *Client) buildRequest(method, uri string, body []byte) (*http.Request, e
|
||||||
|
|
||||||
req, err := http.NewRequest(method, url, bytes.NewReader(body))
|
req, err := http.NewRequest(method, url, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("CloudXNS: invalid request: %v", err)
|
return nil, fmt.Errorf("CloudXNS: invalid request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
requestDate := time.Now().Format(time.RFC1123Z)
|
requestDate := time.Now().Format(time.RFC1123Z)
|
||||||
|
|
|
@ -48,7 +48,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("CONOHA_TENANT_ID", "CONOHA_API_USERNAME", "CONOHA_API_PASSWORD")
|
values, err := env.Get("CONOHA_TENANT_ID", "CONOHA_API_USERNAME", "CONOHA_API_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("conoha: %v", err)
|
return nil, fmt.Errorf("conoha: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -79,7 +79,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := internal.NewClient(config.Region, auth, config.HTTPClient)
|
client, err := internal.NewClient(config.Region, auth, config.HTTPClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("conoha: failed to create client: %v", err)
|
return nil, fmt.Errorf("conoha: failed to create client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config, client: client}, nil
|
return &DNSProvider{config: config, client: client}, nil
|
||||||
|
@ -96,7 +96,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
id, err := d.client.GetDomainID(authZone)
|
id, err := d.client.GetDomainID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("conoha: failed to get domain ID: %v", err)
|
return fmt.Errorf("conoha: failed to get domain ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record := internal.Record{
|
record := internal.Record{
|
||||||
|
@ -108,7 +108,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.CreateRecord(id, record)
|
err = d.client.CreateRecord(id, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("conoha: failed to create record: %v", err)
|
return fmt.Errorf("conoha: failed to create record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -125,17 +125,17 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
domID, err := d.client.GetDomainID(authZone)
|
domID, err := d.client.GetDomainID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("conoha: failed to get domain ID: %v", err)
|
return fmt.Errorf("conoha: failed to get domain ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recID, err := d.client.GetRecordID(domID, fqdn, "TXT", value)
|
recID, err := d.client.GetRecordID(domID, fqdn, "TXT", value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("conoha: failed to get record ID: %v", err)
|
return fmt.Errorf("conoha: failed to get record ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.client.DeleteRecord(domID, recID)
|
err = d.client.DeleteRecord(domID, recID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("conoha: failed to delete record: %v", err)
|
return fmt.Errorf("conoha: failed to delete record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -90,7 +90,7 @@ func NewClient(region string, auth Auth, httpClient *http.Client) (*Client, erro
|
||||||
|
|
||||||
identity, err := c.getIdentity(auth)
|
identity, err := c.getIdentity(auth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to login: %v", err)
|
return nil, fmt.Errorf("failed to login: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.token = identity.Access.Token.ID
|
c.token = identity.Access.Token.ID
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -25,10 +26,10 @@ type TokenTransport struct {
|
||||||
// NewTokenTransport Creates a HTTP transport for API authentication.
|
// NewTokenTransport Creates a HTTP transport for API authentication.
|
||||||
func NewTokenTransport(apiKey, secretKey string) (*TokenTransport, error) {
|
func NewTokenTransport(apiKey, secretKey string) (*TokenTransport, error) {
|
||||||
if apiKey == "" {
|
if apiKey == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: API key")
|
return nil, errors.New("credentials missing: API key")
|
||||||
}
|
}
|
||||||
if secretKey == "" {
|
if secretKey == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: secret key")
|
return nil, errors.New("credentials missing: secret key")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &TokenTransport{apiKey: apiKey, secretKey: secretKey}, nil
|
return &TokenTransport{apiKey: apiKey, secretKey: secretKey}, nil
|
||||||
|
|
|
@ -47,12 +47,12 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
_, err := env.Get("OS_AUTH_URL", "OS_USERNAME", "OS_PASSWORD", "OS_TENANT_NAME", "OS_REGION_NAME")
|
_, err := env.Get("OS_AUTH_URL", "OS_USERNAME", "OS_PASSWORD", "OS_TENANT_NAME", "OS_REGION_NAME")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("designate: %v", err)
|
return nil, fmt.Errorf("designate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
opts, err := openstack.AuthOptionsFromEnv()
|
opts, err := openstack.AuthOptionsFromEnv()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("designate: %v", err)
|
return nil, fmt.Errorf("designate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -69,14 +69,14 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
provider, err := openstack.AuthenticatedClient(config.opts)
|
provider, err := openstack.AuthenticatedClient(config.opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("designate: failed to authenticate: %v", err)
|
return nil, fmt.Errorf("designate: failed to authenticate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsClient, err := openstack.NewDNSV2(provider, gophercloud.EndpointOpts{
|
dnsClient, err := openstack.NewDNSV2(provider, gophercloud.EndpointOpts{
|
||||||
Region: os.Getenv("OS_REGION_NAME"),
|
Region: os.Getenv("OS_REGION_NAME"),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("designate: failed to get DNS provider: %v", err)
|
return nil, fmt.Errorf("designate: failed to get DNS provider: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{client: dnsClient, config: config}, nil
|
return &DNSProvider{client: dnsClient, config: config}, nil
|
||||||
|
@ -94,12 +94,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: couldn't get zone ID in Present: %v", err)
|
return fmt.Errorf("designate: couldn't get zone ID in Present: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.getZoneID(authZone)
|
zoneID, err := d.getZoneID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: %v", err)
|
return fmt.Errorf("designate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// use mutex to prevent race condition between creating the record and verifying it
|
// use mutex to prevent race condition between creating the record and verifying it
|
||||||
|
@ -108,7 +108,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
existingRecord, err := d.getRecord(zoneID, fqdn)
|
existingRecord, err := d.getRecord(zoneID, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: %v", err)
|
return fmt.Errorf("designate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if existingRecord != nil {
|
if existingRecord != nil {
|
||||||
|
@ -122,7 +122,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.createRecord(zoneID, fqdn, value)
|
err = d.createRecord(zoneID, fqdn, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: %v", err)
|
return fmt.Errorf("designate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -139,7 +139,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneID, err := d.getZoneID(authZone)
|
zoneID, err := d.getZoneID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: couldn't get zone ID in CleanUp: %v", err)
|
return fmt.Errorf("designate: couldn't get zone ID in CleanUp: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// use mutex to prevent race condition between getting the record and deleting it
|
// use mutex to prevent race condition between getting the record and deleting it
|
||||||
|
@ -148,7 +148,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
record, err := d.getRecord(zoneID, fqdn)
|
record, err := d.getRecord(zoneID, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: couldn't get Record ID in CleanUp: %v", err)
|
return fmt.Errorf("designate: couldn't get Record ID in CleanUp: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if record == nil {
|
if record == nil {
|
||||||
|
@ -158,7 +158,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = recordsets.Delete(d.client, zoneID, record.ID).ExtractErr()
|
err = recordsets.Delete(d.client, zoneID, record.ID).ExtractErr()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("designate: error for %s in CleanUp: %v", fqdn, err)
|
return fmt.Errorf("designate: error for %s in CleanUp: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -183,11 +183,11 @@ func (d *DNSProvider) createRecord(zoneID, fqdn, value string) error {
|
||||||
|
|
||||||
actual, err := recordsets.Create(d.client, zoneID, createOpts).Extract()
|
actual, err := recordsets.Create(d.client, zoneID, createOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error for %s in Present while creating record: %v", fqdn, err)
|
return fmt.Errorf("error for %s in Present while creating record: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if actual.Name != fqdn || actual.TTL != d.config.TTL {
|
if actual.Name != fqdn || actual.TTL != d.config.TTL {
|
||||||
return fmt.Errorf("the created record doesn't match what we wanted to create")
|
return errors.New("the created record doesn't match what we wanted to create")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -35,7 +35,7 @@ type apiError struct {
|
||||||
func (d *DNSProvider) removeTxtRecord(domain string, recordID int) error {
|
func (d *DNSProvider) removeTxtRecord(domain string, recordID int) error {
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not determine zone for domain: '%s'. %s", domain, err)
|
return fmt.Errorf("could not determine zone for domain %q: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
reqURL := fmt.Sprintf("%s/v2/domains/%s/records/%d", d.config.BaseURL, dns01.UnFqdn(authZone), recordID)
|
reqURL := fmt.Sprintf("%s/v2/domains/%s/records/%d", d.config.BaseURL, dns01.UnFqdn(authZone), recordID)
|
||||||
|
@ -60,7 +60,7 @@ func (d *DNSProvider) removeTxtRecord(domain string, recordID int) error {
|
||||||
func (d *DNSProvider) addTxtRecord(fqdn, value string) (*txtRecordResponse, error) {
|
func (d *DNSProvider) addTxtRecord(fqdn, value string) (*txtRecordResponse, error) {
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(fqdn))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(fqdn))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not determine zone for domain: '%s'. %s", fqdn, err)
|
return nil, fmt.Errorf("could not determine zone for domain %q: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
reqData := record{Type: "TXT", Name: fqdn, Data: value, TTL: d.config.TTL}
|
reqData := record{Type: "TXT", Name: fqdn, Data: value, TTL: d.config.TTL}
|
||||||
|
@ -94,7 +94,7 @@ func (d *DNSProvider) addTxtRecord(fqdn, value string) (*txtRecordResponse, erro
|
||||||
respData := &txtRecordResponse{}
|
respData := &txtRecordResponse{}
|
||||||
err = json.Unmarshal(content, respData)
|
err = json.Unmarshal(content, respData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%v: %s", err, toUnreadableBodyMessage(req, content))
|
return nil, fmt.Errorf("%w: %s", err, toUnreadableBodyMessage(req, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
return respData, nil
|
return respData, nil
|
||||||
|
@ -121,7 +121,7 @@ func readError(req *http.Request, resp *http.Response) error {
|
||||||
var errInfo apiError
|
var errInfo apiError
|
||||||
err = json.Unmarshal(content, &errInfo)
|
err = json.Unmarshal(content, &errInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("apiError unmarshaling error: %v: %s", err, toUnreadableBodyMessage(req, content))
|
return fmt.Errorf("apiError unmarshaling error: %w: %s", err, toUnreadableBodyMessage(req, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("HTTP %d: %s: %s", resp.StatusCode, errInfo.ID, errInfo.Message)
|
return fmt.Errorf("HTTP %d: %s: %s", resp.StatusCode, errInfo.ID, errInfo.Message)
|
||||||
|
|
|
@ -49,7 +49,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DO_AUTH_TOKEN")
|
values, err := env.Get("DO_AUTH_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("digitalocean: %v", err)
|
return nil, fmt.Errorf("digitalocean: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -65,7 +65,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.AuthToken == "" {
|
if config.AuthToken == "" {
|
||||||
return nil, fmt.Errorf("digitalocean: credentials missing")
|
return nil, errors.New("digitalocean: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.BaseURL == "" {
|
if config.BaseURL == "" {
|
||||||
|
@ -90,7 +90,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
respData, err := d.addTxtRecord(fqdn, value)
|
respData, err := d.addTxtRecord(fqdn, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("digitalocean: %v", err)
|
return fmt.Errorf("digitalocean: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.recordIDsMu.Lock()
|
d.recordIDsMu.Lock()
|
||||||
|
@ -106,7 +106,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("digitalocean: %v", err)
|
return fmt.Errorf("digitalocean: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the record's unique ID from when we created it
|
// get the record's unique ID from when we created it
|
||||||
|
@ -119,7 +119,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.removeTxtRecord(authZone, recordID)
|
err = d.removeTxtRecord(authZone, recordID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("digitalocean: %v", err)
|
return fmt.Errorf("digitalocean: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete record ID from map
|
// Delete record ID from map
|
||||||
|
|
|
@ -58,7 +58,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.AccessToken == "" {
|
if config.AccessToken == "" {
|
||||||
return nil, fmt.Errorf("dnsimple: OAuth token is missing")
|
return nil, errors.New("dnsimple: OAuth token is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.AccessToken})
|
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.AccessToken})
|
||||||
|
@ -77,18 +77,18 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneName, err := d.getHostedZone(domain)
|
zoneName, err := d.getHostedZone(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsimple: %v", err)
|
return fmt.Errorf("dnsimple: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
accountID, err := d.getAccountID()
|
accountID, err := d.getAccountID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsimple: %v", err)
|
return fmt.Errorf("dnsimple: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordAttributes := newTxtRecord(zoneName, fqdn, value, d.config.TTL)
|
recordAttributes := newTxtRecord(zoneName, fqdn, value, d.config.TTL)
|
||||||
_, err = d.client.Zones.CreateRecord(accountID, zoneName, recordAttributes)
|
_, err = d.client.Zones.CreateRecord(accountID, zoneName, recordAttributes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsimple: API call failed: %v", err)
|
return fmt.Errorf("dnsimple: API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -100,19 +100,19 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
records, err := d.findTxtRecords(domain, fqdn)
|
records, err := d.findTxtRecords(domain, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsimple: %v", err)
|
return fmt.Errorf("dnsimple: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
accountID, err := d.getAccountID()
|
accountID, err := d.getAccountID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsimple: %v", err)
|
return fmt.Errorf("dnsimple: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastErr error
|
var lastErr error
|
||||||
for _, rec := range records {
|
for _, rec := range records {
|
||||||
_, err := d.client.Zones.DeleteRecord(accountID, rec.ZoneID, rec.ID)
|
_, err := d.client.Zones.DeleteRecord(accountID, rec.ZoneID, rec.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastErr = fmt.Errorf("dnsimple: %v", err)
|
lastErr = fmt.Errorf("dnsimple: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ func (d *DNSProvider) getHostedZone(domain string) (string, error) {
|
||||||
|
|
||||||
zones, err := d.client.Zones.ListZones(accountID, &dnsimple.ZoneListOptions{NameLike: zoneName})
|
zones, err := d.client.Zones.ListZones(accountID, &dnsimple.ZoneListOptions{NameLike: zoneName})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("API call failed: %v", err)
|
return "", fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var hostedZone dnsimple.Zone
|
var hostedZone dnsimple.Zone
|
||||||
|
@ -172,7 +172,7 @@ func (d *DNSProvider) findTxtRecords(domain, fqdn string) ([]dnsimple.ZoneRecord
|
||||||
|
|
||||||
result, err := d.client.Zones.ListRecords(accountID, zoneName, &dnsimple.ZoneRecordListOptions{Name: recordName, Type: "TXT", ListOptions: dnsimple.ListOptions{}})
|
result, err := d.client.Zones.ListRecords(accountID, zoneName, &dnsimple.ZoneRecordListOptions{Name: recordName, Type: "TXT", ListOptions: dnsimple.ListOptions{}})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("API call has failed: %v", err)
|
return nil, fmt.Errorf("API call has failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.Data, nil
|
return result.Data, nil
|
||||||
|
@ -204,7 +204,7 @@ func (d *DNSProvider) getAccountID() (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if whoamiResponse.Data.Account == nil {
|
if whoamiResponse.Data.Account == nil {
|
||||||
return "", fmt.Errorf("user tokens are not supported, please use an account token")
|
return "", errors.New("user tokens are not supported, please use an account token")
|
||||||
}
|
}
|
||||||
|
|
||||||
return strconv.FormatInt(whoamiResponse.Data.Account.ID, 10), nil
|
return strconv.FormatInt(whoamiResponse.Data.Account.ID, 10), nil
|
||||||
|
|
|
@ -54,7 +54,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DNSMADEEASY_API_KEY", "DNSMADEEASY_API_SECRET")
|
values, err := env.Get("DNSMADEEASY_API_KEY", "DNSMADEEASY_API_SECRET")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("dnsmadeeasy: %v", err)
|
return nil, fmt.Errorf("dnsmadeeasy: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -84,7 +84,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := internal.NewClient(config.APIKey, config.APISecret)
|
client, err := internal.NewClient(config.APIKey, config.APISecret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("dnsmadeeasy: %v", err)
|
return nil, fmt.Errorf("dnsmadeeasy: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.HTTPClient = config.HTTPClient
|
client.HTTPClient = config.HTTPClient
|
||||||
|
@ -102,13 +102,13 @@ func (d *DNSProvider) Present(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to find zone for %s: %v", fqdn, err)
|
return fmt.Errorf("dnsmadeeasy: unable to find zone for %s: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetch the domain details
|
// fetch the domain details
|
||||||
domain, err := d.client.GetDomain(authZone)
|
domain, err := d.client.GetDomain(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to get domain for zone %s: %v", authZone, err)
|
return fmt.Errorf("dnsmadeeasy: unable to get domain for zone %s: %w", authZone, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the TXT record
|
// create the TXT record
|
||||||
|
@ -117,7 +117,7 @@ func (d *DNSProvider) Present(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.CreateRecord(domain, record)
|
err = d.client.CreateRecord(domain, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to create record for %s: %v", name, err)
|
return fmt.Errorf("dnsmadeeasy: unable to create record for %s: %w", name, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -128,20 +128,20 @@ func (d *DNSProvider) CleanUp(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to find zone for %s: %v", fqdn, err)
|
return fmt.Errorf("dnsmadeeasy: unable to find zone for %s: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetch the domain details
|
// fetch the domain details
|
||||||
domain, err := d.client.GetDomain(authZone)
|
domain, err := d.client.GetDomain(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to get domain for zone %s: %v", authZone, err)
|
return fmt.Errorf("dnsmadeeasy: unable to get domain for zone %s: %w", authZone, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// find matching records
|
// find matching records
|
||||||
name := strings.Replace(fqdn, "."+authZone, "", 1)
|
name := strings.Replace(fqdn, "."+authZone, "", 1)
|
||||||
records, err := d.client.GetRecords(domain, name, "TXT")
|
records, err := d.client.GetRecords(domain, name, "TXT")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dnsmadeeasy: unable to get records for domain %s: %v", domain.Name, err)
|
return fmt.Errorf("dnsmadeeasy: unable to get records for domain %s: %w", domain.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete records
|
// delete records
|
||||||
|
@ -149,7 +149,7 @@ func (d *DNSProvider) CleanUp(domainName, token, keyAuth string) error {
|
||||||
for _, record := range *records {
|
for _, record := range *records {
|
||||||
err = d.client.DeleteRecord(record)
|
err = d.client.DeleteRecord(record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastError = fmt.Errorf("dnsmadeeasy: unable to delete record [id=%d, name=%s]: %v", record.ID, record.Name, err)
|
lastError = fmt.Errorf("dnsmadeeasy: unable to delete record [id=%d, name=%s]: %w", record.ID, record.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -43,11 +44,11 @@ type Client struct {
|
||||||
// NewClient creates a DNSMadeEasy client
|
// NewClient creates a DNSMadeEasy client
|
||||||
func NewClient(apiKey string, apiSecret string) (*Client, error) {
|
func NewClient(apiKey string, apiSecret string) (*Client, error) {
|
||||||
if apiKey == "" {
|
if apiKey == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: API key")
|
return nil, errors.New("credentials missing: API key")
|
||||||
}
|
}
|
||||||
|
|
||||||
if apiSecret == "" {
|
if apiSecret == "" {
|
||||||
return nil, fmt.Errorf("credentials missing: API secret")
|
return nil, errors.New("credentials missing: API secret")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Client{
|
return &Client{
|
||||||
|
|
|
@ -46,7 +46,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DNSPOD_API_KEY")
|
values, err := env.Get("DNSPOD_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("dnspod: %v", err)
|
return nil, fmt.Errorf("dnspod: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -62,7 +62,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.LoginToken == "" {
|
if config.LoginToken == "" {
|
||||||
return nil, fmt.Errorf("dnspod: credentials missing")
|
return nil, errors.New("dnspod: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
params := dnspod.CommonParams{LoginToken: config.LoginToken, Format: "json"}
|
params := dnspod.CommonParams{LoginToken: config.LoginToken, Format: "json"}
|
||||||
|
@ -84,7 +84,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
recordAttributes := d.newTxtRecord(zoneName, fqdn, value, d.config.TTL)
|
recordAttributes := d.newTxtRecord(zoneName, fqdn, value, d.config.TTL)
|
||||||
_, _, err = d.client.Records.Create(zoneID, *recordAttributes)
|
_, _, err = d.client.Records.Create(zoneID, *recordAttributes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("API call failed: %v", err)
|
return fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -122,7 +122,7 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
func (d *DNSProvider) getHostedZone(domain string) (string, string, error) {
|
func (d *DNSProvider) getHostedZone(domain string) (string, string, error) {
|
||||||
zones, _, err := d.client.Domains.List()
|
zones, _, err := d.client.Domains.List()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", fmt.Errorf("API call failed: %v", err)
|
return "", "", fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
|
@ -165,7 +165,7 @@ func (d *DNSProvider) findTxtRecords(domain, fqdn string) ([]dnspod.Record, erro
|
||||||
var records []dnspod.Record
|
var records []dnspod.Record
|
||||||
result, _, err := d.client.Records.List(zoneID, "")
|
result, _, err := d.client.Records.List(zoneID, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return records, fmt.Errorf("API call has failed: %v", err)
|
return records, fmt.Errorf("API call has failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordName := d.extractRecordName(fqdn, zoneName)
|
recordName := d.extractRecordName(fqdn, zoneName)
|
||||||
|
|
|
@ -42,7 +42,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DODE_TOKEN")
|
values, err := env.Get("DODE_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("do.de: %v", err)
|
return nil, fmt.Errorf("do.de: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -55,13 +55,13 @@ func (d *DNSProvider) updateTxtRecord(u fmt.Stringer) error {
|
||||||
|
|
||||||
raw, err := ioutil.ReadAll(resp.Body)
|
raw, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read body: %v", err)
|
return fmt.Errorf("failed to read body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var response apiResponse
|
var response apiResponse
|
||||||
err = json.Unmarshal(raw, &response)
|
err = json.Unmarshal(raw, &response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to decode API server response: %v: %s", err, string(raw))
|
return fmt.Errorf("unable to decode API server response: %w: %s", err, string(raw))
|
||||||
}
|
}
|
||||||
|
|
||||||
if response.Result == "error" {
|
if response.Result == "error" {
|
||||||
|
|
|
@ -44,7 +44,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DREAMHOST_API_KEY")
|
values, err := env.Get("DREAMHOST_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("dreamhost: %v", err)
|
return nil, fmt.Errorf("dreamhost: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -77,12 +77,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
u, err := d.buildQuery(cmdAddRecord, record, value)
|
u, err := d.buildQuery(cmdAddRecord, record, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dreamhost: %v", err)
|
return fmt.Errorf("dreamhost: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.updateTxtRecord(u)
|
err = d.updateTxtRecord(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dreamhost: %v", err)
|
return fmt.Errorf("dreamhost: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -94,12 +94,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
u, err := d.buildQuery(cmdRemoveRecord, record, value)
|
u, err := d.buildQuery(cmdRemoveRecord, record, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dreamhost: %v", err)
|
return fmt.Errorf("dreamhost: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.updateTxtRecord(u)
|
err = d.updateTxtRecord(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dreamhost: %v", err)
|
return fmt.Errorf("dreamhost: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DUCKDNS_TOKEN")
|
values, err := env.Get("DUCKDNS_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("duckdns: %v", err)
|
return nil, fmt.Errorf("duckdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -3,6 +3,7 @@ package dyn
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
@ -134,7 +135,7 @@ func (d *DNSProvider) sendRequest(method, resource string, payload interface{})
|
||||||
return nil, fmt.Errorf("API request failed with HTTP status code %d: %s", resp.StatusCode, dynRes.Messages)
|
return nil, fmt.Errorf("API request failed with HTTP status code %d: %s", resp.StatusCode, dynRes.Messages)
|
||||||
} else if resp.StatusCode == 307 {
|
} else if resp.StatusCode == 307 {
|
||||||
// TODO add support for HTTP 307 response and long running jobs
|
// TODO add support for HTTP 307 response and long running jobs
|
||||||
return nil, fmt.Errorf("API request returned HTTP 307. This is currently unsupported")
|
return nil, errors.New("API request returned HTTP 307. This is currently unsupported")
|
||||||
}
|
}
|
||||||
|
|
||||||
if dynRes.Status == "failure" {
|
if dynRes.Status == "failure" {
|
||||||
|
|
|
@ -48,7 +48,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("DYN_CUSTOMER_NAME", "DYN_USER_NAME", "DYN_PASSWORD")
|
values, err := env.Get("DYN_CUSTOMER_NAME", "DYN_USER_NAME", "DYN_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("dyn: %v", err)
|
return nil, fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -66,7 +66,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.CustomerName == "" || config.UserName == "" || config.Password == "" {
|
if config.CustomerName == "" || config.UserName == "" || config.Password == "" {
|
||||||
return nil, fmt.Errorf("dyn: credentials missing")
|
return nil, errors.New("dyn: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config}, nil
|
return &DNSProvider{config: config}, nil
|
||||||
|
@ -78,12 +78,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.login()
|
err = d.login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
|
@ -96,12 +96,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
resource := fmt.Sprintf("TXTRecord/%s/%s/", authZone, fqdn)
|
resource := fmt.Sprintf("TXTRecord/%s/%s/", authZone, fqdn)
|
||||||
_, err = d.sendRequest(http.MethodPost, resource, data)
|
_, err = d.sendRequest(http.MethodPost, resource, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.publish(authZone, "Added TXT record for ACME dns-01 challenge using lego client")
|
err = d.publish(authZone, "Added TXT record for ACME dns-01 challenge using lego client")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.logout()
|
return d.logout()
|
||||||
|
@ -113,12 +113,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.login()
|
err = d.login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resource := fmt.Sprintf("TXTRecord/%s/%s/", authZone, fqdn)
|
resource := fmt.Sprintf("TXTRecord/%s/%s/", authZone, fqdn)
|
||||||
|
@ -126,7 +126,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
req, err := http.NewRequest(http.MethodDelete, url, nil)
|
req, err := http.NewRequest(http.MethodDelete, url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
@ -134,7 +134,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.publish(authZone, "Removed TXT record for ACME dns-01 challenge using lego client")
|
err = d.publish(authZone, "Removed TXT record for ACME dns-01 challenge using lego client")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("dyn: %v", err)
|
return fmt.Errorf("dyn: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.logout()
|
return d.logout()
|
||||||
|
|
|
@ -83,7 +83,7 @@ func (d *DNSProvider) doRequest(method, path string, requestMsg, responseMsg int
|
||||||
if response.StatusCode >= http.StatusBadRequest {
|
if response.StatusCode >= http.StatusBadRequest {
|
||||||
body, err := ioutil.ReadAll(response.Body)
|
body, err := ioutil.ReadAll(response.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d: failed to read response body: %v", response.StatusCode, err)
|
return fmt.Errorf("%d: failed to read response body: %w", response.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("%d: request failed: %v", response.StatusCode, string(body))
|
return fmt.Errorf("%d: request failed: %v", response.StatusCode, string(body))
|
||||||
|
|
|
@ -54,13 +54,13 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
|
||||||
endpoint, err := url.Parse(env.GetOrDefaultString("EASYDNS_ENDPOINT", defaultEndpoint))
|
endpoint, err := url.Parse(env.GetOrDefaultString("EASYDNS_ENDPOINT", defaultEndpoint))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("easydns: %v", err)
|
return nil, fmt.Errorf("easydns: %w", err)
|
||||||
}
|
}
|
||||||
config.Endpoint = endpoint
|
config.Endpoint = endpoint
|
||||||
|
|
||||||
values, err := env.Get("EASYDNS_TOKEN", "EASYDNS_KEY")
|
values, err := env.Get("EASYDNS_TOKEN", "EASYDNS_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("easydns: %v", err)
|
return nil, fmt.Errorf("easydns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config.Token = values["EASYDNS_TOKEN"]
|
config.Token = values["EASYDNS_TOKEN"]
|
||||||
|
@ -102,7 +102,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
recordID, err := d.addRecord(apiDomain, record)
|
recordID, err := d.addRecord(apiDomain, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("easydns: error adding zone record: %v", err)
|
return fmt.Errorf("easydns: error adding zone record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
key := getMapKey(fqdn, value)
|
key := getMapKey(fqdn, value)
|
||||||
|
@ -132,7 +132,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
d.recordIDsMu.Unlock()
|
d.recordIDsMu.Unlock()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("easydns: %v", err)
|
return fmt.Errorf("easydns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -40,7 +40,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("EXEC_PATH")
|
values, err := env.Get("EXEC_PATH")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("exec: %v", err)
|
return nil, fmt.Errorf("exec: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -49,7 +49,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("EXOSCALE_API_KEY", "EXOSCALE_API_SECRET")
|
values, err := env.Get("EXOSCALE_API_KEY", "EXOSCALE_API_SECRET")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("exoscale: %v", err)
|
return nil, fmt.Errorf("exoscale: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -67,7 +67,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" || config.APISecret == "" {
|
if config.APIKey == "" || config.APISecret == "" {
|
||||||
return nil, fmt.Errorf("exoscale: credentials missing")
|
return nil, errors.New("exoscale: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Endpoint == "" {
|
if config.Endpoint == "" {
|
||||||
|
|
|
@ -40,7 +40,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("AKAMAI_HOST", "AKAMAI_CLIENT_TOKEN", "AKAMAI_CLIENT_SECRET", "AKAMAI_ACCESS_TOKEN")
|
values, err := env.Get("AKAMAI_HOST", "AKAMAI_CLIENT_TOKEN", "AKAMAI_CLIENT_SECRET", "AKAMAI_ACCESS_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("fastdns: %v", err)
|
return nil, fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -62,7 +62,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.ClientToken == "" || config.ClientSecret == "" || config.AccessToken == "" || config.Host == "" {
|
if config.ClientToken == "" || config.ClientSecret == "" || config.AccessToken == "" || config.Host == "" {
|
||||||
return nil, fmt.Errorf("fastdns: credentials are missing")
|
return nil, errors.New("fastdns: credentials are missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config}, nil
|
return &DNSProvider{config: config}, nil
|
||||||
|
@ -73,14 +73,14 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
||||||
zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain)
|
zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("fastdns: %v", err)
|
return fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
configdns.Init(d.config.Config)
|
configdns.Init(d.config.Config)
|
||||||
|
|
||||||
zone, err := configdns.GetZone(zoneName)
|
zone, err := configdns.GetZone(zoneName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("fastdns: %v", err)
|
return fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record := configdns.NewTxtRecord()
|
record := configdns.NewTxtRecord()
|
||||||
|
@ -103,21 +103,21 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
fqdn, _ := dns01.GetRecord(domain, keyAuth)
|
fqdn, _ := dns01.GetRecord(domain, keyAuth)
|
||||||
zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain)
|
zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("fastdns: %v", err)
|
return fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
configdns.Init(d.config.Config)
|
configdns.Init(d.config.Config)
|
||||||
|
|
||||||
zone, err := configdns.GetZone(zoneName)
|
zone, err := configdns.GetZone(zoneName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("fastdns: %v", err)
|
return fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var removed bool
|
var removed bool
|
||||||
for _, r := range zone.Zone.Txt {
|
for _, r := range zone.Zone.Txt {
|
||||||
if r != nil && r.Name == recordName {
|
if r != nil && r.Name == recordName {
|
||||||
if zone.RemoveRecord(r) != nil {
|
if zone.RemoveRecord(r) != nil {
|
||||||
return fmt.Errorf("fastdns: %v", err)
|
return fmt.Errorf("fastdns: %w", err)
|
||||||
}
|
}
|
||||||
removed = true
|
removed = true
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package gandi
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -102,7 +103,7 @@ func (d *DNSProvider) rpcCall(call *methodCall, resp response) error {
|
||||||
// marshal
|
// marshal
|
||||||
b, err := xml.MarshalIndent(call, "", " ")
|
b, err := xml.MarshalIndent(call, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("marshal error: %v", err)
|
return fmt.Errorf("marshal error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// post
|
// post
|
||||||
|
@ -115,7 +116,7 @@ func (d *DNSProvider) rpcCall(call *methodCall, resp response) error {
|
||||||
// unmarshal
|
// unmarshal
|
||||||
err = xml.Unmarshal(respBody, resp)
|
err = xml.Unmarshal(respBody, resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshal error: %v", err)
|
return fmt.Errorf("unmarshal error: %w", err)
|
||||||
}
|
}
|
||||||
if resp.faultCode() != 0 {
|
if resp.faultCode() != 0 {
|
||||||
return rpcError{
|
return rpcError{
|
||||||
|
@ -181,7 +182,7 @@ func (d *DNSProvider) cloneZone(zoneID int, name string) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if newZoneID == 0 {
|
if newZoneID == 0 {
|
||||||
return 0, fmt.Errorf("could not determine cloned zone_id")
|
return 0, errors.New("could not determine cloned zone_id")
|
||||||
}
|
}
|
||||||
return newZoneID, nil
|
return newZoneID, nil
|
||||||
}
|
}
|
||||||
|
@ -200,7 +201,7 @@ func (d *DNSProvider) newZoneVersion(zoneID int) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.Value == 0 {
|
if resp.Value == 0 {
|
||||||
return 0, fmt.Errorf("could not create new zone version")
|
return 0, errors.New("could not create new zone version")
|
||||||
}
|
}
|
||||||
return resp.Value, nil
|
return resp.Value, nil
|
||||||
}
|
}
|
||||||
|
@ -249,7 +250,7 @@ func (d *DNSProvider) setZoneVersion(zoneID int, version int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !resp.Value {
|
if !resp.Value {
|
||||||
return fmt.Errorf("could not set zone version")
|
return errors.New("could not set zone version")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -295,7 +296,7 @@ func (d *DNSProvider) deleteZone(zoneID int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !resp.Value {
|
if !resp.Value {
|
||||||
return fmt.Errorf("could not delete zone_id")
|
return errors.New("could not delete zone_id")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -303,13 +304,13 @@ func (d *DNSProvider) deleteZone(zoneID int) error {
|
||||||
func (d *DNSProvider) httpPost(url string, bodyType string, body io.Reader) ([]byte, error) {
|
func (d *DNSProvider) httpPost(url string, bodyType string, body io.Reader) ([]byte, error) {
|
||||||
resp, err := d.config.HTTPClient.Post(url, bodyType, body)
|
resp, err := d.config.HTTPClient.Post(url, bodyType, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("HTTP Post Error: %v", err)
|
return nil, fmt.Errorf("HTTP Post Error: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(resp.Body)
|
b, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("HTTP Post Error: %v", err)
|
return nil, fmt.Errorf("HTTP Post Error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return b, nil
|
return b, nil
|
||||||
|
|
|
@ -68,7 +68,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("GANDI_API_KEY")
|
values, err := env.Get("GANDI_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("gandi: %v", err)
|
return nil, fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -84,7 +84,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" {
|
if config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("gandi: no API Key given")
|
return nil, errors.New("gandi: no API Key given")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.BaseURL == "" {
|
if config.BaseURL == "" {
|
||||||
|
@ -112,12 +112,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// find authZone and Gandi zone_id for fqdn
|
// find authZone and Gandi zone_id for fqdn
|
||||||
authZone, err := d.findZoneByFqdn(fqdn)
|
authZone, err := d.findZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: findZoneByFqdn failure: %v", err)
|
return fmt.Errorf("gandi: findZoneByFqdn failure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.getZoneID(authZone)
|
zoneID, err := d.getZoneID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine name of TXT record
|
// determine name of TXT record
|
||||||
|
@ -147,22 +147,22 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
newZoneVersion, err := d.newZoneVersion(newZoneID)
|
newZoneVersion, err := d.newZoneVersion(newZoneID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.addTXTRecord(newZoneID, newZoneVersion, name, value, d.config.TTL)
|
err = d.addTXTRecord(newZoneID, newZoneVersion, name, value, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.setZoneVersion(newZoneID, newZoneVersion)
|
err = d.setZoneVersion(newZoneID, newZoneVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.setZone(authZone, newZoneID)
|
err = d.setZone(authZone, newZoneID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// save data necessary for CleanUp
|
// save data necessary for CleanUp
|
||||||
|
@ -200,7 +200,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
// perform API actions to restore old gandi zone for authZone
|
// perform API actions to restore old gandi zone for authZone
|
||||||
err := d.setZone(authZone, zoneID)
|
err := d.setZone(authZone, zoneID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandi: %v", err)
|
return fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.deleteZone(newZoneID)
|
return d.deleteZone(newZoneID)
|
||||||
|
|
|
@ -3,6 +3,7 @@ package gandiv5
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -50,7 +51,7 @@ func (d *DNSProvider) addTXTRecord(domain string, name string, value string, ttl
|
||||||
message := apiResponse{}
|
message := apiResponse{}
|
||||||
err = d.do(req, &message)
|
err = d.do(req, &message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to create TXT record for domain %s and name %s: %v", domain, name, err)
|
return fmt.Errorf("unable to create TXT record for domain %s and name %s: %w", domain, name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(message.Message) > 0 {
|
if len(message.Message) > 0 {
|
||||||
|
@ -73,7 +74,7 @@ func (d *DNSProvider) getTXTRecord(domain, name string) (*Record, error) {
|
||||||
txtRecord := &Record{}
|
txtRecord := &Record{}
|
||||||
err = d.do(req, txtRecord)
|
err = d.do(req, txtRecord)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to get TXT records for domain %s and name %s: %v", domain, name, err)
|
return nil, fmt.Errorf("unable to get TXT records for domain %s and name %s: %w", domain, name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return txtRecord, nil
|
return txtRecord, nil
|
||||||
|
@ -90,7 +91,7 @@ func (d *DNSProvider) deleteTXTRecord(domain string, name string) error {
|
||||||
message := apiResponse{}
|
message := apiResponse{}
|
||||||
err = d.do(req, &message)
|
err = d.do(req, &message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to delete TXT record for domain %s and name %s: %v", domain, name, err)
|
return fmt.Errorf("unable to delete TXT record for domain %s and name %s: %w", domain, name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(message.Message) > 0 {
|
if len(message.Message) > 0 {
|
||||||
|
@ -148,13 +149,13 @@ func (d *DNSProvider) do(req *http.Request, v interface{}) error {
|
||||||
|
|
||||||
raw, err := readBody(resp)
|
raw, err := readBody(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read body: %v", err)
|
return fmt.Errorf("failed to read body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(raw) > 0 {
|
if len(raw) > 0 {
|
||||||
err = json.Unmarshal(raw, v)
|
err = json.Unmarshal(raw, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshaling error: %v: %s", err, string(raw))
|
return fmt.Errorf("unmarshaling error: %w: %s", err, string(raw))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,13 +170,13 @@ func checkResponse(resp *http.Response) error {
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
data, err := readBody(resp)
|
data, err := readBody(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d [%s] request failed: %v", resp.StatusCode, http.StatusText(resp.StatusCode), err)
|
return fmt.Errorf("%d [%s] request failed: %w", resp.StatusCode, http.StatusText(resp.StatusCode), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
message := &apiResponse{}
|
message := &apiResponse{}
|
||||||
err = json.Unmarshal(data, message)
|
err = json.Unmarshal(data, message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d [%s] request failed: %v: %s", resp.StatusCode, http.StatusText(resp.StatusCode), err, data)
|
return fmt.Errorf("%d [%s] request failed: %w: %s", resp.StatusCode, http.StatusText(resp.StatusCode), err, data)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("%d [%s] request failed: %s", resp.StatusCode, http.StatusText(resp.StatusCode), message.Message)
|
return fmt.Errorf("%d [%s] request failed: %s", resp.StatusCode, http.StatusText(resp.StatusCode), message.Message)
|
||||||
}
|
}
|
||||||
|
@ -185,7 +186,7 @@ func checkResponse(resp *http.Response) error {
|
||||||
|
|
||||||
func readBody(resp *http.Response) ([]byte, error) {
|
func readBody(resp *http.Response) ([]byte, error) {
|
||||||
if resp.Body == nil {
|
if resp.Body == nil {
|
||||||
return nil, fmt.Errorf("response body is nil")
|
return nil, errors.New("response body is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
|
@ -65,7 +65,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("GANDIV5_API_KEY")
|
values, err := env.Get("GANDIV5_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("gandi: %v", err)
|
return nil, fmt.Errorf("gandi: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -81,7 +81,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" {
|
if config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("gandiv5: no API Key given")
|
return nil, errors.New("gandiv5: no API Key given")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.BaseURL == "" {
|
if config.BaseURL == "" {
|
||||||
|
@ -106,7 +106,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// find authZone
|
// find authZone
|
||||||
authZone, err := d.findZoneByFqdn(fqdn)
|
authZone, err := d.findZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandiv5: findZoneByFqdn failure: %v", err)
|
return fmt.Errorf("gandiv5: findZoneByFqdn failure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine name of TXT record
|
// determine name of TXT record
|
||||||
|
@ -154,7 +154,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
// delete TXT record from authZone
|
// delete TXT record from authZone
|
||||||
err := d.deleteTXTRecord(dns01.UnFqdn(authZone), fieldName)
|
err := d.deleteTXTRecord(dns01.UnFqdn(authZone), fieldName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gandiv5: %v", err)
|
return fmt.Errorf("gandiv5: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,12 +72,12 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
// to return a DNSProvider instance configured for Google Cloud DNS.
|
// to return a DNSProvider instance configured for Google Cloud DNS.
|
||||||
func NewDNSProviderCredentials(project string) (*DNSProvider, error) {
|
func NewDNSProviderCredentials(project string) (*DNSProvider, error) {
|
||||||
if project == "" {
|
if project == "" {
|
||||||
return nil, fmt.Errorf("googlecloud: project name missing")
|
return nil, errors.New("googlecloud: project name missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := google.DefaultClient(context.Background(), dns.NdevClouddnsReadwriteScope)
|
client, err := google.DefaultClient(context.Background(), dns.NdevClouddnsReadwriteScope)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("googlecloud: unable to get Google Cloud client: %v", err)
|
return nil, fmt.Errorf("googlecloud: unable to get Google Cloud client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -91,7 +91,7 @@ func NewDNSProviderCredentials(project string) (*DNSProvider, error) {
|
||||||
// to return a DNSProvider instance configured for Google Cloud DNS.
|
// to return a DNSProvider instance configured for Google Cloud DNS.
|
||||||
func NewDNSProviderServiceAccountKey(saKey []byte) (*DNSProvider, error) {
|
func NewDNSProviderServiceAccountKey(saKey []byte) (*DNSProvider, error) {
|
||||||
if len(saKey) == 0 {
|
if len(saKey) == 0 {
|
||||||
return nil, fmt.Errorf("googlecloud: Service Account is missing")
|
return nil, errors.New("googlecloud: Service Account is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
// If GCE_PROJECT is non-empty it overrides the project in the service
|
// If GCE_PROJECT is non-empty it overrides the project in the service
|
||||||
|
@ -104,14 +104,14 @@ func NewDNSProviderServiceAccountKey(saKey []byte) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
err := json.Unmarshal(saKey, &datJSON)
|
err := json.Unmarshal(saKey, &datJSON)
|
||||||
if err != nil || datJSON.ProjectID == "" {
|
if err != nil || datJSON.ProjectID == "" {
|
||||||
return nil, fmt.Errorf("googlecloud: project ID not found in Google Cloud Service Account file")
|
return nil, errors.New("googlecloud: project ID not found in Google Cloud Service Account file")
|
||||||
}
|
}
|
||||||
project = datJSON.ProjectID
|
project = datJSON.ProjectID
|
||||||
}
|
}
|
||||||
|
|
||||||
conf, err := google.JWTConfigFromJSON(saKey, dns.NdevClouddnsReadwriteScope)
|
conf, err := google.JWTConfigFromJSON(saKey, dns.NdevClouddnsReadwriteScope)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("googlecloud: unable to acquire config: %v", err)
|
return nil, fmt.Errorf("googlecloud: unable to acquire config: %w", err)
|
||||||
}
|
}
|
||||||
client := conf.Client(context.Background())
|
client := conf.Client(context.Background())
|
||||||
|
|
||||||
|
@ -126,12 +126,12 @@ func NewDNSProviderServiceAccountKey(saKey []byte) (*DNSProvider, error) {
|
||||||
// to return a DNSProvider instance configured for Google Cloud DNS.
|
// to return a DNSProvider instance configured for Google Cloud DNS.
|
||||||
func NewDNSProviderServiceAccount(saFile string) (*DNSProvider, error) {
|
func NewDNSProviderServiceAccount(saFile string) (*DNSProvider, error) {
|
||||||
if saFile == "" {
|
if saFile == "" {
|
||||||
return nil, fmt.Errorf("googlecloud: Service Account file missing")
|
return nil, errors.New("googlecloud: Service Account file missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
saKey, err := ioutil.ReadFile(saFile)
|
saKey, err := ioutil.ReadFile(saFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("googlecloud: unable to read Service Account file: %v", err)
|
return nil, fmt.Errorf("googlecloud: unable to read Service Account file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewDNSProviderServiceAccountKey(saKey)
|
return NewDNSProviderServiceAccountKey(saKey)
|
||||||
|
@ -143,12 +143,12 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
return nil, errors.New("googlecloud: the configuration of the DNS provider is nil")
|
return nil, errors.New("googlecloud: the configuration of the DNS provider is nil")
|
||||||
}
|
}
|
||||||
if config.HTTPClient == nil {
|
if config.HTTPClient == nil {
|
||||||
return nil, fmt.Errorf("googlecloud: unable to create Google Cloud DNS service: client is nil")
|
return nil, errors.New("googlecloud: unable to create Google Cloud DNS service: client is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
svc, err := dns.NewService(context.Background(), option.WithHTTPClient(config.HTTPClient))
|
svc, err := dns.NewService(context.Background(), option.WithHTTPClient(config.HTTPClient))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("googlecloud: unable to create Google Cloud DNS service: %v", err)
|
return nil, fmt.Errorf("googlecloud: unable to create Google Cloud DNS service: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{config: config, client: svc}, nil
|
return &DNSProvider{config: config, client: svc}, nil
|
||||||
|
@ -160,13 +160,13 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for existing records.
|
// Look for existing records.
|
||||||
existingRrSet, err := d.findTxtRecords(zone, fqdn)
|
existingRrSet, err := d.findTxtRecords(zone, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, rrSet := range existingRrSet {
|
for _, rrSet := range existingRrSet {
|
||||||
|
@ -186,7 +186,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// Attempt to delete the existing records before adding the new one.
|
// Attempt to delete the existing records before adding the new one.
|
||||||
if len(existingRrSet) > 0 {
|
if len(existingRrSet) > 0 {
|
||||||
if err = d.applyChanges(zone, &dns.Change{Deletions: existingRrSet}); err != nil {
|
if err = d.applyChanges(zone, &dns.Change{Deletions: existingRrSet}); err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = d.applyChanges(zone, change); err != nil {
|
if err = d.applyChanges(zone, change); err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -232,7 +232,7 @@ func (d *DNSProvider) applyChanges(zone string, change *dns.Change) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
data, _ := json.Marshal(change)
|
data, _ := json.Marshal(change)
|
||||||
return fmt.Errorf("failed to perform changes [zone %s, change %s]: %v", zone, string(data), err)
|
return fmt.Errorf("failed to perform changes [zone %s, change %s]: %w", zone, string(data), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if chg.Status == changeStatusDone {
|
if chg.Status == changeStatusDone {
|
||||||
|
@ -251,7 +251,7 @@ func (d *DNSProvider) applyChanges(zone string, change *dns.Change) error {
|
||||||
chg, err = d.client.Changes.Get(d.config.Project, zone, chgID).Do()
|
chg, err = d.client.Changes.Get(d.config.Project, zone, chgID).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
data, _ := json.Marshal(change)
|
data, _ := json.Marshal(change)
|
||||||
return false, fmt.Errorf("failed to get changes [zone %s, change %s]: %v", zone, string(data), err)
|
return false, fmt.Errorf("failed to get changes [zone %s, change %s]: %w", zone, string(data), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if chg.Status == changeStatusDone {
|
if chg.Status == changeStatusDone {
|
||||||
|
@ -268,12 +268,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.findTxtRecords(zone, fqdn)
|
records, err := d.findTxtRecords(zone, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(records) == 0 {
|
if len(records) == 0 {
|
||||||
|
@ -282,7 +282,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.client.Changes.Create(d.config.Project, zone, &dns.Change{Deletions: records}).Do()
|
_, err = d.client.Changes.Create(d.config.Project, zone, &dns.Change{Deletions: records}).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -305,7 +305,7 @@ func (d *DNSProvider) getHostedZone(domain string) (string, error) {
|
||||||
DnsName(authZone).
|
DnsName(authZone).
|
||||||
Do()
|
Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("API call failed: %v", err)
|
return "", fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(zones.ManagedZones) == 0 {
|
if len(zones.ManagedZones) == 0 {
|
||||||
|
|
|
@ -56,7 +56,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("GLESYS_API_USER", "GLESYS_API_KEY")
|
values, err := env.Get("GLESYS_API_USER", "GLESYS_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("glesys: %v", err)
|
return nil, fmt.Errorf("glesys: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -73,7 +73,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIUser == "" || config.APIKey == "" {
|
if config.APIUser == "" || config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("glesys: incomplete credentials provided")
|
return nil, errors.New("glesys: incomplete credentials provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.TTL < minTTL {
|
if config.TTL < minTTL {
|
||||||
|
@ -93,7 +93,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// find authZone
|
// find authZone
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("glesys: findZoneByFqdn failure: %v", err)
|
return fmt.Errorf("glesys: findZoneByFqdn failure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine name of TXT record
|
// determine name of TXT record
|
||||||
|
|
|
@ -53,7 +53,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("GODADDY_API_KEY", "GODADDY_API_SECRET")
|
values, err := env.Get("GODADDY_API_KEY", "GODADDY_API_SECRET")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("godaddy: %v", err)
|
return nil, fmt.Errorf("godaddy: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -70,7 +70,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" || config.APISecret == "" {
|
if config.APIKey == "" || config.APISecret == "" {
|
||||||
return nil, fmt.Errorf("godaddy: credentials missing")
|
return nil, errors.New("godaddy: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.TTL < minTTL {
|
if config.TTL < minTTL {
|
||||||
|
|
|
@ -27,7 +27,7 @@ func (d *DNSProvider) listZoneConfigs(findRequest ZoneConfigsFindRequest) (*Zone
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(findResponse.Response.Data) == 0 {
|
if len(findResponse.Response.Data) == 0 {
|
||||||
return nil, fmt.Errorf("%v: %s", err, toUnreadableBodyMessage(uri, rawResp))
|
return nil, fmt.Errorf("%w: %s", err, toUnreadableBodyMessage(uri, rawResp))
|
||||||
}
|
}
|
||||||
|
|
||||||
if findResponse.Status != "success" && findResponse.Status != "pending" {
|
if findResponse.Status != "success" && findResponse.Status != "pending" {
|
||||||
|
@ -104,7 +104,7 @@ func (d *DNSProvider) post(uri string, request interface{}, response interface{}
|
||||||
|
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying API: %v", err)
|
return nil, fmt.Errorf("error querying API: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
@ -116,7 +116,7 @@ func (d *DNSProvider) post(uri string, request interface{}, response interface{}
|
||||||
|
|
||||||
err = json.Unmarshal(content, response)
|
err = json.Unmarshal(content, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%v: %s", err, toUnreadableBodyMessage(uri, content))
|
return nil, fmt.Errorf("%w: %s", err, toUnreadableBodyMessage(uri, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
return content, nil
|
return content, nil
|
||||||
|
|
|
@ -47,7 +47,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("HOSTINGDE_API_KEY", "HOSTINGDE_ZONE_NAME")
|
values, err := env.Get("HOSTINGDE_API_KEY", "HOSTINGDE_ZONE_NAME")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("hostingde: %v", err)
|
return nil, fmt.Errorf("hostingde: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -100,7 +100,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneConfig, err := d.getZone(zonesFind)
|
zoneConfig, err := d.getZone(zonesFind)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("hostingde: %v", err)
|
return fmt.Errorf("hostingde: %w", err)
|
||||||
}
|
}
|
||||||
zoneConfig.Name = d.config.ZoneName
|
zoneConfig.Name = d.config.ZoneName
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
resp, err := d.updateZone(req)
|
resp, err := d.updateZone(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("hostingde: %v", err)
|
return fmt.Errorf("hostingde: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, record := range resp.Response.Records {
|
for _, record := range resp.Response.Records {
|
||||||
|
@ -160,7 +160,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneConfig, err := d.getZone(zonesFind)
|
zoneConfig, err := d.getZone(zonesFind)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("hostingde: %v", err)
|
return fmt.Errorf("hostingde: %w", err)
|
||||||
}
|
}
|
||||||
zoneConfig.Name = d.config.ZoneName
|
zoneConfig.Name = d.config.ZoneName
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.updateZone(req)
|
_, err = d.updateZone(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("hostingde: %v", err)
|
return fmt.Errorf("hostingde: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,12 +58,12 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("HTTPREQ_ENDPOINT")
|
values, err := env.Get("HTTPREQ_ENDPOINT")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("httpreq: %v", err)
|
return nil, fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoint, err := url.Parse(values["HTTPREQ_ENDPOINT"])
|
endpoint, err := url.Parse(values["HTTPREQ_ENDPOINT"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("httpreq: %v", err)
|
return nil, fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -104,7 +104,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.doPost("/present", msg)
|
err := d.doPost("/present", msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("httpreq: %v", err)
|
return fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.doPost("/present", msg)
|
err := d.doPost("/present", msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("httpreq: %v", err)
|
return fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.doPost("/cleanup", msg)
|
err := d.doPost("/cleanup", msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("httpreq: %v", err)
|
return fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.doPost("/cleanup", msg)
|
err := d.doPost("/cleanup", msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("httpreq: %v", err)
|
return fmt.Errorf("httpreq: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ func (d *DNSProvider) doPost(uri string, msg interface{}) error {
|
||||||
if resp.StatusCode >= http.StatusBadRequest {
|
if resp.StatusCode >= http.StatusBadRequest {
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%d: failed to read response body: %v", resp.StatusCode, err)
|
return fmt.Errorf("%d: failed to read response body: %w", resp.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("%d: request failed: %v", resp.StatusCode, string(body))
|
return fmt.Errorf("%d: request failed: %v", resp.StatusCode, string(body))
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
package iij
|
package iij
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -42,7 +43,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("IIJ_API_ACCESS_KEY", "IIJ_API_SECRET_KEY", "IIJ_DO_SERVICE_CODE")
|
values, err := env.Get("IIJ_API_ACCESS_KEY", "IIJ_API_SECRET_KEY", "IIJ_DO_SERVICE_CODE")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("iij: %v", err)
|
return nil, fmt.Errorf("iij: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -57,7 +58,7 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
// and returns a custom configured DNSProvider instance
|
// and returns a custom configured DNSProvider instance
|
||||||
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if config.SecretKey == "" || config.AccessKey == "" || config.DoServiceCode == "" {
|
if config.SecretKey == "" || config.AccessKey == "" || config.DoServiceCode == "" {
|
||||||
return nil, fmt.Errorf("iij: credentials missing")
|
return nil, errors.New("iij: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
|
@ -77,7 +78,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.addTxtRecord(domain, value)
|
err := d.addTxtRecord(domain, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("iij: %v", err)
|
return fmt.Errorf("iij: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -88,7 +89,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.deleteTxtRecord(domain, value)
|
err := d.deleteTxtRecord(domain, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("iij: %v", err)
|
return fmt.Errorf("iij: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("INWX_USERNAME", "INWX_PASSWORD")
|
values, err := env.Get("INWX_USERNAME", "INWX_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("inwx: %v", err)
|
return nil, fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -61,7 +61,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Username == "" || config.Password == "" {
|
if config.Username == "" || config.Password == "" {
|
||||||
return nil, fmt.Errorf("inwx: credentials missing")
|
return nil, errors.New("inwx: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Sandbox {
|
if config.Sandbox {
|
||||||
|
@ -79,12 +79,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.client.Account.Login()
|
err = d.client.Account.Login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -109,9 +109,9 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
if er.Message == "Object exists" {
|
if er.Message == "Object exists" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,12 +124,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.client.Account.Login()
|
err = d.client.Account.Login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -145,14 +145,14 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
Type: "TXT",
|
Type: "TXT",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("inwx: %v", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastErr error
|
var lastErr error
|
||||||
for _, record := range response.Records {
|
for _, record := range response.Records {
|
||||||
err = d.client.Nameservers.DeleteRecord(record.ID)
|
err = d.client.Nameservers.DeleteRecord(record.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastErr = fmt.Errorf("inwx: %v", err)
|
lastErr = fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package joker
|
package joker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -80,7 +81,7 @@ func (d *DNSProvider) login() (*response, error) {
|
||||||
case d.config.APIKey != "":
|
case d.config.APIKey != "":
|
||||||
values = url.Values{"api-key": {d.config.APIKey}}
|
values = url.Values{"api-key": {d.config.APIKey}}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("no username and password or api-key")
|
return nil, errors.New("no username and password or api-key")
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := d.postRequest("login", values)
|
response, err := d.postRequest("login", values)
|
||||||
|
@ -89,11 +90,11 @@ func (d *DNSProvider) login() (*response, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if response == nil {
|
if response == nil {
|
||||||
return nil, fmt.Errorf("login returned nil response")
|
return nil, errors.New("login returned nil response")
|
||||||
}
|
}
|
||||||
|
|
||||||
if response.AuthSid == "" {
|
if response.AuthSid == "" {
|
||||||
return response, fmt.Errorf("login did not return valid Auth-Sid")
|
return response, errors.New("login did not return valid Auth-Sid")
|
||||||
}
|
}
|
||||||
|
|
||||||
d.config.AuthSid = response.AuthSid
|
d.config.AuthSid = response.AuthSid
|
||||||
|
@ -104,7 +105,7 @@ func (d *DNSProvider) login() (*response, error) {
|
||||||
// logout closes authenticated session with Joker's DMAPI
|
// logout closes authenticated session with Joker's DMAPI
|
||||||
func (d *DNSProvider) logout() (*response, error) {
|
func (d *DNSProvider) logout() (*response, error) {
|
||||||
if d.config.AuthSid == "" {
|
if d.config.AuthSid == "" {
|
||||||
return nil, fmt.Errorf("already logged out")
|
return nil, errors.New("already logged out")
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := d.postRequest("logout", url.Values{})
|
response, err := d.postRequest("logout", url.Values{})
|
||||||
|
@ -117,7 +118,7 @@ func (d *DNSProvider) logout() (*response, error) {
|
||||||
// getZone returns content of DNS zone for domain
|
// getZone returns content of DNS zone for domain
|
||||||
func (d *DNSProvider) getZone(domain string) (*response, error) {
|
func (d *DNSProvider) getZone(domain string) (*response, error) {
|
||||||
if d.config.AuthSid == "" {
|
if d.config.AuthSid == "" {
|
||||||
return nil, fmt.Errorf("must be logged in to get zone")
|
return nil, errors.New("must be logged in to get zone")
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.postRequest("dns-zone-get", url.Values{"domain": {dns01.UnFqdn(domain)}})
|
return d.postRequest("dns-zone-get", url.Values{"domain": {dns01.UnFqdn(domain)}})
|
||||||
|
@ -126,7 +127,7 @@ func (d *DNSProvider) getZone(domain string) (*response, error) {
|
||||||
// putZone uploads DNS zone to Joker DMAPI
|
// putZone uploads DNS zone to Joker DMAPI
|
||||||
func (d *DNSProvider) putZone(domain, zone string) (*response, error) {
|
func (d *DNSProvider) putZone(domain, zone string) (*response, error) {
|
||||||
if d.config.AuthSid == "" {
|
if d.config.AuthSid == "" {
|
||||||
return nil, fmt.Errorf("must be logged in to put zone")
|
return nil, errors.New("must be logged in to put zone")
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.postRequest("dns-zone-put", url.Values{"domain": {dns01.UnFqdn(domain)}, "zone": {strings.TrimSpace(zone)}})
|
return d.postRequest("dns-zone-put", url.Values{"domain": {dns01.UnFqdn(domain)}, "zone": {strings.TrimSpace(zone)}})
|
||||||
|
|
|
@ -75,7 +75,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
if config.APIKey == "" {
|
if config.APIKey == "" {
|
||||||
if config.Username == "" || config.Password == "" {
|
if config.Username == "" || config.Password == "" {
|
||||||
return nil, fmt.Errorf("joker: credentials missing")
|
return nil, errors.New("joker: credentials missing")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := dns01.FindZoneByFqdn(fqdn)
|
zone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("joker: %v", err)
|
return fmt.Errorf("joker: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
relative := getRelative(fqdn, zone)
|
relative := getRelative(fqdn, zone)
|
||||||
|
@ -132,7 +132,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := dns01.FindZoneByFqdn(fqdn)
|
zone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("joker: %v", err)
|
return fmt.Errorf("joker: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
relative := getRelative(fqdn, zone)
|
relative := getRelative(fqdn, zone)
|
||||||
|
@ -178,7 +178,7 @@ func getRelative(fqdn, zone string) string {
|
||||||
// formatResponseError formats error with optional details from DMAPI response
|
// formatResponseError formats error with optional details from DMAPI response
|
||||||
func formatResponseError(response *response, err error) error {
|
func formatResponseError(response *response, err error) error {
|
||||||
if response != nil {
|
if response != nil {
|
||||||
return fmt.Errorf("joker: DMAPI error: %v Response: %v", err, response.Headers)
|
return fmt.Errorf("joker: DMAPI error: %w Response: %v", err, response.Headers)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("joker: DMAPI error: %v", err)
|
return fmt.Errorf("joker: DMAPI error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.newTxtRecord(fqdn, `"`+value+`"`)
|
err := d.newTxtRecord(fqdn, `"`+value+`"`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("lightsail: %v", err)
|
return fmt.Errorf("lightsail: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err := d.client.DeleteDomainEntry(params)
|
_, err := d.client.DeleteDomainEntry(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("lightsail: %v", err)
|
return fmt.Errorf("lightsail: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("LINODE_API_KEY")
|
values, err := env.Get("LINODE_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("linode: %v", err)
|
return nil, fmt.Errorf("linode: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -57,7 +57,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("LINODE_TOKEN")
|
values, err := env.Get("LINODE_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("linodev4: %v", err)
|
return nil, fmt.Errorf("linodev4: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -185,7 +185,7 @@ func (d *DNSProvider) getHostedZoneInfo(fqdn string) (*hostedZoneInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(domains) == 0 {
|
if len(domains) == 0 {
|
||||||
return nil, fmt.Errorf("domain not found")
|
return nil, errors.New("domain not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &hostedZoneInfo{
|
return &hostedZoneInfo{
|
||||||
|
|
|
@ -54,7 +54,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("LIQUID_WEB_USERNAME", "LIQUID_WEB_PASSWORD", "LIQUID_WEB_ZONE")
|
values, err := env.Get("LIQUID_WEB_USERNAME", "LIQUID_WEB_PASSWORD", "LIQUID_WEB_ZONE")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("liquidweb: %v", err)
|
return nil, fmt.Errorf("liquidweb: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -77,21 +77,21 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Zone == "" {
|
if config.Zone == "" {
|
||||||
return nil, fmt.Errorf("liquidweb: zone is missing")
|
return nil, errors.New("liquidweb: zone is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Username == "" {
|
if config.Username == "" {
|
||||||
return nil, fmt.Errorf("liquidweb: username is missing")
|
return nil, errors.New("liquidweb: username is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Password == "" {
|
if config.Password == "" {
|
||||||
return nil, fmt.Errorf("liquidweb: password is missing")
|
return nil, errors.New("liquidweb: password is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize LW client.
|
// Initialize LW client.
|
||||||
client, err := lw.NewAPI(config.Username, config.Password, config.BaseURL, int(config.HTTPTimeout.Seconds()))
|
client, err := lw.NewAPI(config.Username, config.Password, config.BaseURL, int(config.HTTPTimeout.Seconds()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("liquidweb: could not create Liquid Web API client: %v", err)
|
return nil, fmt.Errorf("liquidweb: could not create Liquid Web API client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
|
@ -121,7 +121,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
dnsEntry, err := d.client.NetworkDNS.Create(params)
|
dnsEntry, err := d.client.NetworkDNS.Create(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("liquidweb: could not create TXT record: %v", err)
|
return fmt.Errorf("liquidweb: could not create TXT record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.recordIDsMu.Lock()
|
d.recordIDsMu.Lock()
|
||||||
|
@ -144,7 +144,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
params := &network.DNSRecordParams{ID: recordID}
|
params := &network.DNSRecordParams{ID: recordID}
|
||||||
_, err := d.client.NetworkDNS.Delete(params)
|
_, err := d.client.NetworkDNS.Delete(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("liquidweb: could not remove TXT record: %v", err)
|
return fmt.Errorf("liquidweb: could not remove TXT record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.recordIDsMu.Lock()
|
d.recordIDsMu.Lock()
|
||||||
|
|
|
@ -16,7 +16,7 @@ func (d *DNSProvider) doRequest(domain, value string, cmd string) error {
|
||||||
|
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error querying API: %v", err)
|
return fmt.Errorf("error querying API: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
@ -42,7 +42,7 @@ func (d *DNSProvider) buildRequest(domain, value string, cmd string) (*http.Requ
|
||||||
|
|
||||||
req, err := http.NewRequest(http.MethodPost, defaultBaseURL, strings.NewReader(params.Encode()))
|
req, err := http.NewRequest(http.MethodPost, defaultBaseURL, strings.NewReader(params.Encode()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid request: %v", err)
|
return nil, fmt.Errorf("invalid request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
|
|
@ -43,7 +43,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("MYDNSJP_MASTER_ID", "MYDNSJP_PASSWORD")
|
values, err := env.Get("MYDNSJP_MASTER_ID", "MYDNSJP_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("mydnsjp: %v", err)
|
return nil, fmt.Errorf("mydnsjp: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -77,7 +77,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
_, value := dns01.GetRecord(domain, keyAuth)
|
_, value := dns01.GetRecord(domain, keyAuth)
|
||||||
err := d.doRequest(domain, value, "REGIST")
|
err := d.doRequest(domain, value, "REGIST")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("mydnsjp: %v", err)
|
return fmt.Errorf("mydnsjp: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
_, value := dns01.GetRecord(domain, keyAuth)
|
_, value := dns01.GetRecord(domain, keyAuth)
|
||||||
err := d.doRequest(domain, value, "DELETE")
|
err := d.doRequest(domain, value, "DELETE")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("mydnsjp: %v", err)
|
return fmt.Errorf("mydnsjp: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package namecheap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -97,7 +98,7 @@ func (d *DNSProvider) setHosts(sld, tld string, hosts []Record) error {
|
||||||
return fmt.Errorf("%s [%d]", shr.Errors[0].Description, shr.Errors[0].Number)
|
return fmt.Errorf("%s [%d]", shr.Errors[0].Description, shr.Errors[0].Number)
|
||||||
}
|
}
|
||||||
if shr.Result.IsSuccess != "true" {
|
if shr.Result.IsSuccess != "true" {
|
||||||
return fmt.Errorf("setHosts failed")
|
return errors.New("setHosts failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -113,7 +114,7 @@ func (d *DNSProvider) do(req *http.Request, out interface{}) error {
|
||||||
var body []byte
|
var body []byte
|
||||||
body, err = readBody(resp)
|
body, err = readBody(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("HTTP error %d [%s]: %v", resp.StatusCode, http.StatusText(resp.StatusCode), err)
|
return fmt.Errorf("HTTP error %d [%s]: %w", resp.StatusCode, http.StatusText(resp.StatusCode), err)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("HTTP error %d [%s]: %s", resp.StatusCode, http.StatusText(resp.StatusCode), string(body))
|
return fmt.Errorf("HTTP error %d [%s]: %s", resp.StatusCode, http.StatusText(resp.StatusCode), string(body))
|
||||||
}
|
}
|
||||||
|
@ -178,7 +179,7 @@ func addParam(key, value string) func(url.Values) {
|
||||||
|
|
||||||
func readBody(resp *http.Response) ([]byte, error) {
|
func readBody(resp *http.Response) ([]byte, error) {
|
||||||
if resp.Body == nil {
|
if resp.Body == nil {
|
||||||
return nil, fmt.Errorf("response body is nil")
|
return nil, errors.New("response body is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
|
@ -91,7 +91,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NAMECHEAP_API_USER", "NAMECHEAP_API_KEY")
|
values, err := env.Get("NAMECHEAP_API_USER", "NAMECHEAP_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("namecheap: %v", err)
|
return nil, fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -108,13 +108,13 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIUser == "" || config.APIKey == "" {
|
if config.APIUser == "" || config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("namecheap: credentials missing")
|
return nil, errors.New("namecheap: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(config.ClientIP) == 0 {
|
if len(config.ClientIP) == 0 {
|
||||||
clientIP, err := getClientIP(config.HTTPClient, config.Debug)
|
clientIP, err := getClientIP(config.HTTPClient, config.Debug)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("namecheap: %v", err)
|
return nil, fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
config.ClientIP = clientIP
|
config.ClientIP = clientIP
|
||||||
}
|
}
|
||||||
|
@ -132,12 +132,12 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
ch, err := newChallenge(domain, keyAuth)
|
ch, err := newChallenge(domain, keyAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.getHosts(ch.sld, ch.tld)
|
records, err := d.getHosts(ch.sld, ch.tld)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record := Record{
|
record := Record{
|
||||||
|
@ -158,7 +158,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.setHosts(ch.sld, ch.tld, records)
|
err = d.setHosts(ch.sld, ch.tld, records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -167,12 +167,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
ch, err := newChallenge(domain, keyAuth)
|
ch, err := newChallenge(domain, keyAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.getHosts(ch.sld, ch.tld)
|
records, err := d.getHosts(ch.sld, ch.tld)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the challenge TXT record and remove it if found.
|
// Find the challenge TXT record and remove it if found.
|
||||||
|
@ -192,7 +192,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.setHosts(ch.sld, ch.tld, newRecords)
|
err = d.setHosts(ch.sld, ch.tld, newRecords)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namecheap: %v", err)
|
return fmt.Errorf("namecheap: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NAMECOM_USERNAME", "NAMECOM_API_TOKEN")
|
values, err := env.Get("NAMECOM_USERNAME", "NAMECOM_API_TOKEN")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("namedotcom: %v", err)
|
return nil, fmt.Errorf("namedotcom: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -69,11 +69,11 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Username == "" {
|
if config.Username == "" {
|
||||||
return nil, fmt.Errorf("namedotcom: username is required")
|
return nil, errors.New("namedotcom: username is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIToken == "" {
|
if config.APIToken == "" {
|
||||||
return nil, fmt.Errorf("namedotcom: API token is required")
|
return nil, errors.New("namedotcom: API token is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.TTL < minTTL {
|
if config.TTL < minTTL {
|
||||||
|
@ -104,7 +104,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err := d.client.CreateRecord(request)
|
_, err := d.client.CreateRecord(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namedotcom: API call failed: %v", err)
|
return fmt.Errorf("namedotcom: API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -116,7 +116,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
records, err := d.getRecords(domain)
|
records, err := d.getRecords(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namedotcom: %v", err)
|
return fmt.Errorf("namedotcom: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, rec := range records {
|
for _, rec := range records {
|
||||||
|
@ -127,7 +127,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
_, err := d.client.DeleteRecord(request)
|
_, err := d.client.DeleteRecord(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namedotcom: %v", err)
|
return fmt.Errorf("namedotcom: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NAMESILO_API_KEY")
|
values, err := env.Get("NAMESILO_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("namesilo: %v", err)
|
return nil, fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -68,7 +68,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
transport, err := namesilo.NewTokenTransport(config.APIKey)
|
transport, err := namesilo.NewTokenTransport(config.APIKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("namesilo: %v", err)
|
return nil, fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{client: namesilo.NewClient(transport.Client()), config: config}, nil
|
return &DNSProvider{client: namesilo.NewClient(transport.Client()), config: config}, nil
|
||||||
|
@ -80,7 +80,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneName, err := getZoneNameByDomain(domain)
|
zoneName, err := getZoneNameByDomain(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namesilo: %v", err)
|
return fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.client.DnsAddRecord(&namesilo.DnsAddRecordParams{
|
_, err = d.client.DnsAddRecord(&namesilo.DnsAddRecordParams{
|
||||||
|
@ -91,7 +91,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
TTL: d.config.TTL,
|
TTL: d.config.TTL,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namesilo: failed to add record %v", err)
|
return fmt.Errorf("namesilo: failed to add record %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -102,12 +102,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneName, err := getZoneNameByDomain(domain)
|
zoneName, err := getZoneNameByDomain(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namesilo: %v", err)
|
return fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := d.client.DnsListRecords(&namesilo.DnsListRecordsParams{Domain: zoneName})
|
resp, err := d.client.DnsListRecords(&namesilo.DnsListRecordsParams{Domain: zoneName})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("namesilo: %v", err)
|
return fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastErr error
|
var lastErr error
|
||||||
|
@ -116,7 +116,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
if r.Type == "TXT" && r.Host == name {
|
if r.Type == "TXT" && r.Host == name {
|
||||||
_, err := d.client.DnsDeleteRecord(&namesilo.DnsDeleteRecordParams{Domain: zoneName, ID: r.RecordID})
|
_, err := d.client.DnsDeleteRecord(&namesilo.DnsDeleteRecordParams{Domain: zoneName, ID: r.RecordID})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastErr = fmt.Errorf("namesilo: %v", err)
|
lastErr = fmt.Errorf("namesilo: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
func getZoneNameByDomain(domain string) (string, error) {
|
func getZoneNameByDomain(domain string) (string, error) {
|
||||||
zone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
zone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to find zone for domain: %s, %v", domain, err)
|
return "", fmt.Errorf("failed to find zone for domain: %s, %w", domain, err)
|
||||||
}
|
}
|
||||||
return dns01.UnFqdn(zone), nil
|
return dns01.UnFqdn(zone), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package internal
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -123,7 +124,7 @@ type Client struct {
|
||||||
// NewClient creates a netcup DNS client
|
// NewClient creates a netcup DNS client
|
||||||
func NewClient(customerNumber string, apiKey string, apiPassword string) (*Client, error) {
|
func NewClient(customerNumber string, apiKey string, apiPassword string) (*Client, error) {
|
||||||
if customerNumber == "" || apiKey == "" || apiPassword == "" {
|
if customerNumber == "" || apiKey == "" || apiPassword == "" {
|
||||||
return nil, fmt.Errorf("credentials missing")
|
return nil, errors.New("credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Client{
|
return &Client{
|
||||||
|
@ -154,7 +155,7 @@ func (c *Client) Login() (string, error) {
|
||||||
var responseData LoginResponse
|
var responseData LoginResponse
|
||||||
err := c.doRequest(payload, &responseData)
|
err := c.doRequest(payload, &responseData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("loging error: %v", err)
|
return "", fmt.Errorf("loging error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return responseData.APISessionID, nil
|
return responseData.APISessionID, nil
|
||||||
|
@ -175,7 +176,7 @@ func (c *Client) Logout(sessionID string) error {
|
||||||
|
|
||||||
err := c.doRequest(payload, nil)
|
err := c.doRequest(payload, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("logout error: %v", err)
|
return fmt.Errorf("logout error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -198,7 +199,7 @@ func (c *Client) UpdateDNSRecord(sessionID, domainName string, records []DNSReco
|
||||||
|
|
||||||
err := c.doRequest(payload, nil)
|
err := c.doRequest(payload, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error when sending the request: %v", err)
|
return fmt.Errorf("error when sending the request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -222,7 +223,7 @@ func (c *Client) GetDNSRecords(hostname, apiSessionID string) ([]DNSRecord, erro
|
||||||
var responseData InfoDNSRecordsResponse
|
var responseData InfoDNSRecordsResponse
|
||||||
err := c.doRequest(payload, &responseData)
|
err := c.doRequest(payload, &responseData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error when sending the request: %v", err)
|
return nil, fmt.Errorf("error when sending the request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return responseData.DNSRecords, nil
|
return responseData.DNSRecords, nil
|
||||||
|
@ -265,7 +266,7 @@ func (c *Client) doRequest(payload interface{}, responseData interface{}) error
|
||||||
if responseData != nil {
|
if responseData != nil {
|
||||||
err = json.Unmarshal(respMsg.ResponseData, responseData)
|
err = json.Unmarshal(respMsg.ResponseData, responseData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%v: unmarshaling %T error: %v: %s",
|
return fmt.Errorf("%v: unmarshaling %T error: %w: %s",
|
||||||
respMsg, responseData, err, string(respMsg.ResponseData))
|
respMsg, responseData, err, string(respMsg.ResponseData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -283,7 +284,7 @@ func checkResponse(resp *http.Response) error {
|
||||||
|
|
||||||
raw, err := ioutil.ReadAll(resp.Body)
|
raw, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to read body: status code=%d, error=%v", resp.StatusCode, err)
|
return fmt.Errorf("unable to read body: status code=%d, error=%w", resp.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
return fmt.Errorf("status code=%d: %s", resp.StatusCode, string(raw))
|
||||||
|
@ -301,13 +302,13 @@ func decodeResponseMsg(resp *http.Response) (*ResponseMsg, error) {
|
||||||
|
|
||||||
raw, err := ioutil.ReadAll(resp.Body)
|
raw, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to read body: status code=%d, error=%v", resp.StatusCode, err)
|
return nil, fmt.Errorf("unable to read body: status code=%d, error=%w", resp.StatusCode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var respMsg ResponseMsg
|
var respMsg ResponseMsg
|
||||||
err = json.Unmarshal(raw, &respMsg)
|
err = json.Unmarshal(raw, &respMsg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unmarshaling %T error [status code=%d]: %v: %s", respMsg, resp.StatusCode, err, string(raw))
|
return nil, fmt.Errorf("unmarshaling %T error [status code=%d]: %w: %s", respMsg, resp.StatusCode, err, string(raw))
|
||||||
}
|
}
|
||||||
|
|
||||||
return &respMsg, nil
|
return &respMsg, nil
|
||||||
|
@ -322,5 +323,5 @@ func GetDNSRecordIdx(records []DNSRecord, record DNSRecord) (int, error) {
|
||||||
return index, nil
|
return index, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1, fmt.Errorf("no DNS Record found")
|
return -1, errors.New("no DNS Record found")
|
||||||
}
|
}
|
||||||
|
|
|
@ -570,7 +570,7 @@ func TestLiveClientUpdateDnsRecord(t *testing.T) {
|
||||||
fqdn, _ := dns01.GetRecord(envTest.GetDomain(), "123d==")
|
fqdn, _ := dns01.GetRecord(envTest.GetDomain(), "123d==")
|
||||||
|
|
||||||
zone, err := dns01.FindZoneByFqdn(fqdn)
|
zone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
require.NoError(t, err, fmt.Errorf("error finding DNSZone, %v", err))
|
require.NoError(t, err, fmt.Errorf("error finding DNSZone, %w", err))
|
||||||
|
|
||||||
hostname := strings.Replace(fqdn, "."+zone, "", 1)
|
hostname := strings.Replace(fqdn, "."+zone, "", 1)
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NETCUP_CUSTOMER_NUMBER", "NETCUP_API_KEY", "NETCUP_API_PASSWORD")
|
values, err := env.Get("NETCUP_CUSTOMER_NUMBER", "NETCUP_API_KEY", "NETCUP_API_PASSWORD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("netcup: %v", err)
|
return nil, fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -69,7 +69,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := internal.NewClient(config.Customer, config.Key, config.Password)
|
client, err := internal.NewClient(config.Customer, config.Key, config.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("netcup: %v", err)
|
return nil, fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.HTTPClient = config.HTTPClient
|
client.HTTPClient = config.HTTPClient
|
||||||
|
@ -83,12 +83,12 @@ func (d *DNSProvider) Present(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := dns01.FindZoneByFqdn(fqdn)
|
zone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: failed to find DNSZone, %v", err)
|
return fmt.Errorf("netcup: failed to find DNSZone, %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionID, err := d.client.Login()
|
sessionID, err := d.client.Login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: %v", err)
|
return fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -118,7 +118,7 @@ func (d *DNSProvider) Present(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.UpdateDNSRecord(sessionID, zone, records)
|
err = d.client.UpdateDNSRecord(sessionID, zone, records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: failed to add TXT-Record: %v", err)
|
return fmt.Errorf("netcup: failed to add TXT-Record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -130,12 +130,12 @@ func (d *DNSProvider) CleanUp(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := dns01.FindZoneByFqdn(fqdn)
|
zone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: failed to find DNSZone, %v", err)
|
return fmt.Errorf("netcup: failed to find DNSZone, %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionID, err := d.client.Login()
|
sessionID, err := d.client.Login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: %v", err)
|
return fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -151,7 +151,7 @@ func (d *DNSProvider) CleanUp(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
records, err := d.client.GetDNSRecords(zone, sessionID)
|
records, err := d.client.GetDNSRecords(zone, sessionID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: %v", err)
|
return fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record := internal.DNSRecord{
|
record := internal.DNSRecord{
|
||||||
|
@ -162,14 +162,14 @@ func (d *DNSProvider) CleanUp(domainName, token, keyAuth string) error {
|
||||||
|
|
||||||
idx, err := internal.GetDNSRecordIdx(records, record)
|
idx, err := internal.GetDNSRecordIdx(records, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: %v", err)
|
return fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records[idx].DeleteRecord = true
|
records[idx].DeleteRecord = true
|
||||||
|
|
||||||
err = d.client.UpdateDNSRecord(sessionID, zone, []internal.DNSRecord{records[idx]})
|
err = d.client.UpdateDNSRecord(sessionID, zone, []internal.DNSRecord{records[idx]})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("netcup: %v", err)
|
return fmt.Errorf("netcup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -129,7 +129,7 @@ func (c *Client) ChangeResourceRecordSets(hostedZoneID string, input ChangeResou
|
||||||
|
|
||||||
err = c.sign(req)
|
err = c.sign(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred during the creation of the signature: %v", err)
|
return nil, fmt.Errorf("an error occurred during the creation of the signature: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := c.HTTPClient.Do(req)
|
res, err := c.HTTPClient.Do(req)
|
||||||
|
@ -146,7 +146,7 @@ func (c *Client) ChangeResourceRecordSets(hostedZoneID string, input ChangeResou
|
||||||
errResp := &ErrorResponse{}
|
errResp := &ErrorResponse{}
|
||||||
err = xml.NewDecoder(res.Body).Decode(errResp)
|
err = xml.NewDecoder(res.Body).Decode(errResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred while unmarshaling the error body to XML: %v", err)
|
return nil, fmt.Errorf("an error occurred while unmarshaling the error body to XML: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("an error occurred: %s", errResp.Error.Message)
|
return nil, fmt.Errorf("an error occurred: %s", errResp.Error.Message)
|
||||||
|
@ -155,7 +155,7 @@ func (c *Client) ChangeResourceRecordSets(hostedZoneID string, input ChangeResou
|
||||||
output := &ChangeResourceRecordSetsResponse{}
|
output := &ChangeResourceRecordSetsResponse{}
|
||||||
err = xml.NewDecoder(res.Body).Decode(output)
|
err = xml.NewDecoder(res.Body).Decode(output)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred while unmarshaling the response body to XML: %v", err)
|
return nil, fmt.Errorf("an error occurred while unmarshaling the response body to XML: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return output, err
|
return output, err
|
||||||
|
@ -172,7 +172,7 @@ func (c *Client) GetChange(statusID string) (*GetChangeResponse, error) {
|
||||||
|
|
||||||
err = c.sign(req)
|
err = c.sign(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred during the creation of the signature: %v", err)
|
return nil, fmt.Errorf("an error occurred during the creation of the signature: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := c.HTTPClient.Do(req)
|
res, err := c.HTTPClient.Do(req)
|
||||||
|
@ -189,7 +189,7 @@ func (c *Client) GetChange(statusID string) (*GetChangeResponse, error) {
|
||||||
errResp := &ErrorResponse{}
|
errResp := &ErrorResponse{}
|
||||||
err = xml.NewDecoder(res.Body).Decode(errResp)
|
err = xml.NewDecoder(res.Body).Decode(errResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred while unmarshaling the error body to XML: %v", err)
|
return nil, fmt.Errorf("an error occurred while unmarshaling the error body to XML: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("an error occurred: %s", errResp.Error.Message)
|
return nil, fmt.Errorf("an error occurred: %s", errResp.Error.Message)
|
||||||
|
@ -198,7 +198,7 @@ func (c *Client) GetChange(statusID string) (*GetChangeResponse, error) {
|
||||||
output := &GetChangeResponse{}
|
output := &GetChangeResponse{}
|
||||||
err = xml.NewDecoder(res.Body).Decode(output)
|
err = xml.NewDecoder(res.Body).Decode(output)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("an error occurred while unmarshaling the response body to XML: %v", err)
|
return nil, fmt.Errorf("an error occurred while unmarshaling the response body to XML: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return output, nil
|
return output, nil
|
||||||
|
|
|
@ -49,7 +49,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NIFCLOUD_ACCESS_KEY_ID", "NIFCLOUD_SECRET_ACCESS_KEY")
|
values, err := env.Get("NIFCLOUD_ACCESS_KEY_ID", "NIFCLOUD_SECRET_ACCESS_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("nifcloud: %v", err)
|
return nil, fmt.Errorf("nifcloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -68,7 +68,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := internal.NewClient(config.AccessKey, config.SecretKey)
|
client, err := internal.NewClient(config.AccessKey, config.SecretKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("nifcloud: %v", err)
|
return nil, fmt.Errorf("nifcloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.HTTPClient != nil {
|
if config.HTTPClient != nil {
|
||||||
|
@ -88,7 +88,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.changeRecord("CREATE", fqdn, value, domain, d.config.TTL)
|
err := d.changeRecord("CREATE", fqdn, value, domain, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("nifcloud: %v", err)
|
return fmt.Errorf("nifcloud: %w", err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.changeRecord("DELETE", fqdn, value, domain, d.config.TTL)
|
err := d.changeRecord("DELETE", fqdn, value, domain, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("nifcloud: %v", err)
|
return fmt.Errorf("nifcloud: %w", err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ func (d *DNSProvider) changeRecord(action, fqdn, value, domain string, ttl int)
|
||||||
|
|
||||||
resp, err := d.client.ChangeResourceRecordSets(domain, reqParams)
|
resp, err := d.client.ChangeResourceRecordSets(domain, reqParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to change NIFCLOUD record set: %v", err)
|
return fmt.Errorf("failed to change NIFCLOUD record set: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
statusID := resp.ChangeInfo.ID
|
statusID := resp.ChangeInfo.ID
|
||||||
|
@ -149,7 +149,7 @@ func (d *DNSProvider) changeRecord(action, fqdn, value, domain string, ttl int)
|
||||||
return wait.For("nifcloud", 120*time.Second, 4*time.Second, func() (bool, error) {
|
return wait.For("nifcloud", 120*time.Second, 4*time.Second, func() (bool, error) {
|
||||||
resp, err := d.client.GetChange(statusID)
|
resp, err := d.client.GetChange(statusID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to query NIFCLOUD DNS change status: %v", err)
|
return false, fmt.Errorf("failed to query NIFCLOUD DNS change status: %w", err)
|
||||||
}
|
}
|
||||||
return resp.ChangeInfo.Status == "INSYNC", nil
|
return resp.ChangeInfo.Status == "INSYNC", nil
|
||||||
})
|
})
|
||||||
|
|
|
@ -47,7 +47,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("NS1_API_KEY")
|
values, err := env.Get("NS1_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ns1: %v", err)
|
return nil, fmt.Errorf("ns1: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -63,7 +63,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" {
|
if config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("ns1: credentials missing")
|
return nil, errors.New("ns1: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
client := rest.NewClient(config.HTTPClient, rest.SetAPIKey(config.APIKey))
|
client := rest.NewClient(config.HTTPClient, rest.SetAPIKey(config.APIKey))
|
||||||
|
@ -77,7 +77,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record, _, err := d.client.Records.Get(zone.Zone, dns01.UnFqdn(fqdn), "TXT")
|
record, _, err := d.client.Records.Get(zone.Zone, dns01.UnFqdn(fqdn), "TXT")
|
||||||
|
@ -92,14 +92,14 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.client.Records.Create(record)
|
_, err = d.client.Records.Create(record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: failed to create record [zone: %q, fqdn: %q]: %v", zone.Zone, fqdn, err)
|
return fmt.Errorf("ns1: failed to create record [zone: %q, fqdn: %q]: %w", zone.Zone, fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: failed to get the existing record: %v", err)
|
return fmt.Errorf("ns1: failed to get the existing record: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the existing records
|
// Update the existing records
|
||||||
|
@ -109,7 +109,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.client.Records.Update(record)
|
_, err = d.client.Records.Update(record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: failed to update record [zone: %q, fqdn: %q]: %v", zone.Zone, fqdn, err)
|
return fmt.Errorf("ns1: failed to update record [zone: %q, fqdn: %q]: %w", zone.Zone, fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -121,13 +121,13 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name := dns01.UnFqdn(fqdn)
|
name := dns01.UnFqdn(fqdn)
|
||||||
_, err = d.client.Records.Delete(zone.Zone, name, "TXT")
|
_, err = d.client.Records.Delete(zone.Zone, name, "TXT")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: failed to delete record [zone: %q, domain: %q]: %v", zone.Zone, name, err)
|
return fmt.Errorf("ns1: failed to delete record [zone: %q, domain: %q]: %w", zone.Zone, name, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -141,12 +141,12 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
func (d *DNSProvider) getHostedZone(fqdn string) (*dns.Zone, error) {
|
func (d *DNSProvider) getHostedZone(fqdn string) (*dns.Zone, error) {
|
||||||
authZone, err := getAuthZone(fqdn)
|
authZone, err := getAuthZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to extract auth zone from fqdn %q: %v", fqdn, err)
|
return nil, fmt.Errorf("failed to extract auth zone from fqdn %q: %w", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zone, _, err := d.client.Zones.Get(authZone)
|
zone, _, err := d.client.Zones.Get(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to get zone [authZone: %q, fqdn: %q]: %v", authZone, fqdn, err)
|
return nil, fmt.Errorf("failed to get zone [authZone: %q, fqdn: %q]: %w", authZone, fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return zone, nil
|
return zone, nil
|
||||||
|
|
|
@ -81,7 +81,7 @@ func getPrivateKey(envVar string) ([]byte, error) {
|
||||||
if envVarValue != "" {
|
if envVarValue != "" {
|
||||||
bytes, err := base64.StdEncoding.DecodeString(envVarValue)
|
bytes, err := base64.StdEncoding.DecodeString(envVarValue)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read base64 value %s (defined by env var %s): %s", envVarValue, envVar, err)
|
return nil, fmt.Errorf("failed to read base64 value %s (defined by env var %s): %w", envVarValue, envVar, err)
|
||||||
}
|
}
|
||||||
return bytes, nil
|
return bytes, nil
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ func getPrivateKey(envVar string) ([]byte, error) {
|
||||||
|
|
||||||
fileContents, err := ioutil.ReadFile(fileVarValue)
|
fileContents, err := ioutil.ReadFile(fileVarValue)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read the file %s (defined by env var %s): %s", fileVarValue, fileVar, err)
|
return nil, fmt.Errorf("failed to read the file %s (defined by env var %s): %w", fileVarValue, fileVar, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fileContents, nil
|
return fileContents, nil
|
||||||
|
|
|
@ -45,7 +45,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get(ociPrivkey, ociTenancyOCID, ociUserOCID, ociPubkeyFingerprint, ociRegion, "OCI_COMPARTMENT_OCID")
|
values, err := env.Get(ociPrivkey, ociTenancyOCID, ociUserOCID, ociPubkeyFingerprint, ociRegion, "OCI_COMPARTMENT_OCID")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oraclecloud: %v", err)
|
return nil, fmt.Errorf("oraclecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -71,7 +71,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
|
||||||
client, err := dns.NewDnsClientWithConfigurationProvider(config.OCIConfigProvider)
|
client, err := dns.NewDnsClientWithConfigurationProvider(config.OCIConfigProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("oraclecloud: %v", err)
|
return nil, fmt.Errorf("oraclecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.HTTPClient != nil {
|
if config.HTTPClient != nil {
|
||||||
|
@ -105,7 +105,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err := d.client.PatchDomainRecords(context.Background(), request)
|
_, err := d.client.PatchDomainRecords(context.Background(), request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("oraclecloud: %v", err)
|
return fmt.Errorf("oraclecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -127,11 +127,11 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
domainRecords, err := d.client.GetDomainRecords(ctx, getRequest)
|
domainRecords, err := d.client.GetDomainRecords(ctx, getRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("oraclecloud: %v", err)
|
return fmt.Errorf("oraclecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if *domainRecords.OpcTotalItems == 0 {
|
if *domainRecords.OpcTotalItems == 0 {
|
||||||
return fmt.Errorf("oraclecloud: no record to CleanUp")
|
return errors.New("oraclecloud: no record to CleanUp")
|
||||||
}
|
}
|
||||||
|
|
||||||
var deleteHash *string
|
var deleteHash *string
|
||||||
|
@ -143,7 +143,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if deleteHash == nil {
|
if deleteHash == nil {
|
||||||
return fmt.Errorf("oraclecloud: no record to CleanUp")
|
return errors.New("oraclecloud: no record to CleanUp")
|
||||||
}
|
}
|
||||||
|
|
||||||
recordOperation := dns.RecordOperation{
|
recordOperation := dns.RecordOperation{
|
||||||
|
@ -162,7 +162,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.client.PatchDomainRecords(ctx, patchRequest)
|
_, err = d.client.PatchDomainRecords(ctx, patchRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("oraclecloud: %v", err)
|
return fmt.Errorf("oraclecloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -3,6 +3,7 @@ package otc
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -138,7 +139,7 @@ func (d *DNSProvider) loginRequest() error {
|
||||||
d.token = resp.Header.Get("X-Subject-Token")
|
d.token = resp.Header.Get("X-Subject-Token")
|
||||||
|
|
||||||
if d.token == "" {
|
if d.token == "" {
|
||||||
return fmt.Errorf("unable to get auth token")
|
return errors.New("unable to get auth token")
|
||||||
}
|
}
|
||||||
|
|
||||||
var endpointResp endpointResponse
|
var endpointResp endpointResponse
|
||||||
|
@ -158,7 +159,7 @@ func (d *DNSProvider) loginRequest() error {
|
||||||
if len(endpoints) > 0 {
|
if len(endpoints) > 0 {
|
||||||
d.baseURL = fmt.Sprintf("%s/v2", endpoints[0].URL)
|
d.baseURL = fmt.Sprintf("%s/v2", endpoints[0].URL)
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("unable to get dns endpoint")
|
return errors.New("unable to get dns endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -182,11 +183,11 @@ func (d *DNSProvider) getZoneID(zone string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(zonesRes.Zones) > 1 {
|
if len(zonesRes.Zones) > 1 {
|
||||||
return "", fmt.Errorf("to many zones found")
|
return "", errors.New("to many zones found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if zonesRes.Zones[0].ID == "" {
|
if zonesRes.Zones[0].ID == "" {
|
||||||
return "", fmt.Errorf("id not found")
|
return "", errors.New("id not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
return zonesRes.Zones[0].ID, nil
|
return zonesRes.Zones[0].ID, nil
|
||||||
|
@ -206,15 +207,15 @@ func (d *DNSProvider) getRecordSetID(zoneID string, fqdn string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(recordSetsRes.RecordSets) < 1 {
|
if len(recordSetsRes.RecordSets) < 1 {
|
||||||
return "", fmt.Errorf("record not found")
|
return "", errors.New("record not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(recordSetsRes.RecordSets) > 1 {
|
if len(recordSetsRes.RecordSets) > 1 {
|
||||||
return "", fmt.Errorf("to many records found")
|
return "", errors.New("to many records found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if recordSetsRes.RecordSets[0].ID == "" {
|
if recordSetsRes.RecordSets[0].ID == "" {
|
||||||
return "", fmt.Errorf("id not found")
|
return "", errors.New("id not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
return recordSetsRes.RecordSets[0].ID, nil
|
return recordSetsRes.RecordSets[0].ID, nil
|
||||||
|
|
|
@ -72,7 +72,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("OTC_DOMAIN_NAME", "OTC_USER_NAME", "OTC_PASSWORD", "OTC_PROJECT_NAME")
|
values, err := env.Get("OTC_DOMAIN_NAME", "OTC_USER_NAME", "OTC_PASSWORD", "OTC_PROJECT_NAME")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("otc: %v", err)
|
return nil, fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -91,7 +91,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.DomainName == "" || config.UserName == "" || config.Password == "" || config.ProjectName == "" {
|
if config.DomainName == "" || config.UserName == "" || config.Password == "" || config.ProjectName == "" {
|
||||||
return nil, fmt.Errorf("otc: credentials missing")
|
return nil, errors.New("otc: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.TTL < minTTL {
|
if config.TTL < minTTL {
|
||||||
|
@ -111,17 +111,17 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.login()
|
err = d.login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.getZoneID(authZone)
|
zoneID, err := d.getZoneID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: unable to get zone: %s", err)
|
return fmt.Errorf("otc: unable to get zone: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resource := fmt.Sprintf("zones/%s/recordsets", zoneID)
|
resource := fmt.Sprintf("zones/%s/recordsets", zoneID)
|
||||||
|
@ -136,7 +136,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
_, err = d.sendRequest(http.MethodPost, resource, r1)
|
_, err = d.sendRequest(http.MethodPost, resource, r1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -147,27 +147,27 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
authZone, err := dns01.FindZoneByFqdn(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.login()
|
err = d.login()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneID, err := d.getZoneID(authZone)
|
zoneID, err := d.getZoneID(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordID, err := d.getRecordSetID(zoneID, fqdn)
|
recordID, err := d.getRecordSetID(zoneID, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: unable go get record %s for zone %s: %s", fqdn, domain, err)
|
return fmt.Errorf("otc: unable go get record %s for zone %s: %w", fqdn, domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.deleteRecordSet(zoneID, recordID)
|
err = d.deleteRecordSet(zoneID, recordID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("otc: %v", err)
|
return fmt.Errorf("otc: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("OVH_ENDPOINT", "OVH_APPLICATION_KEY", "OVH_APPLICATION_SECRET", "OVH_CONSUMER_KEY")
|
values, err := env.Get("OVH_ENDPOINT", "OVH_APPLICATION_KEY", "OVH_APPLICATION_SECRET", "OVH_CONSUMER_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ovh: %v", err)
|
return nil, fmt.Errorf("ovh: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -88,7 +88,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIEndpoint == "" || config.ApplicationKey == "" || config.ApplicationSecret == "" || config.ConsumerKey == "" {
|
if config.APIEndpoint == "" || config.ApplicationKey == "" || config.ApplicationSecret == "" || config.ConsumerKey == "" {
|
||||||
return nil, fmt.Errorf("ovh: credentials missing")
|
return nil, errors.New("ovh: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := ovh.NewClient(
|
client, err := ovh.NewClient(
|
||||||
|
@ -98,7 +98,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
config.ConsumerKey,
|
config.ConsumerKey,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ovh: %v", err)
|
return nil, fmt.Errorf("ovh: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Client = config.HTTPClient
|
client.Client = config.HTTPClient
|
||||||
|
@ -117,7 +117,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// Parse domain name
|
// Parse domain name
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: could not determine zone for domain: '%s'. %s", domain, err)
|
return fmt.Errorf("ovh: could not determine zone for domain %q: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
authZone = dns01.UnFqdn(authZone)
|
authZone = dns01.UnFqdn(authZone)
|
||||||
|
@ -130,14 +130,14 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
var respData Record
|
var respData Record
|
||||||
err = d.client.Post(reqURL, reqData, &respData)
|
err = d.client.Post(reqURL, reqData, &respData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: error when call api to add record (%s): %v", reqURL, err)
|
return fmt.Errorf("ovh: error when call api to add record (%s): %w", reqURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply the change
|
// Apply the change
|
||||||
reqURL = fmt.Sprintf("/domain/zone/%s/refresh", authZone)
|
reqURL = fmt.Sprintf("/domain/zone/%s/refresh", authZone)
|
||||||
err = d.client.Post(reqURL, nil, nil)
|
err = d.client.Post(reqURL, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: error when call api to refresh zone (%s): %v", reqURL, err)
|
return fmt.Errorf("ovh: error when call api to refresh zone (%s): %w", reqURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.recordIDsMu.Lock()
|
d.recordIDsMu.Lock()
|
||||||
|
@ -161,7 +161,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
authZone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: could not determine zone for domain: '%s'. %s", domain, err)
|
return fmt.Errorf("ovh: could not determine zone for domain %q: %w", domain, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
authZone = dns01.UnFqdn(authZone)
|
authZone = dns01.UnFqdn(authZone)
|
||||||
|
@ -170,14 +170,14 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.client.Delete(reqURL, nil)
|
err = d.client.Delete(reqURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: error when call OVH api to delete challenge record (%s): %v", reqURL, err)
|
return fmt.Errorf("ovh: error when call OVH api to delete challenge record (%s): %w", reqURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply the change
|
// Apply the change
|
||||||
reqURL = fmt.Sprintf("/domain/zone/%s/refresh", authZone)
|
reqURL = fmt.Sprintf("/domain/zone/%s/refresh", authZone)
|
||||||
err = d.client.Post(reqURL, nil, nil)
|
err = d.client.Post(reqURL, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ovh: error when call api to refresh zone (%s): %v", reqURL, err)
|
return fmt.Errorf("ovh: error when call api to refresh zone (%s): %w", reqURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete record ID from map
|
// Delete record ID from map
|
||||||
|
|
|
@ -160,7 +160,7 @@ func (d *DNSProvider) sendRequest(method, uri string, body io.Reader) (json.RawM
|
||||||
|
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error talking to PDNS API -> %v", err)
|
return nil, fmt.Errorf("error talking to PDNS API -> %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
@ -188,7 +188,7 @@ func (d *DNSProvider) sendRequest(method, uri string, body io.Reader) (json.RawM
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if errInfo.ShortMsg != "" {
|
if errInfo.ShortMsg != "" {
|
||||||
return nil, fmt.Errorf("error talking to PDNS API -> %v", errInfo)
|
return nil, fmt.Errorf("error talking to PDNS API -> %w", errInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return msg, nil
|
return msg, nil
|
||||||
|
|
|
@ -49,12 +49,12 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("PDNS_API_KEY", "PDNS_API_URL")
|
values, err := env.Get("PDNS_API_KEY", "PDNS_API_URL")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("pdns: %v", err)
|
return nil, fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hostURL, err := url.Parse(values["PDNS_API_URL"])
|
hostURL, err := url.Parse(values["PDNS_API_URL"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("pdns: %v", err)
|
return nil, fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -71,11 +71,11 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIKey == "" {
|
if config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("pdns: API key missing")
|
return nil, errors.New("pdns: API key missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Host == nil || config.Host.Host == "" {
|
if config.Host == nil || config.Host.Host == "" {
|
||||||
return nil, fmt.Errorf("pdns: API URL missing")
|
return nil, errors.New("pdns: API URL missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
d := &DNSProvider{config: config}
|
d := &DNSProvider{config: config}
|
||||||
|
@ -101,7 +101,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name := fqdn
|
name := fqdn
|
||||||
|
@ -124,7 +124,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
// Look for existing records.
|
// Look for existing records.
|
||||||
existingRrSet, err := d.findTxtRecord(fqdn)
|
existingRrSet, err := d.findTxtRecord(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge the existing and new records
|
// merge the existing and new records
|
||||||
|
@ -149,12 +149,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
body, err := json.Marshal(rrsets)
|
body, err := json.Marshal(rrsets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.sendRequest(http.MethodPatch, zone.URL, bytes.NewReader(body))
|
_, err = d.sendRequest(http.MethodPatch, zone.URL, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -165,12 +165,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(fqdn)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
set, err := d.findTxtRecord(fqdn)
|
set, err := d.findTxtRecord(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
if set == nil {
|
if set == nil {
|
||||||
return fmt.Errorf("pdns: no existing record found for %s", fqdn)
|
return fmt.Errorf("pdns: no existing record found for %s", fqdn)
|
||||||
|
@ -187,12 +187,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
body, err := json.Marshal(rrsets)
|
body, err := json.Marshal(rrsets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.sendRequest(http.MethodPatch, zone.URL, bytes.NewReader(body))
|
_, err = d.sendRequest(http.MethodPatch, zone.URL, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("pdns: %v", err)
|
return fmt.Errorf("pdns: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,7 @@ func (d *DNSProvider) makeRequest(method, uri string, body io.Reader) (json.RawM
|
||||||
|
|
||||||
resp, err := d.config.HTTPClient.Do(req)
|
resp, err := d.config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying DNS API: %v", err)
|
return nil, fmt.Errorf("error querying DNS API: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
@ -187,7 +187,7 @@ func login(config *Config) (*Identity, error) {
|
||||||
|
|
||||||
resp, err := config.HTTPClient.Do(req)
|
resp, err := config.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying Identity API: %v", err)
|
return nil, fmt.Errorf("error querying Identity API: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("RACKSPACE_USER", "RACKSPACE_API_KEY")
|
values, err := env.Get("RACKSPACE_USER", "RACKSPACE_API_KEY")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("rackspace: %v", err)
|
return nil, fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -72,12 +72,12 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.APIUser == "" || config.APIKey == "" {
|
if config.APIUser == "" || config.APIKey == "" {
|
||||||
return nil, fmt.Errorf("rackspace: credentials missing")
|
return nil, errors.New("rackspace: credentials missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
identity, err := login(config)
|
identity, err := login(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("rackspace: %v", err)
|
return nil, fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate through the Service Catalog to get the DNS Endpoint
|
// Iterate through the Service Catalog to get the DNS Endpoint
|
||||||
|
@ -90,7 +90,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if dnsEndpoint == "" {
|
if dnsEndpoint == "" {
|
||||||
return nil, fmt.Errorf("rackspace: failed to populate DNS endpoint, check Rackspace API for changes")
|
return nil, errors.New("rackspace: failed to populate DNS endpoint, check Rackspace API for changes")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DNSProvider{
|
return &DNSProvider{
|
||||||
|
@ -106,7 +106,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneID, err := d.getHostedZoneID(fqdn)
|
zoneID, err := d.getHostedZoneID(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rec := Records{
|
rec := Records{
|
||||||
|
@ -120,12 +120,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
body, err := json.Marshal(rec)
|
body, err := json.Marshal(rec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.makeRequest(http.MethodPost, fmt.Sprintf("/domains/%d/records", zoneID), bytes.NewReader(body))
|
_, err = d.makeRequest(http.MethodPost, fmt.Sprintf("/domains/%d/records", zoneID), bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -136,17 +136,17 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
zoneID, err := d.getHostedZoneID(fqdn)
|
zoneID, err := d.getHostedZoneID(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
record, err := d.findTxtRecord(fqdn, zoneID)
|
record, err := d.findTxtRecord(fqdn, zoneID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.makeRequest(http.MethodDelete, fmt.Sprintf("/domains/%d/records?id=%s", zoneID, record.ID), nil)
|
_, err = d.makeRequest(http.MethodDelete, fmt.Sprintf("/domains/%d/records?id=%s", zoneID, record.ID), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rackspace: %v", err)
|
return fmt.Errorf("rackspace: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("RFC2136_NAMESERVER")
|
values, err := env.Get("RFC2136_NAMESERVER")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("rfc2136: %v", err)
|
return nil, fmt.Errorf("rfc2136: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -74,7 +74,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Nameserver == "" {
|
if config.Nameserver == "" {
|
||||||
return nil, fmt.Errorf("rfc2136: nameserver missing")
|
return nil, errors.New("rfc2136: nameserver missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.TSIGAlgorithm == "" {
|
if config.TSIGAlgorithm == "" {
|
||||||
|
@ -86,7 +86,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
if strings.Contains(err.Error(), "missing port") {
|
if strings.Contains(err.Error(), "missing port") {
|
||||||
config.Nameserver = net.JoinHostPort(config.Nameserver, "53")
|
config.Nameserver = net.JoinHostPort(config.Nameserver, "53")
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("rfc2136: %v", err)
|
return nil, fmt.Errorf("rfc2136: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.changeRecord("INSERT", fqdn, value, d.config.TTL)
|
err := d.changeRecord("INSERT", fqdn, value, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rfc2136: failed to insert: %v", err)
|
return fmt.Errorf("rfc2136: failed to insert: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err := d.changeRecord("REMOVE", fqdn, value, d.config.TTL)
|
err := d.changeRecord("REMOVE", fqdn, value, d.config.TTL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("rfc2136: failed to remove: %v", err)
|
return fmt.Errorf("rfc2136: failed to remove: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ func (d *DNSProvider) changeRecord(action, fqdn, value string, ttl int) error {
|
||||||
// Send the query
|
// Send the query
|
||||||
reply, _, err := c.Exchange(m, d.config.Nameserver)
|
reply, _, err := c.Exchange(m, d.config.Nameserver)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DNS update failed: %v", err)
|
return fmt.Errorf("DNS update failed: %w", err)
|
||||||
}
|
}
|
||||||
if reply != nil && reply.Rcode != dns.RcodeSuccess {
|
if reply != nil && reply.Rcode != dns.RcodeSuccess {
|
||||||
return fmt.Errorf("DNS update failed: server replied: %s", dns.RcodeToString[reply.Rcode])
|
return fmt.Errorf("DNS update failed: server replied: %s", dns.RcodeToString[reply.Rcode])
|
||||||
|
|
|
@ -116,12 +116,12 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
hostedZoneID, err := d.getHostedZoneID(fqdn)
|
hostedZoneID, err := d.getHostedZoneID(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("route53: failed to determine hosted zone ID: %v", err)
|
return fmt.Errorf("route53: failed to determine hosted zone ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.getExistingRecordSets(hostedZoneID, fqdn)
|
records, err := d.getExistingRecordSets(hostedZoneID, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("route53: %v", err)
|
return fmt.Errorf("route53: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
realValue := `"` + value + `"`
|
realValue := `"` + value + `"`
|
||||||
|
@ -146,7 +146,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.changeRecord(route53.ChangeActionUpsert, hostedZoneID, recordSet)
|
err = d.changeRecord(route53.ChangeActionUpsert, hostedZoneID, recordSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("route53: %v", err)
|
return fmt.Errorf("route53: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -157,12 +157,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
hostedZoneID, err := d.getHostedZoneID(fqdn)
|
hostedZoneID, err := d.getHostedZoneID(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to determine Route 53 hosted zone ID: %v", err)
|
return fmt.Errorf("failed to determine Route 53 hosted zone ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.getExistingRecordSets(hostedZoneID, fqdn)
|
records, err := d.getExistingRecordSets(hostedZoneID, fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("route53: %v", err)
|
return fmt.Errorf("route53: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(records) == 0 {
|
if len(records) == 0 {
|
||||||
|
@ -178,7 +178,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
err = d.changeRecord(route53.ChangeActionDelete, hostedZoneID, recordSet)
|
err = d.changeRecord(route53.ChangeActionDelete, hostedZoneID, recordSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("route53: %v", err)
|
return fmt.Errorf("route53: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ func (d *DNSProvider) changeRecord(action, hostedZoneID string, recordSet *route
|
||||||
|
|
||||||
resp, err := d.client.ChangeResourceRecordSets(recordSetInput)
|
resp, err := d.client.ChangeResourceRecordSets(recordSetInput)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to change record set: %v", err)
|
return fmt.Errorf("failed to change record set: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
changeID := resp.ChangeInfo.Id
|
changeID := resp.ChangeInfo.Id
|
||||||
|
@ -207,7 +207,7 @@ func (d *DNSProvider) changeRecord(action, hostedZoneID string, recordSet *route
|
||||||
|
|
||||||
resp, err := d.client.GetChange(reqParams)
|
resp, err := d.client.GetChange(reqParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to query change status: %v", err)
|
return false, fmt.Errorf("failed to query change status: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if aws.StringValue(resp.ChangeInfo.Status) == route53.ChangeStatusInsync {
|
if aws.StringValue(resp.ChangeInfo.Status) == route53.ChangeStatusInsync {
|
||||||
|
|
|
@ -18,7 +18,7 @@ func (d *DNSProvider) addTXTRecord(fqdn, domain, value string, ttl int) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(domain)
|
zone, err := d.getHostedZone(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("sakuracloud: %v", err)
|
return fmt.Errorf("sakuracloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name := d.extractRecordName(fqdn, zone.Name)
|
name := d.extractRecordName(fqdn, zone.Name)
|
||||||
|
@ -26,7 +26,7 @@ func (d *DNSProvider) addTXTRecord(fqdn, domain, value string, ttl int) error {
|
||||||
zone.AddRecord(zone.CreateNewRecord(name, "TXT", value, ttl))
|
zone.AddRecord(zone.CreateNewRecord(name, "TXT", value, ttl))
|
||||||
_, err = d.client.Update(zone.ID, zone)
|
_, err = d.client.Update(zone.ID, zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("sakuracloud: API call failed: %v", err)
|
return fmt.Errorf("sakuracloud: API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -38,7 +38,7 @@ func (d *DNSProvider) cleanupTXTRecord(fqdn, domain string) error {
|
||||||
|
|
||||||
zone, err := d.getHostedZone(domain)
|
zone, err := d.getHostedZone(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("sakuracloud: %v", err)
|
return fmt.Errorf("sakuracloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records := d.findTxtRecords(fqdn, zone)
|
records := d.findTxtRecords(fqdn, zone)
|
||||||
|
@ -55,7 +55,7 @@ func (d *DNSProvider) cleanupTXTRecord(fqdn, domain string) error {
|
||||||
|
|
||||||
_, err = d.client.Update(zone.ID, zone)
|
_, err = d.client.Update(zone.ID, zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("sakuracloud: API call failed: %v", err)
|
return fmt.Errorf("sakuracloud: API call failed: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -71,9 +71,9 @@ func (d *DNSProvider) getHostedZone(domain string) (*sacloud.DNS, error) {
|
||||||
res, err := d.client.Reset().WithNameLike(zoneName).Find()
|
res, err := d.client.Reset().WithNameLike(zoneName).Find()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if notFound, ok := err.(api.Error); ok && notFound.ResponseCode() == http.StatusNotFound {
|
if notFound, ok := err.(api.Error); ok && notFound.ResponseCode() == http.StatusNotFound {
|
||||||
return nil, fmt.Errorf("zone %s not found on SakuraCloud DNS: %v", zoneName, err)
|
return nil, fmt.Errorf("zone %s not found on SakuraCloud DNS: %w", zoneName, err)
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("API call failed: %v", err)
|
return nil, fmt.Errorf("API call failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, zone := range res.CommonServiceDNSItems {
|
for _, zone := range res.CommonServiceDNSItems {
|
||||||
|
|
|
@ -45,7 +45,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get("SAKURACLOUD_ACCESS_TOKEN", "SAKURACLOUD_ACCESS_TOKEN_SECRET")
|
values, err := env.Get("SAKURACLOUD_ACCESS_TOKEN", "SAKURACLOUD_ACCESS_TOKEN_SECRET")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("sakuracloud: %v", err)
|
return nil, fmt.Errorf("sakuracloud: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
|
|
@ -32,7 +32,7 @@ type APIError struct {
|
||||||
Field string `json:"field"`
|
Field string `json:"field"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *APIError) Error() string {
|
func (a APIError) Error() string {
|
||||||
return fmt.Sprintf("API error: %d - %s - %s", a.Code, a.Description, a.Field)
|
return fmt.Sprintf("API error: %d - %s - %s", a.Code, a.Description, a.Field)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,13 +143,13 @@ func (c *Client) newRequest(method, uri string, body interface{}) (*http.Request
|
||||||
if body != nil {
|
if body != nil {
|
||||||
err := json.NewEncoder(buf).Encode(body)
|
err := json.NewEncoder(buf).Encode(body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to encode request body with error: %v", err)
|
return nil, fmt.Errorf("failed to encode request body with error: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := http.NewRequest(method, c.baseURL+uri, buf)
|
req, err := http.NewRequest(method, c.baseURL+uri, buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create new http request with error: %v", err)
|
return nil, fmt.Errorf("failed to create new http request with error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Add("X-Token", c.token)
|
req.Header.Add("X-Token", c.token)
|
||||||
|
@ -162,7 +162,7 @@ func (c *Client) newRequest(method, uri string, body interface{}) (*http.Request
|
||||||
func (c *Client) do(req *http.Request, to interface{}) (*http.Response, error) {
|
func (c *Client) do(req *http.Request, to interface{}) (*http.Response, error) {
|
||||||
resp, err := c.httpClient.Do(req)
|
resp, err := c.httpClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("request failed with error: %v", err)
|
return nil, fmt.Errorf("request failed with error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = checkResponse(resp)
|
err = checkResponse(resp)
|
||||||
|
@ -197,7 +197,7 @@ func checkResponse(resp *http.Response) error {
|
||||||
return fmt.Errorf("request failed with status code %d, response body: %s", resp.StatusCode, string(body))
|
return fmt.Errorf("request failed with status code %d, response body: %s", resp.StatusCode, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("request failed with status code %d: %v", resp.StatusCode, apiError)
|
return fmt.Errorf("request failed with status code %d: %w", resp.StatusCode, apiError)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -212,7 +212,7 @@ func unmarshalBody(resp *http.Response, to interface{}) error {
|
||||||
|
|
||||||
err = json.Unmarshal(body, to)
|
err = json.Unmarshal(body, to)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshaling error: %v: %s", err, string(body))
|
return fmt.Errorf("unmarshaling error: %w: %s", err, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -63,7 +63,7 @@ type DNSProvider struct {
|
||||||
func NewDNSProvider() (*DNSProvider, error) {
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
values, err := env.Get(apiTokenEnvVar)
|
values, err := env.Get(apiTokenEnvVar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("selectel: %v", err)
|
return nil, fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := NewDefaultConfig()
|
config := NewDefaultConfig()
|
||||||
|
@ -107,7 +107,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
domainObj, err := d.client.GetDomainByName(domain)
|
domainObj, err := d.client.GetDomainByName(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("selectel: %v", err)
|
return fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
txtRecord := internal.Record{
|
txtRecord := internal.Record{
|
||||||
|
@ -118,7 +118,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
_, err = d.client.AddRecord(domainObj.ID, txtRecord)
|
_, err = d.client.AddRecord(domainObj.ID, txtRecord)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("selectel: %v", err)
|
return fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -131,12 +131,12 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
domainObj, err := d.client.GetDomainByName(domain)
|
domainObj, err := d.client.GetDomainByName(domain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("selectel: %v", err)
|
return fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
records, err := d.client.ListRecords(domainObj.ID)
|
records, err := d.client.ListRecords(domainObj.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("selectel: %v", err)
|
return fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete records with specific FQDN
|
// Delete records with specific FQDN
|
||||||
|
@ -145,7 +145,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
if record.Name == recordName {
|
if record.Name == recordName {
|
||||||
err = d.client.DeleteRecord(domainObj.ID, record.ID)
|
err = d.client.DeleteRecord(domainObj.ID, record.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastErr = fmt.Errorf("selectel: %v", err)
|
lastErr = fmt.Errorf("selectel: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue