diff --git a/internal/acme/dns_provider.go b/internal/acme/dns_provider.go index e6205075..4a6b29b7 100644 --- a/internal/acme/dns_provider.go +++ b/internal/acme/dns_provider.go @@ -29,7 +29,10 @@ func NewDNSProvider(raw dnsclients.ProviderInterface, dnsDomain string) *DNSProv func (this *DNSProvider) Present(domain, token, keyAuth string) error { _ = os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", "true") - fqdn, value := dns01.GetRecord(domain, keyAuth) + var info = dns01.GetChallengeInfo(domain, keyAuth) + + var fqdn = info.EffectiveFQDN + var value = info.Value // 设置记录 var index = strings.Index(fqdn, "."+this.dnsDomain) @@ -66,6 +69,7 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error { Type: dnstypes.RecordTypeTXT, Value: value, Route: this.raw.DefaultRoute(), + TTL: this.raw.MinTTL(), }) if err != nil { return fmt.Errorf("create DNS record failed: %w", err) diff --git a/internal/db/models/acme/acme_task_dao.go b/internal/db/models/acme/acme_task_dao.go index 7d57730f..17f50a99 100644 --- a/internal/db/models/acme/acme_task_dao.go +++ b/internal/db/models/acme/acme_task_dao.go @@ -266,7 +266,6 @@ func (this *ACMETaskDAO) FindACMETaskUserId(tx *dbs.Tx, taskId int64) (userId in FindInt64Col(0) } - // UpdateACMETaskCert 设置任务关联的证书 func (this *ACMETaskDAO) UpdateACMETaskCert(tx *dbs.Tx, taskId int64, certId int64) error { if taskId <= 0 { @@ -387,6 +386,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool, errMsg = "暂不支持此类型的DNS服务商 '" + dnsProvider.Type + "'" return } + providerInterface.SetMinTTL(int32(dnsProvider.MinTTL)) apiParams, err := dnsProvider.DecodeAPIParams() if err != nil { errMsg = "解析DNS服务商API参数时出错:" + err.Error() diff --git a/internal/db/models/dns/dns_provider_dao.go b/internal/db/models/dns/dns_provider_dao.go index 1691b285..7a507bb1 100644 --- a/internal/db/models/dns/dns_provider_dao.go +++ b/internal/db/models/dns/dns_provider_dao.go @@ -67,7 +67,7 @@ func (this *DNSProviderDAO) FindEnabledDNSProvider(tx *dbs.Tx, id int64) (*DNSPr } // CreateDNSProvider 创建服务商 -func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId int64, providerType string, name string, apiParamsJSON []byte) (int64, error) { +func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId int64, providerType string, name string, apiParamsJSON []byte, minTTL int32) (int64, error) { var op = NewDNSProviderOperator() op.AdminId = adminId op.UserId = userId @@ -76,6 +76,11 @@ func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId if len(apiParamsJSON) > 0 { op.ApiParams = apiParamsJSON } + + if minTTL >= 0 { + op.MinTTL = minTTL + } + op.State = DNSProviderStateEnabled err := this.Save(tx, op) if err != nil { @@ -85,7 +90,7 @@ func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId } // UpdateDNSProvider 修改服务商 -func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, name string, apiParamsJSON []byte) error { +func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, name string, apiParamsJSON []byte, minTTL int32) error { if dnsProviderId <= 0 { return errors.New("invalid dnsProviderId") } @@ -99,6 +104,10 @@ func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, n op.ApiParams = apiParamsJSON } + if minTTL >= 0 { + op.MinTTL = minTTL + } + err := this.Save(tx, op) if err != nil { return err diff --git a/internal/db/models/dns/dns_provider_model.go b/internal/db/models/dns/dns_provider_model.go index 4a2a1313..5b65c227 100644 --- a/internal/db/models/dns/dns_provider_model.go +++ b/internal/db/models/dns/dns_provider_model.go @@ -2,6 +2,19 @@ package dns import "github.com/iwind/TeaGo/dbs" +const ( + DNSProviderField_Id dbs.FieldName = "id" // ID + DNSProviderField_Name dbs.FieldName = "name" // 名称 + DNSProviderField_AdminId dbs.FieldName = "adminId" // 管理员ID + DNSProviderField_UserId dbs.FieldName = "userId" // 用户ID + DNSProviderField_Type dbs.FieldName = "type" // 供应商类型 + DNSProviderField_ApiParams dbs.FieldName = "apiParams" // API参数 + DNSProviderField_CreatedAt dbs.FieldName = "createdAt" // 创建时间 + DNSProviderField_State dbs.FieldName = "state" // 状态 + DNSProviderField_DataUpdatedAt dbs.FieldName = "dataUpdatedAt" // 数据同步时间 + DNSProviderField_MinTTL dbs.FieldName = "minTTL" // 最小TTL +) + // DNSProvider DNS服务商 type DNSProvider struct { Id uint32 `field:"id"` // ID @@ -13,18 +26,20 @@ type DNSProvider struct { CreatedAt uint64 `field:"createdAt"` // 创建时间 State uint8 `field:"state"` // 状态 DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间 + MinTTL uint32 `field:"minTTL"` // 最小TTL } type DNSProviderOperator struct { - Id interface{} // ID - Name interface{} // 名称 - AdminId interface{} // 管理员ID - UserId interface{} // 用户ID - Type interface{} // 供应商类型 - ApiParams interface{} // API参数 - CreatedAt interface{} // 创建时间 - State interface{} // 状态 - DataUpdatedAt interface{} // 数据同步时间 + Id any // ID + Name any // 名称 + AdminId any // 管理员ID + UserId any // 用户ID + Type any // 供应商类型 + ApiParams any // API参数 + CreatedAt any // 创建时间 + State any // 状态 + DataUpdatedAt any // 数据同步时间 + MinTTL any // 最小TTL } func NewDNSProviderOperator() *DNSProviderOperator { diff --git a/internal/dnsclients/provider_base.go b/internal/dnsclients/provider_base.go index 886c8c49..10745615 100644 --- a/internal/dnsclients/provider_base.go +++ b/internal/dnsclients/provider_base.go @@ -5,7 +5,9 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" ) -type BaseProvider struct{} +type BaseProvider struct { + minTTL int32 +} // WrapError 封装解析相关错误 func (this *BaseProvider) WrapError(err error, domain string, record *dnstypes.Record) error { @@ -25,3 +27,16 @@ func (this *BaseProvider) WrapError(err error, domain string, record *dnstypes.R } return fmt.Errorf("record operation failed: '%s %s %s %d': %w", fullname, record.Type, record.Value, record.TTL, err) } + +// SetMinTTL 设置最小TTL +func (this *BaseProvider) SetMinTTL(ttl int32) { + this.minTTL = ttl +} + +// MinTTL 最小TTL +func (this *BaseProvider) MinTTL() int32 { + if this.minTTL > 0 { + return this.minTTL + } + return 0 +} diff --git a/internal/dnsclients/provider_interface.go b/internal/dnsclients/provider_interface.go index d60e6561..7af5574a 100644 --- a/internal/dnsclients/provider_interface.go +++ b/internal/dnsclients/provider_interface.go @@ -39,4 +39,10 @@ type ProviderInterface interface { // DefaultRoute 默认线路 DefaultRoute() string + + // SetMinTTL 设置最小TTL + SetMinTTL(ttl int32) + + // MinTTL 最小TTL + MinTTL() int32 } diff --git a/internal/rpc/services/service_dns_provider.go b/internal/rpc/services/service_dns_provider.go index 15a6cef2..84167957 100644 --- a/internal/rpc/services/service_dns_provider.go +++ b/internal/rpc/services/service_dns_provider.go @@ -24,7 +24,7 @@ func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.C var tx = this.NullTx() - providerId, err := dns.SharedDNSProviderDAO.CreateDNSProvider(tx, adminId, userId, req.Type, req.Name, req.ApiParamsJSON) + providerId, err := dns.SharedDNSProviderDAO.CreateDNSProvider(tx, adminId, userId, req.Type, req.Name, req.ApiParamsJSON, req.MinTTL) if err != nil { return nil, err } @@ -59,7 +59,7 @@ func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.U return nil, err } - err = dns.SharedDNSProviderDAO.UpdateDNSProvider(tx, req.DnsProviderId, req.Name, req.ApiParamsJSON) + err = dns.SharedDNSProviderDAO.UpdateDNSProvider(tx, req.DnsProviderId, req.Name, req.ApiParamsJSON, req.MinTTL) if err != nil { return nil, err } @@ -114,6 +114,7 @@ func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req TypeName: dnsclients.FindProviderTypeName(provider.Type), ApiParamsJSON: provider.ApiParams, DataUpdatedAt: int64(provider.DataUpdatedAt), + MinTTL: int32(provider.MinTTL), }) } return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil @@ -148,6 +149,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context, TypeName: dnsclients.FindProviderTypeName(provider.Type), ApiParamsJSON: provider.ApiParams, DataUpdatedAt: int64(provider.DataUpdatedAt), + MinTTL: int32(provider.MinTTL), }) } return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil @@ -218,6 +220,7 @@ func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req TypeName: dnsclients.FindProviderTypeName(provider.Type), ApiParamsJSON: provider.ApiParams, DataUpdatedAt: int64(provider.DataUpdatedAt), + MinTTL: int32(provider.MinTTL), }, }, nil } @@ -262,6 +265,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.C Name: provider.Name, Type: provider.Type, TypeName: dnsclients.FindProviderTypeName(provider.Type), + MinTTL: int32(provider.MinTTL), }) } return &pb.FindAllEnabledDNSProvidersWithTypeResponse{DnsProviders: result}, nil diff --git a/internal/setup/sql.json b/internal/setup/sql.json index a86d5acf..2bf3194a 100644 --- a/internal/setup/sql.json +++ b/internal/setup/sql.json @@ -109381,7 +109381,7 @@ "name": "edgeDNSProviders", "engine": "InnoDB", "charset": "utf8mb4_general_ci", - "definition": "CREATE TABLE `edgeDNSProviders` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `type` varchar(255) DEFAULT NULL COMMENT '供应商类型',\n `apiParams` json DEFAULT NULL COMMENT 'API参数',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `dataUpdatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '数据同步时间',\n PRIMARY KEY (`id`),\n KEY `type` (`type`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DNS服务商'", + "definition": "CREATE TABLE `edgeDNSProviders` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `type` varchar(255) DEFAULT NULL COMMENT '供应商类型',\n `apiParams` json DEFAULT NULL COMMENT 'API参数',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `dataUpdatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '数据同步时间',\n `minTTL` int(11) unsigned DEFAULT '0' COMMENT '最小TTL',\n PRIMARY KEY (`id`),\n KEY `type` (`type`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DNS服务商'", "fields": [ { "name": "id", @@ -109418,6 +109418,10 @@ { "name": "dataUpdatedAt", "definition": "bigint(11) unsigned DEFAULT '0' COMMENT '数据同步时间'" + }, + { + "name": "minTTL", + "definition": "int(11) unsigned DEFAULT '0' COMMENT '最小TTL'" } ], "indexes": [