From 0a1834c8654cc987b51cf5188708974321e3c74a Mon Sep 17 00:00:00 2001 From: artin Date: Thu, 4 Dec 2025 02:18:05 +0800 Subject: [PATCH] ALIDNS: Implement default TTL handling and provider registration --- commands/getZones.go | 13 +++++++++++++ providers/alidns/aliDnsProvider.go | 8 ++++++++ providers/alidns/convert.go | 1 + providers/providers.go | 14 ++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/commands/getZones.go b/commands/getZones.go index 80c6327e7..feb1b95fd 100644 --- a/commands/getZones.go +++ b/commands/getZones.go @@ -167,6 +167,12 @@ func GetZone(args GetZoneArgs) error { return fmt.Errorf("failed GetZone CDP: %w", err) } + // Get the actual provider type name from creds.json or args + providerType := args.ProviderName + if providerType == "" || providerType == "-" { + providerType = providerConfigs[args.CredName][pproviderTypeFieldName] + } + // decide which zones we need to convert zones := args.ZoneNames if len(args.ZoneNames) == 1 && args.ZoneNames[0] == "all" { @@ -253,6 +259,13 @@ func GetZone(args GetZoneArgs) error { if defaultTTL == 0 { defaultTTL = prettyzone.MostCommonTTL(recs) } + // If provider has a registered default TTL and no records exist or MostCommonTTL returns 0, + // use the provider's default TTL + if defaultTTL == 0 || defaultTTL == models.DefaultTTL { + if providerDefaultTTL := providers.GetDefaultTTL(providerType); providerDefaultTTL > 0 { + defaultTTL = providerDefaultTTL + } + } if defaultTTL != models.DefaultTTL && defaultTTL != 0 { o = append(o, fmt.Sprintf("DefaultTTL(%d)", defaultTTL)) } diff --git a/providers/alidns/aliDnsProvider.go b/providers/alidns/aliDnsProvider.go index 31e068a20..eb60305e8 100644 --- a/providers/alidns/aliDnsProvider.go +++ b/providers/alidns/aliDnsProvider.go @@ -46,6 +46,9 @@ func init() { // The domain name in the browser's address bar does not change, but the content displayed is from the target website. providers.RegisterCustomRecordType("IMPLICIT_URL_FORWARDING", providerName, "") providers.RegisterMaintainer(providerName, providerMaintainer) + // Register default TTL of 600 seconds (10 minutes) for Alibaba Cloud DNS + // This is the minimum TTL for free/personal edition domains + providers.RegisterDefaultTTL(providerName, 600) } @@ -150,6 +153,11 @@ func (a *aliDnsDsp) PrepDesiredRecords(dc *models.DomainConfig) { recordsToKeep := make([]*models.RecordConfig, 0, len(dc.Records)) for _, rec := range dc.Records { + // If TTL is 0 (not set), use the minimum TTL as default + if rec.TTL == 0 { + rec.TTL = versionInfo.minTTL + } + if rec.TTL < versionInfo.minTTL { printer.Warnf("record %s has TTL %d which is below the minimum %d for this domain version (%s)\n", rec.GetLabelFQDN(), rec.TTL, versionInfo.minTTL, versionInfo.versionCode) diff --git a/providers/alidns/convert.go b/providers/alidns/convert.go index 7be8b85ff..ab1f3942e 100644 --- a/providers/alidns/convert.go +++ b/providers/alidns/convert.go @@ -15,6 +15,7 @@ func nativeToRecord(r *alidns.Record, domain string) (*models.RecordConfig, erro TTL: uint32(r.TTL), Original: r, } + label, err := idna.ToASCII(r.RR) if err != nil { return nil, fmt.Errorf("failed to convert label to ASCII: %w", err) diff --git a/providers/providers.go b/providers/providers.go index 762e91bb8..b8b396b4f 100644 --- a/providers/providers.go +++ b/providers/providers.go @@ -83,6 +83,20 @@ func RegisterMaintainer( ProviderMaintainers[providerName] = gitHubUsername } +// ProviderDefaultTTLs stores the default TTL for each provider. +var ProviderDefaultTTLs = map[string]uint32{} + +// RegisterDefaultTTL registers a default TTL for a provider. +// This is used by get-zones to determine the DefaultTTL when generating output. +func RegisterDefaultTTL(providerName string, defaultTTL uint32) { + ProviderDefaultTTLs[providerName] = defaultTTL +} + +// GetDefaultTTL returns the default TTL for a provider, or 0 if not registered. +func GetDefaultTTL(providerName string) uint32 { + return ProviderDefaultTTLs[providerName] +} + // CreateRegistrar initializes a registrar instance from given credentials. func CreateRegistrar(rType string, config map[string]string) (Registrar, error) { var err error