DNS服务商账号增加“最小TTL”选项

This commit is contained in:
GoEdgeLab
2024-05-12 09:33:51 +08:00
parent 8d049c8239
commit 058d586341
8 changed files with 74 additions and 17 deletions

View File

@@ -29,7 +29,10 @@ func NewDNSProvider(raw dnsclients.ProviderInterface, dnsDomain string) *DNSProv
func (this *DNSProvider) Present(domain, token, keyAuth string) error { func (this *DNSProvider) Present(domain, token, keyAuth string) error {
_ = os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", "true") _ = 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) var index = strings.Index(fqdn, "."+this.dnsDomain)
@@ -66,6 +69,7 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error {
Type: dnstypes.RecordTypeTXT, Type: dnstypes.RecordTypeTXT,
Value: value, Value: value,
Route: this.raw.DefaultRoute(), Route: this.raw.DefaultRoute(),
TTL: this.raw.MinTTL(),
}) })
if err != nil { if err != nil {
return fmt.Errorf("create DNS record failed: %w", err) return fmt.Errorf("create DNS record failed: %w", err)

View File

@@ -266,7 +266,6 @@ func (this *ACMETaskDAO) FindACMETaskUserId(tx *dbs.Tx, taskId int64) (userId in
FindInt64Col(0) FindInt64Col(0)
} }
// UpdateACMETaskCert 设置任务关联的证书 // UpdateACMETaskCert 设置任务关联的证书
func (this *ACMETaskDAO) UpdateACMETaskCert(tx *dbs.Tx, taskId int64, certId int64) error { func (this *ACMETaskDAO) UpdateACMETaskCert(tx *dbs.Tx, taskId int64, certId int64) error {
if taskId <= 0 { if taskId <= 0 {
@@ -387,6 +386,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
errMsg = "暂不支持此类型的DNS服务商 '" + dnsProvider.Type + "'" errMsg = "暂不支持此类型的DNS服务商 '" + dnsProvider.Type + "'"
return return
} }
providerInterface.SetMinTTL(int32(dnsProvider.MinTTL))
apiParams, err := dnsProvider.DecodeAPIParams() apiParams, err := dnsProvider.DecodeAPIParams()
if err != nil { if err != nil {
errMsg = "解析DNS服务商API参数时出错" + err.Error() errMsg = "解析DNS服务商API参数时出错" + err.Error()

View File

@@ -67,7 +67,7 @@ func (this *DNSProviderDAO) FindEnabledDNSProvider(tx *dbs.Tx, id int64) (*DNSPr
} }
// CreateDNSProvider 创建服务商 // 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() var op = NewDNSProviderOperator()
op.AdminId = adminId op.AdminId = adminId
op.UserId = userId op.UserId = userId
@@ -76,6 +76,11 @@ func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId
if len(apiParamsJSON) > 0 { if len(apiParamsJSON) > 0 {
op.ApiParams = apiParamsJSON op.ApiParams = apiParamsJSON
} }
if minTTL >= 0 {
op.MinTTL = minTTL
}
op.State = DNSProviderStateEnabled op.State = DNSProviderStateEnabled
err := this.Save(tx, op) err := this.Save(tx, op)
if err != nil { if err != nil {
@@ -85,7 +90,7 @@ func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId
} }
// UpdateDNSProvider 修改服务商 // 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 { if dnsProviderId <= 0 {
return errors.New("invalid dnsProviderId") return errors.New("invalid dnsProviderId")
} }
@@ -99,6 +104,10 @@ func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, n
op.ApiParams = apiParamsJSON op.ApiParams = apiParamsJSON
} }
if minTTL >= 0 {
op.MinTTL = minTTL
}
err := this.Save(tx, op) err := this.Save(tx, op)
if err != nil { if err != nil {
return err return err

View File

@@ -2,6 +2,19 @@ package dns
import "github.com/iwind/TeaGo/dbs" 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服务商 // DNSProvider DNS服务商
type DNSProvider struct { type DNSProvider struct {
Id uint32 `field:"id"` // ID Id uint32 `field:"id"` // ID
@@ -13,18 +26,20 @@ type DNSProvider struct {
CreatedAt uint64 `field:"createdAt"` // 创建时间 CreatedAt uint64 `field:"createdAt"` // 创建时间
State uint8 `field:"state"` // 状态 State uint8 `field:"state"` // 状态
DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间 DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间
MinTTL uint32 `field:"minTTL"` // 最小TTL
} }
type DNSProviderOperator struct { type DNSProviderOperator struct {
Id interface{} // ID Id any // ID
Name interface{} // 名称 Name any // 名称
AdminId interface{} // 管理员ID AdminId any // 管理员ID
UserId interface{} // 用户ID UserId any // 用户ID
Type interface{} // 供应商类型 Type any // 供应商类型
ApiParams interface{} // API参数 ApiParams any // API参数
CreatedAt interface{} // 创建时间 CreatedAt any // 创建时间
State interface{} // 状态 State any // 状态
DataUpdatedAt interface{} // 数据同步时间 DataUpdatedAt any // 数据同步时间
MinTTL any // 最小TTL
} }
func NewDNSProviderOperator() *DNSProviderOperator { func NewDNSProviderOperator() *DNSProviderOperator {

View File

@@ -5,7 +5,9 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
) )
type BaseProvider struct{} type BaseProvider struct {
minTTL int32
}
// WrapError 封装解析相关错误 // WrapError 封装解析相关错误
func (this *BaseProvider) WrapError(err error, domain string, record *dnstypes.Record) error { 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) 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
}

View File

@@ -39,4 +39,10 @@ type ProviderInterface interface {
// DefaultRoute 默认线路 // DefaultRoute 默认线路
DefaultRoute() string DefaultRoute() string
// SetMinTTL 设置最小TTL
SetMinTTL(ttl int32)
// MinTTL 最小TTL
MinTTL() int32
} }

View File

@@ -24,7 +24,7 @@ func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.C
var tx = this.NullTx() 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 { if err != nil {
return nil, err return nil, err
} }
@@ -59,7 +59,7 @@ func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.U
return nil, err 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 { if err != nil {
return nil, err return nil, err
} }
@@ -114,6 +114,7 @@ func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req
TypeName: dnsclients.FindProviderTypeName(provider.Type), TypeName: dnsclients.FindProviderTypeName(provider.Type),
ApiParamsJSON: provider.ApiParams, ApiParamsJSON: provider.ApiParams,
DataUpdatedAt: int64(provider.DataUpdatedAt), DataUpdatedAt: int64(provider.DataUpdatedAt),
MinTTL: int32(provider.MinTTL),
}) })
} }
return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil
@@ -148,6 +149,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context,
TypeName: dnsclients.FindProviderTypeName(provider.Type), TypeName: dnsclients.FindProviderTypeName(provider.Type),
ApiParamsJSON: provider.ApiParams, ApiParamsJSON: provider.ApiParams,
DataUpdatedAt: int64(provider.DataUpdatedAt), DataUpdatedAt: int64(provider.DataUpdatedAt),
MinTTL: int32(provider.MinTTL),
}) })
} }
return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil
@@ -218,6 +220,7 @@ func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req
TypeName: dnsclients.FindProviderTypeName(provider.Type), TypeName: dnsclients.FindProviderTypeName(provider.Type),
ApiParamsJSON: provider.ApiParams, ApiParamsJSON: provider.ApiParams,
DataUpdatedAt: int64(provider.DataUpdatedAt), DataUpdatedAt: int64(provider.DataUpdatedAt),
MinTTL: int32(provider.MinTTL),
}, },
}, nil }, nil
} }
@@ -262,6 +265,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.C
Name: provider.Name, Name: provider.Name,
Type: provider.Type, Type: provider.Type,
TypeName: dnsclients.FindProviderTypeName(provider.Type), TypeName: dnsclients.FindProviderTypeName(provider.Type),
MinTTL: int32(provider.MinTTL),
}) })
} }
return &pb.FindAllEnabledDNSProvidersWithTypeResponse{DnsProviders: result}, nil return &pb.FindAllEnabledDNSProvidersWithTypeResponse{DnsProviders: result}, nil

View File

@@ -109381,7 +109381,7 @@
"name": "edgeDNSProviders", "name": "edgeDNSProviders",
"engine": "InnoDB", "engine": "InnoDB",
"charset": "utf8mb4_general_ci", "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": [ "fields": [
{ {
"name": "id", "name": "id",
@@ -109418,6 +109418,10 @@
{ {
"name": "dataUpdatedAt", "name": "dataUpdatedAt",
"definition": "bigint(11) unsigned DEFAULT '0' COMMENT '数据同步时间'" "definition": "bigint(11) unsigned DEFAULT '0' COMMENT '数据同步时间'"
},
{
"name": "minTTL",
"definition": "int(11) unsigned DEFAULT '0' COMMENT '最小TTL'"
} }
], ],
"indexes": [ "indexes": [