Skip to content

Commit

Permalink
review
Browse files Browse the repository at this point in the history
  • Loading branch information
ldez committed May 5, 2023
1 parent 198e23f commit 254f21b
Show file tree
Hide file tree
Showing 11 changed files with 638 additions and 490 deletions.
2 changes: 1 addition & 1 deletion cmd/zz_gen_cmd_dnshelp.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ func displayDNSHelp(w io.Writer, name string) error {
// generated from: providers/dns/beget/beget.toml
ew.writeln(`Configuration for Beget.com.`)
ew.writeln(`Code: 'beget'`)
ew.writeln(`Since: 'v1.0.0'`)
ew.writeln(`Since: 'v4.12.0'`)
ew.writeln()

ew.writeln(`Credentials:`)
Expand Down
4 changes: 2 additions & 2 deletions docs/content/dns/zz_gen_beget.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ date: 2019-03-03T16:39:46+01:00
draft: false
slug: beget
dnsprovider:
since: "v1.0.0"
since: "v4.12.0"
code: "beget"
url: "https://beget.com/"
---
Expand All @@ -20,7 +20,7 @@ Configuration for [Beget.com](https://beget.com/).
<!--more-->

- Code: `beget`
- Since: v1.0.0
- Since: v4.12.0


Here is an example bash command using the Beget.com provider:
Expand Down
285 changes: 143 additions & 142 deletions providers/dns/beget/beget.go
Original file line number Diff line number Diff line change
@@ -1,142 +1,143 @@
// Package beget implements a DNS provider for solving the DNS-01 challenge using beget.com DNS.
package beget

import (
"errors"
"fmt"
"net/http"
"time"

"github.com/go-acme/lego/v4/challenge/dns01"
"github.com/go-acme/lego/v4/platform/config/env"
"github.com/go-acme/lego/v4/providers/dns/beget/internal"
)

// Environment variables names.
const (
envNamespace = "BEGET_"

EnvUsername = envNamespace + "USERNAME"
EnvPassword = envNamespace + "PASSWORD"

EnvTTL = envNamespace + "TTL"
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
)

// Config is used to configure the creation of the DNSProvider.
type Config struct {
Username string
Password string

PropagationTimeout time.Duration
PollingInterval time.Duration
TTL int
HTTPClient *http.Client
}

// NewDefaultConfig returns a default configuration for the DNSProvider.
func NewDefaultConfig() *Config {
return &Config{
TTL: env.GetOrDefaultInt(EnvTTL, 300),
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout*2), //2m
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
HTTPClient: &http.Client{
Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
},
}
}

// DNSProvider implements the challenge.Provider interface.
type DNSProvider struct {
config *Config
client *internal.Client
}

// NewDNSProvider returns a DNSProvider instance configured for beget.com.
// Credentials must be passed in the environment variables:
// BEGET_USERNAME and BEGET_PASSWORD.
func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(EnvUsername, EnvPassword)
if err != nil {
return nil, fmt.Errorf("beget: %w", err)
}

config := NewDefaultConfig()
config.Username = values[EnvUsername]
config.Password = values[EnvPassword]

return NewDNSProviderConfig(config)
}

// NewDNSProviderConfig return a DNSProvider instance configured for beget.com.
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
if config == nil {
return nil, errors.New("beget: the configuration of the DNS provider is nil")
}

if config.Username == "" || config.Password == "" {
return nil, errors.New("beget: incomplete credentials, missing username and/or password")
}

client := internal.NewClient(config.Username, config.Password)

if config.HTTPClient != nil {
client.HTTPClient = config.HTTPClient
}

return &DNSProvider{config: config, client: client}, nil
}

// Timeout returns the timeout and interval to use when checking for DNS propagation.
// Adjusting here to cope with spikes in propagation times.
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
return d.config.PropagationTimeout, d.config.PollingInterval
}

// Present creates a TXT record using the specified parameters.
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)

authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("beget: could not find zone for domain %q and fqdn %q : %w", domain, info.EffectiveFQDN, err)
}

subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, authZone)
if err != nil {
return fmt.Errorf("beget: %w", err)
}

err = d.client.AddTXTRecord(dns01.UnFqdn(authZone), subDomain, info.Value)
if err != nil {
return fmt.Errorf("beget: failed to create TXT records [domain: %s, sub domain: %s]: %w",
dns01.UnFqdn(authZone), subDomain, err)
}

return nil
}

// CleanUp removes the TXT record matching the specified parameters.
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)

authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("beget: could not find zone for domain %q and fqdn %q : %w", domain, info.EffectiveFQDN, err)
}

subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, authZone)
if err != nil {
return fmt.Errorf("beget: %w", err)
}

err = d.client.RemoveTxtRecord(dns01.UnFqdn(authZone), subDomain)
if err != nil {
return fmt.Errorf("beget: failed to remove TXT records [domain: %s, sub domain: %s]: %w",
dns01.UnFqdn(authZone), subDomain, err)
}

return nil
}
// Package beget implements a DNS provider for solving the DNS-01 challenge using beget.com DNS.
package beget

import (
"context"
"errors"
"fmt"
"net/http"
"time"

"github.com/go-acme/lego/v4/challenge/dns01"
"github.com/go-acme/lego/v4/platform/config/env"
"github.com/go-acme/lego/v4/providers/dns/beget/internal"
)

// Environment variables names.
const (
envNamespace = "BEGET_"

EnvUsername = envNamespace + "USERNAME"
EnvPassword = envNamespace + "PASSWORD"

EnvTTL = envNamespace + "TTL"
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
)

// Config is used to configure the creation of the DNSProvider.
type Config struct {
Username string
Password string

PropagationTimeout time.Duration
PollingInterval time.Duration
TTL int
HTTPClient *http.Client
}

// NewDefaultConfig returns a default configuration for the DNSProvider.
func NewDefaultConfig() *Config {
return &Config{
TTL: env.GetOrDefaultInt(EnvTTL, 300),
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout*2), // 2m
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
HTTPClient: &http.Client{
Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
},
}
}

// DNSProvider implements the challenge.Provider interface.
type DNSProvider struct {
config *Config
client *internal.Client
}

// NewDNSProvider returns a DNSProvider instance configured for beget.com.
// Credentials must be passed in the environment variables:
// BEGET_USERNAME and BEGET_PASSWORD.
func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(EnvUsername, EnvPassword)
if err != nil {
return nil, fmt.Errorf("beget: %w", err)
}

config := NewDefaultConfig()
config.Username = values[EnvUsername]
config.Password = values[EnvPassword]

return NewDNSProviderConfig(config)
}

// NewDNSProviderConfig return a DNSProvider instance configured for beget.com.
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
if config == nil {
return nil, errors.New("beget: the configuration of the DNS provider is nil")
}

if config.Username == "" || config.Password == "" {
return nil, errors.New("beget: incomplete credentials, missing username and/or password")
}

client := internal.NewClient(config.Username, config.Password)

if config.HTTPClient != nil {
client.HTTPClient = config.HTTPClient
}

return &DNSProvider{config: config, client: client}, nil
}

// Timeout returns the timeout and interval to use when checking for DNS propagation.
// Adjusting here to cope with spikes in propagation times.
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
return d.config.PropagationTimeout, d.config.PollingInterval
}

// Present creates a TXT record using the specified parameters.
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)

authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("beget: could not find zone for domain %q (%s): %w", domain, info.EffectiveFQDN, err)
}

subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, authZone)
if err != nil {
return fmt.Errorf("beget: %w", err)
}

err = d.client.AddTXTRecord(context.Background(), dns01.UnFqdn(authZone), subDomain, info.Value)
if err != nil {
return fmt.Errorf("beget: failed to create TXT records [domain: %s, sub domain: %s]: %w",
dns01.UnFqdn(authZone), subDomain, err)
}

return nil
}

// CleanUp removes the TXT record matching the specified parameters.
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
info := dns01.GetChallengeInfo(domain, keyAuth)

authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("beget: could not find zone for domain %q (%s): %w", domain, info.EffectiveFQDN, err)
}

subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, authZone)
if err != nil {
return fmt.Errorf("beget: %w", err)
}

err = d.client.RemoveTxtRecord(context.Background(), dns01.UnFqdn(authZone), subDomain)
if err != nil {
return fmt.Errorf("beget: failed to remove TXT records [domain: %s, sub domain: %s]: %w",
dns01.UnFqdn(authZone), subDomain, err)
}

return nil
}
2 changes: 1 addition & 1 deletion providers/dns/beget/beget.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Name = "Beget.com"
Description = ''''''
URL = "https://beget.com/"
Code = "beget"
Since = "v1.0.0"
Since = "v4.12.0"

Example = '''
BEGET_USERNAME=xxxxxx \
Expand Down
Loading

0 comments on commit 254f21b

Please sign in to comment.