Merge branch 'main' into tlim_idn

This commit is contained in:
Thomas Limoncelli 2025-12-03 09:13:49 -05:00
commit 57707f2538
No known key found for this signature in database
3 changed files with 70 additions and 48 deletions

View file

@ -185,6 +185,11 @@ func (c *cloudnsProvider) createDomain(domain string) error {
if _, err := c.get("/dns/register.json", params); err != nil {
return fmt.Errorf("failed create domain (ClouDNS): %w", err)
}
c.Lock()
defer c.Unlock()
if c.domainIndex != nil {
c.domainIndex[domain] = domain
}
return nil
}

View file

@ -268,6 +268,11 @@ func (c *desecProvider) createDomain(domain string) error {
printer.Printf(" %s\n", d)
}
}
c.domainIndexLock.Lock()
defer c.domainIndexLock.Unlock()
if c.domainIndex != nil {
c.domainIndex[domain] = dm.MinimumTTL
}
return nil
}

View file

@ -9,14 +9,10 @@ import (
"sort"
"strconv"
"strings"
"sync"
"time"
"unicode/utf8"
"github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/pkg/diff2"
"github.com/StackExchange/dnscontrol/v4/pkg/printer"
"github.com/StackExchange/dnscontrol/v4/pkg/txtutil"
"github.com/StackExchange/dnscontrol/v4/providers"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
@ -26,12 +22,19 @@ import (
r53d "github.com/aws/aws-sdk-go-v2/service/route53domains"
r53dTypes "github.com/aws/aws-sdk-go-v2/service/route53domains/types"
"github.com/aws/aws-sdk-go-v2/service/sts"
"github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/pkg/diff2"
"github.com/StackExchange/dnscontrol/v4/pkg/printer"
"github.com/StackExchange/dnscontrol/v4/pkg/txtutil"
"github.com/StackExchange/dnscontrol/v4/providers"
)
type route53Provider struct {
client *r53.Client
registrar *r53d.Client
delegationSet *string
zonesMu sync.Mutex
zonesByID map[string]r53Types.HostedZone
zonesByDomain map[string]r53Types.HostedZone
}
@ -82,7 +85,13 @@ func newRoute53(m map[string]string, _ json.RawMessage) (*route53Provider, error
printer.Printf("ROUTE53 DelegationSet %s configured\n", val)
dls = aws.String(val)
}
api := &route53Provider{client: r53.NewFromConfig(config), registrar: r53d.NewFromConfig(config), delegationSet: dls}
api := &route53Provider{
client: r53.NewFromConfig(config),
registrar: r53d.NewFromConfig(config),
delegationSet: dls,
zonesByDomain: make(map[string]r53Types.HostedZone),
zonesByID: make(map[string]r53Types.HostedZone),
}
err = api.getZones()
if err != nil {
return nil, err
@ -148,9 +157,8 @@ func withRetry(f func() error) {
// ListZones lists the zones on this account.
func (r *route53Provider) ListZones() ([]string, error) {
if err := r.getZones(); err != nil {
return nil, err
}
r.zonesMu.Lock()
defer r.zonesMu.Unlock()
var zones []string
for i := range r.zonesByDomain {
zones = append(zones, i)
@ -158,14 +166,24 @@ func (r *route53Provider) ListZones() ([]string, error) {
return zones, nil
}
func (r *route53Provider) getZones() error {
if r.zonesByDomain != nil {
return nil
}
func (r *route53Provider) getZoneByDomain(domain string) (r53Types.HostedZone, bool) {
r.zonesMu.Lock()
defer r.zonesMu.Unlock()
zone, ok := r.zonesByDomain[domain]
return zone, ok
}
func (r *route53Provider) getZoneByID(id string) (r53Types.HostedZone, bool) {
r.zonesMu.Lock()
defer r.zonesMu.Unlock()
zone, ok := r.zonesByID[id]
return zone, ok
}
func (r *route53Provider) getZones() error {
r.zonesMu.Lock()
defer r.zonesMu.Unlock()
var nextMarker *string
r.zonesByDomain = make(map[string]r53Types.HostedZone)
r.zonesByID = make(map[string]r53Types.HostedZone)
for {
var out *r53.ListHostedZonesOutput
var err error
@ -180,9 +198,7 @@ func (r *route53Provider) getZones() error {
return err
}
for _, z := range out.HostedZones {
domain := strings.TrimSuffix(aws.ToString(z.Name), ".")
r.zonesByDomain[domain] = z
r.zonesByID[parseZoneID(aws.ToString(z.Id))] = z
r.addZoneToCacheLocked(z)
}
if out.NextMarker != nil {
nextMarker = out.NextMarker
@ -193,6 +209,14 @@ func (r *route53Provider) getZones() error {
return nil
}
// addZoneToCacheLocked adds the given zone to the cache.
// The caller must hold zonesMu.
func (r *route53Provider) addZoneToCacheLocked(z r53Types.HostedZone) {
domain := strings.TrimSuffix(aws.ToString(z.Name), ".")
r.zonesByDomain[domain] = z
r.zonesByID[parseZoneID(aws.ToString(z.Id))] = z
}
type errDomainNoExist struct {
domain string
}
@ -210,11 +234,7 @@ func (e errZoneNoExist) Error() string {
}
func (r *route53Provider) GetNameservers(domain string) ([]*models.Nameserver, error) {
if err := r.getZones(); err != nil {
return nil, err
}
zone, ok := r.zonesByDomain[domain]
zone, ok := r.getZoneByDomain(domain)
if !ok {
return nil, errDomainNoExist{domain}
}
@ -236,15 +256,12 @@ func (r *route53Provider) GetNameservers(domain string) ([]*models.Nameserver, e
}
func (r *route53Provider) GetZoneRecords(domain string, meta map[string]string) (models.Records, error) {
if err := r.getZones(); err != nil {
return nil, err
}
var zone r53Types.HostedZone
// If the zone_id is specified in meta, use it.
if zoneID, ok := meta["zone_id"]; ok {
zone = r.zonesByID[zoneID]
zone, found := r.getZoneByID(zoneID)
if !found {
return nil, errZoneNoExist{zoneID}
}
return r.getZoneRecords(zone)
}
@ -254,7 +271,7 @@ func (r *route53Provider) GetZoneRecords(domain string, meta map[string]string)
// }
// Otherwise, use the domain name to look up the zone.
if zone, ok := r.zonesByDomain[domain]; ok {
if zone, ok := r.getZoneByDomain(domain); ok {
return r.getZoneRecords(zone)
}
@ -263,19 +280,15 @@ func (r *route53Provider) GetZoneRecords(domain string, meta map[string]string)
}
func (r *route53Provider) getZone(dc *models.DomainConfig) (r53Types.HostedZone, error) {
if err := r.getZones(); err != nil {
return r53Types.HostedZone{}, err
}
if zoneID, ok := dc.Metadata["zone_id"]; ok {
zone, ok := r.zonesByID[zoneID]
zone, ok := r.getZoneByID(zoneID)
if !ok {
return r53Types.HostedZone{}, errZoneNoExist{zoneID}
}
return zone, nil
}
if zone, ok := r.zonesByDomain[dc.Name]; ok {
if zone, ok := r.getZoneByDomain(dc.Name); ok {
return zone, nil
}
@ -647,11 +660,7 @@ func unescape(s *string) string {
}
func (r *route53Provider) EnsureZoneExists(domain string, metadata map[string]string) error {
if err := r.getZones(); err != nil {
return err
}
if _, ok := r.zonesByDomain[domain]; ok {
if _, ok := r.getZoneByDomain(domain); ok {
return nil
}
if r.delegationSet != nil {
@ -665,16 +674,19 @@ func (r *route53Provider) EnsureZoneExists(domain string, metadata map[string]st
CallerReference: aws.String(strconv.FormatInt(time.Now().UnixNano(), 10)),
}
// reset zone cache
r.zonesByDomain = nil
r.zonesByID = nil
var z *r53.CreateHostedZoneOutput
var err error
withRetry(func() error {
_, err := r.client.CreateHostedZone(context.Background(), in)
z, err = r.client.CreateHostedZone(context.Background(), in)
return err
})
return err
if err != nil {
return err
}
r.zonesMu.Lock()
defer r.zonesMu.Unlock()
r.addZoneToCacheLocked(*z.HostedZone)
return nil
}
// changeBatcher takes a set of r53Types.Changes and turns them into a series of