ALIDNS: Implement default TTL handling and provider registration

This commit is contained in:
artin 2025-12-04 02:18:05 +08:00
parent 90650e4d8b
commit 0a1834c865
4 changed files with 36 additions and 0 deletions

View file

@ -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))
}

View file

@ -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)

View file

@ -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)

View file

@ -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