From 3131343056eb43b8aacf1b7be3d94bdb319dd547 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 2 Jun 2021 18:13:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9C=A8=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E4=B8=AD=E4=BD=BF=E7=94=A8EdgeDNS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/acme/dns_provider.go | 11 +- internal/const/vars.go | 7 + .../db/models/authority/authority_key_dao.go | 16 +- .../authority/authority_key_dao_test.go | 8 +- internal/db/models/dns/dns_domain_dao.go | 36 +-- .../db/models/dns/dns_domain_model_ext.go | 16 +- .../db/models/nameservers/ns_domain_dao.go | 10 + .../db/models/nameservers/ns_record_dao.go | 16 +- internal/dnsclients/{ => dnstypes}/record.go | 4 +- internal/dnsclients/{ => dnstypes}/route.go | 2 +- internal/dnsclients/provider_alidns.go | 19 +- internal/dnsclients/provider_alidns_test.go | 11 +- internal/dnsclients/provider_cloud_flare.go | 23 +- .../dnsclients/provider_cloud_flare_test.go | 23 +- internal/dnsclients/provider_custom_http.go | 15 +- .../dnsclients/provider_custom_http_test.go | 5 +- internal/dnsclients/provider_dnspod.go | 21 +- internal/dnsclients/provider_dnspod_test.go | 13 +- internal/dnsclients/provider_interface.go | 17 +- .../dnsclients/provider_local_edge_dns.go | 246 ++++++++++++++++++ .../provider_local_edge_dns_test.go | 160 ++++++++++++ internal/dnsclients/provider_user_edge_dns.go | 59 +++++ internal/dnsclients/types.go | 92 ++++--- .../services/nameservers/service_ns_record.go | 2 +- internal/rpc/services/service_dns_domain.go | 29 ++- internal/rpc/services/service_dns_provider.go | 27 +- internal/rpc/services/service_node.go | 4 +- internal/tasks/dns_task_executor.go | 13 +- 28 files changed, 731 insertions(+), 174 deletions(-) create mode 100644 internal/const/vars.go rename internal/dnsclients/{ => dnstypes}/record.go (83%) rename internal/dnsclients/{ => dnstypes}/route.go (83%) create mode 100644 internal/dnsclients/provider_local_edge_dns.go create mode 100644 internal/dnsclients/provider_local_edge_dns_test.go create mode 100644 internal/dnsclients/provider_user_edge_dns.go diff --git a/internal/acme/dns_provider.go b/internal/acme/dns_provider.go index 347c2ecb..5d10743a 100644 --- a/internal/acme/dns_provider.go +++ b/internal/acme/dns_provider.go @@ -2,6 +2,7 @@ package acme import ( "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/go-acme/lego/v4/challenge/dns01" "strings" @@ -24,15 +25,15 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error { return errors.New("invalid fqdn value") } recordName := fqdn[:index] - record, err := this.raw.QueryRecord(domain, recordName, dnsclients.RecordTypeTXT) + record, err := this.raw.QueryRecord(domain, recordName, dnstypes.RecordTypeTXT) if err != nil { return errors.New("query DNS record failed: " + err.Error()) } if record == nil { - err = this.raw.AddRecord(domain, &dnsclients.Record{ + err = this.raw.AddRecord(domain, &dnstypes.Record{ Id: "", Name: recordName, - Type: dnsclients.RecordTypeTXT, + Type: dnstypes.RecordTypeTXT, Value: value, Route: this.raw.DefaultRoute(), }) @@ -40,9 +41,9 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error { return errors.New("create DNS record failed: " + err.Error()) } } else { - err = this.raw.UpdateRecord(domain, record, &dnsclients.Record{ + err = this.raw.UpdateRecord(domain, record, &dnstypes.Record{ Name: recordName, - Type: dnsclients.RecordTypeTXT, + Type: dnstypes.RecordTypeTXT, Value: value, Route: this.raw.DefaultRoute(), }) diff --git a/internal/const/vars.go b/internal/const/vars.go new file mode 100644 index 00000000..8ba2cbbf --- /dev/null +++ b/internal/const/vars.go @@ -0,0 +1,7 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package teaconst + +var ( + IsPlus = false +) diff --git a/internal/db/models/authority/authority_key_dao.go b/internal/db/models/authority/authority_key_dao.go index c0c050be..55c10a63 100644 --- a/internal/db/models/authority/authority_key_dao.go +++ b/internal/db/models/authority/authority_key_dao.go @@ -2,6 +2,7 @@ package authority import ( "encoding/json" + teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" @@ -27,6 +28,9 @@ var SharedAuthorityKeyDAO *AuthorityKeyDAO func init() { dbs.OnReady(func() { SharedAuthorityKeyDAO = NewAuthorityKeyDAO() + + // 初始化IsPlus值 + _, _ = SharedAuthorityKeyDAO.IsPlus(nil) }) } @@ -73,7 +77,14 @@ func (this *AuthorityKeyDAO) ReadKey(tx *dbs.Tx) (key *AuthorityKey, err error) if one == nil { return nil, nil } - return one.(*AuthorityKey), nil + key = one.(*AuthorityKey) + + // 顺便更新相关变量 + if key.DayTo >= timeutil.Format("Y-m-d") { + teaconst.IsPlus = true + } + + return } // ResetKey 重置Key @@ -92,5 +103,6 @@ func (this *AuthorityKeyDAO) IsPlus(tx *dbs.Tx) (bool, error) { if key == nil { return false, nil } - return key.DayTo >= timeutil.Format("Y-m-d"), nil + teaconst.IsPlus = key.DayTo >= timeutil.Format("Y-m-d") + return teaconst.IsPlus, nil } diff --git a/internal/db/models/authority/authority_key_dao_test.go b/internal/db/models/authority/authority_key_dao_test.go index 6d6cfebf..7fdd65db 100644 --- a/internal/db/models/authority/authority_key_dao_test.go +++ b/internal/db/models/authority/authority_key_dao_test.go @@ -7,17 +7,17 @@ import ( ) func TestAuthorityKeyDAO_UpdateValue(t *testing.T) { - err := NewAuthorityKeyDAO().UpdateValue(nil, "12345678") + err := NewAuthorityKeyDAO().UpdateKey(nil, "12345678", "", "", "", []string{}, "") if err != nil { t.Fatal(err) } - t.Logf("ok") + t.Log("ok") } func TestAuthorityKeyDAO_ReadValue(t *testing.T) { - value, err := NewAuthorityKeyDAO().ReadValue(nil) + value, err := NewAuthorityKeyDAO().ReadKey(nil) if err != nil { t.Fatal(err) } - t.Logf(value) + t.Log(value) } diff --git a/internal/db/models/dns/dns_domain_dao.go b/internal/db/models/dns/dns_domain_dao.go index 7e165fe5..69f2d33a 100644 --- a/internal/db/models/dns/dns_domain_dao.go +++ b/internal/db/models/dns/dns_domain_dao.go @@ -2,7 +2,7 @@ package dns import ( "encoding/json" - "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" @@ -39,7 +39,7 @@ func init() { }) } -// 启用条目 +// EnableDNSDomain 启用条目 func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error { _, err := this.Query(tx). Pk(id). @@ -48,7 +48,7 @@ func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error { return err } -// 禁用条目 +// DisableDNSDomain 禁用条目 func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error { _, err := this.Query(tx). Pk(id). @@ -57,7 +57,7 @@ func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error { return err } -// 查找启用中的条目 +// FindEnabledDNSDomain 查找启用中的条目 func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain, error) { result, err := this.Query(tx). Pk(id). @@ -69,7 +69,7 @@ func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain return result.(*DNSDomain), err } -// 根据主键查找名称 +// FindDNSDomainName 根据主键查找名称 func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error) { return this.Query(tx). Pk(id). @@ -77,7 +77,7 @@ func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error FindStringCol("") } -// 创建域名 +// CreateDomain 创建域名 func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64, providerId int64, name string) (int64, error) { op := NewDNSDomainOperator() op.ProviderId = providerId @@ -93,7 +93,7 @@ func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64, return types.Int64(op.Id), nil } -// 修改域名 +// UpdateDomain 修改域名 func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string, isOn bool) error { if domainId <= 0 { return errors.New("invalid domainId") @@ -109,7 +109,7 @@ func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string, return nil } -// 查询一个服务商下面的所有域名 +// FindAllEnabledDomainsWithProviderId 查询一个服务商下面的所有域名 func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (result []*DNSDomain, err error) { _, err = this.Query(tx). State(DNSDomainStateEnabled). @@ -120,7 +120,7 @@ func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, provid return } -// 计算某个服务商下的域名数量 +// CountAllEnabledDomainsWithProviderId 计算某个服务商下的域名数量 func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (int64, error) { return this.Query(tx). State(DNSDomainStateEnabled). @@ -128,7 +128,7 @@ func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, provi Count() } -// 更新域名数据 +// UpdateDomainData 更新域名数据 func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data string) error { if domainId <= 0 { return errors.New("invalid domainId") @@ -140,7 +140,7 @@ func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data stri return err } -// 更新域名解析记录 +// UpdateDomainRecords 更新域名解析记录 func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, recordsJSON []byte) error { if domainId <= 0 { return errors.New("invalid domainId") @@ -153,7 +153,7 @@ func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, record return err } -// 更新线路 +// UpdateDomainRoutes 更新线路 func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJSON []byte) error { if domainId <= 0 { return errors.New("invalid domainId") @@ -166,8 +166,8 @@ func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJ return err } -// 查找域名线路 -func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnsclients.Route, error) { +// FindDomainRoutes 查找域名线路 +func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnstypes.Route, error) { routes, err := this.Query(tx). Pk(domainId). Result("routes"). @@ -178,7 +178,7 @@ func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnscl if len(routes) == 0 || routes == "null" { return nil, nil } - result := []*dnsclients.Route{} + result := []*dnstypes.Route{} err = json.Unmarshal([]byte(routes), &result) if err != nil { return nil, err @@ -186,7 +186,7 @@ func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnscl return result, nil } -// 查找线路名称 +// FindDomainRouteName 查找线路名称 func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeCode string) (string, error) { routes, err := this.FindDomainRoutes(tx, domainId) if err != nil { @@ -200,7 +200,7 @@ func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeC return "", nil } -// 判断是否有域名可选 +// ExistAvailableDomains 判断是否有域名可选 func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) { subQuery, err := SharedDNSProviderDAO.Query(tx). Where("state=1"). // 这里要使用非变量 @@ -216,7 +216,7 @@ func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) { Exist() } -// 检查域名解析记录是否存在 +// ExistDomainRecord 检查域名解析记录是否存在 func (this *DNSDomainDAO) ExistDomainRecord(tx *dbs.Tx, domainId int64, recordName string, recordType string, recordRoute string, recordValue string) (bool, error) { query := maps.Map{ "name": recordName, diff --git a/internal/db/models/dns/dns_domain_model_ext.go b/internal/db/models/dns/dns_domain_model_ext.go index 20ae864b..7f0b7ef2 100644 --- a/internal/db/models/dns/dns_domain_model_ext.go +++ b/internal/db/models/dns/dns_domain_model_ext.go @@ -2,15 +2,15 @@ package dns import ( "encoding/json" - "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" ) -// 获取所有的线路 -func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) { +// DecodeRoutes 获取所有的线路 +func (this *DNSDomain) DecodeRoutes() ([]*dnstypes.Route, error) { if len(this.Routes) == 0 || this.Routes == "null" { return nil, nil } - result := []*dnsclients.Route{} + result := []*dnstypes.Route{} err := json.Unmarshal([]byte(this.Routes), &result) if err != nil { return nil, err @@ -18,7 +18,7 @@ func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) { return result, nil } -// 检查是否包含某个线路 +// ContainsRouteCode 检查是否包含某个线路 func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) { routes, err := this.DecodeRoutes() if err != nil { @@ -32,13 +32,13 @@ func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) { return false, nil } -// 获取所有的记录 -func (this *DNSDomain) DecodeRecords() ([]*dnsclients.Record, error) { +// DecodeRecords 获取所有的记录 +func (this *DNSDomain) DecodeRecords() ([]*dnstypes.Record, error) { records := this.Records if len(records) == 0 || records == "null" { return nil, nil } - result := []*dnsclients.Record{} + result := []*dnstypes.Record{} err := json.Unmarshal([]byte(records), &result) if err != nil { return nil, err diff --git a/internal/db/models/nameservers/ns_domain_dao.go b/internal/db/models/nameservers/ns_domain_dao.go index d4a98093..c50cbc57 100644 --- a/internal/db/models/nameservers/ns_domain_dao.go +++ b/internal/db/models/nameservers/ns_domain_dao.go @@ -184,3 +184,13 @@ func (this *NSDomainDAO) ListDomainsAfterVersion(tx *dbs.Tx, version int64, size FindAll() return } + +// FindDomainIdWithName 根据名称查找域名 +func (this *NSDomainDAO) FindDomainIdWithName(tx *dbs.Tx, clusterId int64, name string) (int64, error) { + return this.Query(tx). + Attr("clusterId", clusterId). + Attr("name", name). + State(NSDomainStateEnabled). + ResultPk(). + FindInt64Col(0) +} diff --git a/internal/db/models/nameservers/ns_record_dao.go b/internal/db/models/nameservers/ns_record_dao.go index a091be4b..4b9198ad 100644 --- a/internal/db/models/nameservers/ns_record_dao.go +++ b/internal/db/models/nameservers/ns_record_dao.go @@ -162,7 +162,7 @@ func (this *NSRecordDAO) CountAllEnabledRecords(tx *dbs.Tx, domainId int64, dnsT return query.Count() } -func (this *NSRecordDAO) ListAllEnabledRecords(tx *dbs.Tx, domainId int64, dnsType dnsconfigs.RecordType, keyword string, routeId int64, offset int64, size int64) (result []*NSRecord, err error) { +func (this *NSRecordDAO) ListEnabledRecords(tx *dbs.Tx, domainId int64, dnsType dnsconfigs.RecordType, keyword string, routeId int64, offset int64, size int64) (result []*NSRecord, err error) { query := this.Query(tx). Attr("domainId", domainId). State(NSRecordStateEnabled) @@ -204,3 +204,17 @@ func (this *NSRecordDAO) ListRecordsAfterVersion(tx *dbs.Tx, version int64, size FindAll() return } + +// FindEnabledRecordWithName 查询单条记录 +func (this *NSRecordDAO) FindEnabledRecordWithName(tx *dbs.Tx, domainId int64, recordName string, recordType dnsconfigs.RecordType) (*NSRecord, error) { + record, err := this.Query(tx). + State(NSRecordStateEnabled). + Attr("domainId", domainId). + Attr("name", recordName). + Attr("type", recordType). + Find() + if record == nil { + return nil, err + } + return record.(*NSRecord), nil +} diff --git a/internal/dnsclients/record.go b/internal/dnsclients/dnstypes/record.go similarity index 83% rename from internal/dnsclients/record.go rename to internal/dnsclients/dnstypes/record.go index 2cc36825..b9a517a4 100644 --- a/internal/dnsclients/record.go +++ b/internal/dnsclients/dnstypes/record.go @@ -1,10 +1,10 @@ -package dnsclients +package dnstypes type RecordType = string const ( RecordTypeA RecordType = "A" - RecordTypeCName RecordType = "CNAME" + RecordTypeCNAME RecordType = "CNAME" RecordTypeTXT RecordType = "TXT" ) diff --git a/internal/dnsclients/route.go b/internal/dnsclients/dnstypes/route.go similarity index 83% rename from internal/dnsclients/route.go rename to internal/dnsclients/dnstypes/route.go index d494ef6a..5a386dbb 100644 --- a/internal/dnsclients/route.go +++ b/internal/dnsclients/dnstypes/route.go @@ -1,4 +1,4 @@ -package dnsclients +package dnstypes // Route 线路描述 type Route struct { diff --git a/internal/dnsclients/provider_alidns.go b/internal/dnsclients/provider_alidns.go index 5b8a5c12..77e67c80 100644 --- a/internal/dnsclients/provider_alidns.go +++ b/internal/dnsclients/provider_alidns.go @@ -2,6 +2,7 @@ package dnsclients import ( "errors" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" "github.com/aliyun/alibaba-cloud-sdk-go/services/alidns" @@ -31,7 +32,7 @@ func (this *AliDNSProvider) Auth(params maps.Map) error { } // GetRecords 获取域名列表 -func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err error) { +func (this *AliDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { pageNumber := 1 size := 100 @@ -48,11 +49,11 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er } for _, record := range resp.DomainRecords.Record { // 修正Record - if record.Type == RecordTypeCName && !strings.HasSuffix(record.Value, ".") { + if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Value, ".") { record.Value += "." } - records = append(records, &Record{ + records = append(records, &dnstypes.Record{ Id: record.RecordId, Name: record.RR, Type: record.Type, @@ -71,7 +72,7 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er } // GetRoutes 读取域名支持的线路数据 -func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error) { +func (this *AliDNSProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { req := alidns.CreateDescribeSupportLinesRequest() req.DomainName = domain @@ -81,7 +82,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error return nil, err } for _, line := range resp.RecordLines.RecordLine { - routes = append(routes, &Route{ + routes = append(routes, &dnstypes.Route{ Name: line.LineName, Code: line.LineCode, }) @@ -90,7 +91,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error } // QueryRecord 查询单个记录 -func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) { +func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { records, err := this.GetRecords(domain) if err != nil { return nil, err @@ -104,7 +105,7 @@ func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType R } // AddRecord 设置记录 -func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error { +func (this *AliDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { req := alidns.CreateAddDomainRecordRequest() req.RR = newRecord.Name req.Type = newRecord.Type @@ -125,7 +126,7 @@ func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error { } // UpdateRecord 修改记录 -func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error { +func (this *AliDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { req := alidns.CreateUpdateDomainRecordRequest() req.RecordId = record.Id req.RR = newRecord.Name @@ -139,7 +140,7 @@ func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecor } // DeleteRecord 删除记录 -func (this *AliDNSProvider) DeleteRecord(domain string, record *Record) error { +func (this *AliDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error { req := alidns.CreateDeleteDomainRecordRequest() req.RecordId = record.Id diff --git a/internal/dnsclients/provider_alidns_test.go b/internal/dnsclients/provider_alidns_test.go index c4cd453f..cd6bd8ba 100644 --- a/internal/dnsclients/provider_alidns_test.go +++ b/internal/dnsclients/provider_alidns_test.go @@ -2,6 +2,7 @@ package dnsclients import ( "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" _ "github.com/go-sql-driver/mysql" _ "github.com/iwind/TeaGo/bootstrap" "github.com/iwind/TeaGo/dbs" @@ -29,7 +30,7 @@ func TestAliDNSProvider_DeleteRecord(t *testing.T) { t.Fatal(err) } - err = provider.DeleteRecord("meloy.cn", &Record{ + err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{ Id: "20746603318032384", }) if err != nil { @@ -57,10 +58,10 @@ func TestAliDNSProvider_AddRecord(t *testing.T) { t.Fatal(err) } - err = provider.AddRecord("meloy.cn", &Record{ + err = provider.AddRecord("meloy.cn", &dnstypes.Record{ Id: "", Name: "test", - Type: RecordTypeA, + Type: dnstypes.RecordTypeA, Value: "192.168.1.100", Route: "unicom", }) @@ -76,10 +77,10 @@ func TestAliDNSProvider_UpdateRecord(t *testing.T) { t.Fatal(err) } - err = provider.UpdateRecord("meloy.cn", &Record{Id: "20746664455255040"}, &Record{ + err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "20746664455255040"}, &dnstypes.Record{ Id: "", Name: "test", - Type: RecordTypeA, + Type: dnstypes.RecordTypeA, Value: "192.168.1.101", Route: "unicom", }) diff --git a/internal/dnsclients/provider_cloud_flare.go b/internal/dnsclients/provider_cloud_flare.go index 06e65584..f10c4dbe 100644 --- a/internal/dnsclients/provider_cloud_flare.go +++ b/internal/dnsclients/provider_cloud_flare.go @@ -7,6 +7,7 @@ import ( "crypto/tls" "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/cloudflare" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/iwind/TeaGo/maps" "io" @@ -59,7 +60,7 @@ func (this *CloudFlareProvider) Auth(params maps.Map) error { } // GetRecords 获取域名解析记录列表 -func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, err error) { +func (this *CloudFlareProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { return nil, err @@ -81,13 +82,13 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er for _, record := range resp.Result { // 修正Record - if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") { + if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") { record.Content += "." } record.Name = strings.TrimSuffix(record.Name, "."+domain) - records = append(records, &Record{ + records = append(records, &dnstypes.Record{ Id: record.Id, Name: record.Name, Type: record.Type, @@ -101,15 +102,15 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er } // GetRoutes 读取域名支持的线路数据 -func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*Route, err error) { - routes = []*Route{ +func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { + routes = []*dnstypes.Route{ {Name: "默认", Code: CloudFlareDefaultRoute}, } return } // QueryRecord 查询单个记录 -func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) { +func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { return nil, err @@ -131,13 +132,13 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy record := resp.Result[0] // 修正Record - if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") { + if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") { record.Content += "." } record.Name = strings.TrimSuffix(record.Name, "."+domain) - return &Record{ + return &dnstypes.Record{ Id: record.Id, Name: record.Name, Type: record.Type, @@ -147,7 +148,7 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy } // AddRecord 设置记录 -func (this *CloudFlareProvider) AddRecord(domain string, newRecord *Record) error { +func (this *CloudFlareProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { return err @@ -167,7 +168,7 @@ func (this *CloudFlareProvider) AddRecord(domain string, newRecord *Record) erro } // UpdateRecord 修改记录 -func (this *CloudFlareProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error { +func (this *CloudFlareProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { return err @@ -183,7 +184,7 @@ func (this *CloudFlareProvider) UpdateRecord(domain string, record *Record, newR } // DeleteRecord 删除记录 -func (this *CloudFlareProvider) DeleteRecord(domain string, record *Record) error { +func (this *CloudFlareProvider) DeleteRecord(domain string, record *dnstypes.Record) error { zoneId, err := this.findZoneIdWithDomain(domain) if err != nil { return err diff --git a/internal/dnsclients/provider_cloud_flare_test.go b/internal/dnsclients/provider_cloud_flare_test.go index 2669f297..1e1f11e7 100644 --- a/internal/dnsclients/provider_cloud_flare_test.go +++ b/internal/dnsclients/provider_cloud_flare_test.go @@ -4,6 +4,7 @@ package dnsclients import ( "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/logs" @@ -45,7 +46,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) { } { t.Log("== www.meloy.cn/A ==") - record, err := provider.QueryRecord("meloy.cn", "www", RecordTypeA) + record, err := provider.QueryRecord("meloy.cn", "www", dnstypes.RecordTypeA) if err != nil { t.Fatal(err) } @@ -53,7 +54,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) { } { t.Log("== www.meloy.cn/CNAME ==") - record, err := provider.QueryRecord("meloy.cn", "www", RecordTypeCName) + record, err := provider.QueryRecord("meloy.cn", "www", dnstypes.RecordTypeCNAME) if err != nil { t.Fatal(err) } @@ -61,7 +62,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) { } { t.Log("== hello.meloy.cn ==") - record, err := provider.QueryRecord("meloy.cn", "hello", RecordTypeA) + record, err := provider.QueryRecord("meloy.cn", "hello", dnstypes.RecordTypeA) if err != nil { t.Fatal(err) } @@ -69,7 +70,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) { } { t.Log("== test.meloy.cn ==") - record, err := provider.QueryRecord("meloy.cn", "test", RecordTypeCName) + record, err := provider.QueryRecord("meloy.cn", "test", dnstypes.RecordTypeCNAME) if err != nil { t.Fatal(err) } @@ -83,10 +84,10 @@ func TestCloudFlareProvider_AddRecord(t *testing.T) { t.Fatal(err) } { - err = provider.AddRecord("meloy.cn", &Record{ + err = provider.AddRecord("meloy.cn", &dnstypes.Record{ Id: "", Name: "test", - Type: RecordTypeA, + Type: dnstypes.RecordTypeA, Value: "182.92.212.46", Route: "", }) @@ -95,10 +96,10 @@ func TestCloudFlareProvider_AddRecord(t *testing.T) { } } { - err = provider.AddRecord("meloy.cn", &Record{ + err = provider.AddRecord("meloy.cn", &dnstypes.Record{ Id: "", Name: "test1", - Type: RecordTypeCName, + Type: dnstypes.RecordTypeCNAME, Value: "cdn.meloy.cn.", Route: "", }) @@ -114,10 +115,10 @@ func TestCloudFlareProvider_UpdateRecord(t *testing.T) { if err != nil { t.Fatal(err) } - err = provider.UpdateRecord("meloy.cn", &Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &Record{ + err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &dnstypes.Record{ Id: "", Name: "test1", - Type: RecordTypeCName, + Type: dnstypes.RecordTypeCNAME, Value: "cdn123.meloy.cn.", Route: "", }) @@ -132,7 +133,7 @@ func TestCloudFlareProvider_DeleteRecord(t *testing.T) { if err != nil { t.Fatal(err) } - err = provider.DeleteRecord("meloy.cn", &Record{ + err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{ Id: "86282d89bbd1f66a69ca409da84f34b1", }) if err != nil { diff --git a/internal/dnsclients/provider_custom_http.go b/internal/dnsclients/provider_custom_http.go index 2731f30e..9821cc42 100644 --- a/internal/dnsclients/provider_custom_http.go +++ b/internal/dnsclients/provider_custom_http.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/iwind/TeaGo/maps" "io/ioutil" @@ -49,7 +50,7 @@ func (this *CustomHTTPProvider) Auth(params maps.Map) error { } // GetRecords 获取域名解析记录列表 -func (this *CustomHTTPProvider) GetRecords(domain string) (records []*Record, err error) { +func (this *CustomHTTPProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { resp, err := this.post(maps.Map{ "action": "GetRecords", "domain": domain, @@ -62,7 +63,7 @@ func (this *CustomHTTPProvider) GetRecords(domain string) (records []*Record, er } // GetRoutes 读取域名支持的线路数据 -func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*Route, err error) { +func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { resp, err := this.post(maps.Map{ "action": "GetRoutes", "domain": domain, @@ -75,7 +76,7 @@ func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*Route, err e } // QueryRecord 查询单个记录 -func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) { +func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { resp, err := this.post(maps.Map{ "action": "QueryRecord", "domain": domain, @@ -88,7 +89,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy if len(resp) == 0 { return nil, nil } - record := &Record{} + record := &dnstypes.Record{} err = json.Unmarshal(resp, record) if err != nil { return nil, err @@ -100,7 +101,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy } // AddRecord 设置记录 -func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *Record) error { +func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { _, err := this.post(maps.Map{ "action": "AddRecord", "domain": domain, @@ -110,7 +111,7 @@ func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *Record) erro } // UpdateRecord 修改记录 -func (this *CustomHTTPProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error { +func (this *CustomHTTPProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { _, err := this.post(maps.Map{ "action": "UpdateRecord", "domain": domain, @@ -121,7 +122,7 @@ func (this *CustomHTTPProvider) UpdateRecord(domain string, record *Record, newR } // DeleteRecord 删除记录 -func (this *CustomHTTPProvider) DeleteRecord(domain string, record *Record) error { +func (this *CustomHTTPProvider) DeleteRecord(domain string, record *dnstypes.Record) error { _, err := this.post(maps.Map{ "action": "DeleteRecord", "domain": domain, diff --git a/internal/dnsclients/provider_custom_http_test.go b/internal/dnsclients/provider_custom_http_test.go index 7d02bb17..7a7e62af 100644 --- a/internal/dnsclients/provider_custom_http_test.go +++ b/internal/dnsclients/provider_custom_http_test.go @@ -1,6 +1,7 @@ package dnsclients import ( + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/maps" "testing" @@ -15,10 +16,10 @@ func TestCustomHTTPProvider_AddRecord(t *testing.T) { if err != nil { t.Fatal(err) } - err = provider.AddRecord("hello.com", &Record{ + err = provider.AddRecord("hello.com", &dnstypes.Record{ Id: "", Name: "world", - Type: RecordTypeA, + Type: dnstypes.RecordTypeA, Value: "127.0.0.1", Route: "default", }) diff --git a/internal/dnsclients/provider_dnspod.go b/internal/dnsclients/provider_dnspod.go index 32a32c65..abe231f9 100644 --- a/internal/dnsclients/provider_dnspod.go +++ b/internal/dnsclients/provider_dnspod.go @@ -3,6 +3,7 @@ package dnsclients import ( "encoding/json" "errors" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils" "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/types" @@ -35,7 +36,7 @@ func (this *DNSPodProvider) Auth(params maps.Map) error { } // GetRecords 获取域名列表 -func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err error) { +func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { offset := 0 size := 100 for { @@ -53,7 +54,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er recordSlice := recordsResp.GetSlice("records") for _, record := range recordSlice { recordMap := maps.NewMap(record) - records = append(records, &Record{ + records = append(records, &dnstypes.Record{ Id: recordMap.GetString("id"), Name: recordMap.GetString("name"), Type: recordMap.GetString("type"), @@ -73,7 +74,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er } // GetRoutes 读取线路数据 -func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error) { +func (this *DNSPodProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { infoResp, err := this.post("/Domain.info", map[string]string{ "domain": domain, }) @@ -97,7 +98,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error } for _, line := range lines { lineString := types.String(line) - routes = append(routes, &Route{ + routes = append(routes, &dnstypes.Route{ Name: lineString, Code: lineString, }) @@ -107,7 +108,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error } // QueryRecord 查询单个记录 -func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) { +func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { records, err := this.GetRecords(domain) if err != nil { return nil, err @@ -121,13 +122,13 @@ func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType R } // AddRecord 设置记录 -func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error { +func (this *DNSPodProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { if newRecord == nil { return errors.New("invalid new record") } // 在CHANGE记录后面加入点 - if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") { + if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") { newRecord.Value += "." } _, err := this.post("/Record.Create", map[string]string{ @@ -141,7 +142,7 @@ func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error { } // UpdateRecord 修改记录 -func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error { +func (this *DNSPodProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { if record == nil { return errors.New("invalid record") } @@ -150,7 +151,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor } // 在CHANGE记录后面加入点 - if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") { + if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") { newRecord.Value += "." } _, err := this.post("/Record.Modify", map[string]string{ @@ -165,7 +166,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor } // DeleteRecord 删除记录 -func (this *DNSPodProvider) DeleteRecord(domain string, record *Record) error { +func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record) error { if record == nil { return errors.New("invalid record to delete") } diff --git a/internal/dnsclients/provider_dnspod_test.go b/internal/dnsclients/provider_dnspod_test.go index be864f0c..33f5a246 100644 --- a/internal/dnsclients/provider_dnspod_test.go +++ b/internal/dnsclients/provider_dnspod_test.go @@ -2,6 +2,7 @@ package dnsclients import ( "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/maps" @@ -40,8 +41,8 @@ func TestDNSPodProvider_AddRecord(t *testing.T) { t.Fatal(err) } - err = provider.AddRecord("yun4s.cn", &Record{ - Type: RecordTypeCName, + err = provider.AddRecord("yun4s.cn", &dnstypes.Record{ + Type: dnstypes.RecordTypeCNAME, Name: "hello-forward", Value: "hello.yun4s.cn", Route: "联通", @@ -58,10 +59,10 @@ func TestDNSPodProvider_UpdateRecord(t *testing.T) { t.Fatal(err) } - err = provider.UpdateRecord("yun4s.cn", &Record{ + err = provider.UpdateRecord("yun4s.cn", &dnstypes.Record{ Id: "697036856", - }, &Record{ - Type: RecordTypeA, + }, &dnstypes.Record{ + Type: dnstypes.RecordTypeA, Name: "hello", Value: "192.168.1.102", Route: "联通", @@ -78,7 +79,7 @@ func TestDNSPodProvider_DeleteRecord(t *testing.T) { t.Fatal(err) } - err = provider.DeleteRecord("yun4s.cn", &Record{ + err = provider.DeleteRecord("yun4s.cn", &dnstypes.Record{ Id: "697040986", }) if err != nil { diff --git a/internal/dnsclients/provider_interface.go b/internal/dnsclients/provider_interface.go index b96ec673..8700660c 100644 --- a/internal/dnsclients/provider_interface.go +++ b/internal/dnsclients/provider_interface.go @@ -1,6 +1,9 @@ package dnsclients -import "github.com/iwind/TeaGo/maps" +import ( + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/iwind/TeaGo/maps" +) // ProviderInterface DNS操作接口 type ProviderInterface interface { @@ -8,22 +11,22 @@ type ProviderInterface interface { Auth(params maps.Map) error // GetRecords 获取域名解析记录列表 - GetRecords(domain string) (records []*Record, err error) + GetRecords(domain string) (records []*dnstypes.Record, err error) // GetRoutes 读取域名支持的线路数据 - GetRoutes(domain string) (routes []*Route, err error) + GetRoutes(domain string) (routes []*dnstypes.Route, err error) // QueryRecord 查询单个记录 - QueryRecord(domain string, name string, recordType RecordType) (*Record, error) + QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) // AddRecord 设置记录 - AddRecord(domain string, newRecord *Record) error + AddRecord(domain string, newRecord *dnstypes.Record) error // UpdateRecord 修改记录 - UpdateRecord(domain string, record *Record, newRecord *Record) error + UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error // DeleteRecord 删除记录 - DeleteRecord(domain string, record *Record) error + DeleteRecord(domain string, record *dnstypes.Record) error // DefaultRoute 默认线路 DefaultRoute() string diff --git a/internal/dnsclients/provider_local_edge_dns.go b/internal/dnsclients/provider_local_edge_dns.go new file mode 100644 index 00000000..87112315 --- /dev/null +++ b/internal/dnsclients/provider_local_edge_dns.go @@ -0,0 +1,246 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dnsclients + +import ( + "fmt" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/TeaOSLab/EdgeAPI/internal/errors" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" + "regexp" + "strings" +) + +type LocalEdgeDNSProvider struct { + clusterId int64 // 集群ID + ttl int32 // TTL +} + +// Auth 认证 +func (this *LocalEdgeDNSProvider) Auth(params maps.Map) error { + this.clusterId = params.GetInt64("clusterId") + if this.clusterId <= 0 { + return errors.New("'clusterId' should be greater than 0") + } + + this.ttl = params.GetInt32("ttl") + if this.ttl <= 0 { + this.ttl = 3600 + } + + return nil +} + +// GetRecords 获取域名解析记录列表 +func (this *LocalEdgeDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return nil, err + } + if domainId == 0 { + return nil, errors.New("can not find domain '" + domain + "'") + } + + offset := int64(0) + size := int64(1000) + for { + result, err := nameservers.SharedNSRecordDAO.ListEnabledRecords(tx, domainId, "", "", 0, offset, size) + if err != nil { + return nil, err + } + if len(result) == 0 { + break + } + for _, record := range result { + if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Value, ".") { + record.Value += "." + } + + routeIds := record.DecodeRouteIds() + var routeIdString = "" + if len(routeIds) > 0 { + routeIdString = fmt.Sprintf("%d", routeIds[0]) + } + + records = append(records, &dnstypes.Record{ + Id: fmt.Sprintf("%d", record.Id), + Name: record.Name, + Type: record.Type, + Value: record.Value, + Route: routeIdString, + }) + } + + offset += size + } + + return +} + +// GetRoutes 读取域名支持的线路数据 +func (this *LocalEdgeDNSProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return nil, err + } + if domainId == 0 { + return nil, errors.New("can not find domain '" + domain + "'") + } + + // TODO 将来支持集群、域名、用户自定义线路 + result, err := nameservers.SharedNSRouteDAO.FindAllEnabledRoutes(tx, 0, 0, 0) + if err != nil { + return nil, err + } + for _, route := range result { + routes = append(routes, &dnstypes.Route{ + Name: route.Name, + Code: fmt.Sprintf("%d", route.Id), + }) + } + + return +} + +// QueryRecord 查询单个记录 +func (this *LocalEdgeDNSProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return nil, err + } + if domainId == 0 { + return nil, nil + } + + record, err := nameservers.SharedNSRecordDAO.FindEnabledRecordWithName(tx, domainId, name, recordType) + if err != nil { + return nil, err + } + if record == nil { + return nil, nil + } + + routeIds := record.DecodeRouteIds() + var routeIdString = "" + if len(routeIds) > 0 { + routeIdString = fmt.Sprintf("%d", routeIds[0]) + } + + return &dnstypes.Record{ + Id: fmt.Sprintf("%d", record.Id), + Name: record.Name, + Type: record.Type, + Value: record.Value, + Route: routeIdString, + }, nil +} + +// AddRecord 设置记录 +func (this *LocalEdgeDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return err + } + if domainId == 0 { + return errors.New("can not find domain '" + domain + "'") + } + + var routeIds []int64 + if len(newRecord.Route) > 0 && regexp.MustCompile(`^\d+$`).MatchString(newRecord.Route) { + routeId := types.Int64(newRecord.Route) + if routeId > 0 { + routeIds = append(routeIds, routeId) + } + } + + _, err = nameservers.SharedNSRecordDAO.CreateRecord(tx, domainId, "", newRecord.Name, newRecord.Type, newRecord.Value, this.ttl, routeIds) + if err != nil { + return err + } + + return nil +} + +// UpdateRecord 修改记录 +func (this *LocalEdgeDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return err + } + if domainId == 0 { + return errors.New("can not find domain '" + domain + "'") + } + + var routeIds []int64 + if len(newRecord.Route) > 0 && regexp.MustCompile(`^\d+$`).MatchString(newRecord.Route) { + routeId := types.Int64(newRecord.Route) + if routeId > 0 { + routeIds = append(routeIds, routeId) + } + } + + if len(record.Id) > 0 { + err = nameservers.SharedNSRecordDAO.UpdateRecord(tx, types.Int64(record.Id), "", newRecord.Name, newRecord.Type, newRecord.Value, this.ttl, routeIds) + if err != nil { + return err + } + } else { + realRecord, err := nameservers.SharedNSRecordDAO.FindEnabledRecordWithName(tx, domainId, record.Name, record.Type) + if err != nil { + return err + } + if realRecord != nil { + err = nameservers.SharedNSRecordDAO.UpdateRecord(tx, types.Int64(realRecord.Id), "", newRecord.Name, newRecord.Type, newRecord.Value, this.ttl, routeIds) + if err != nil { + return err + } + } + } + + return nil +} + +// DeleteRecord 删除记录 +func (this *LocalEdgeDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error { + var tx *dbs.Tx + domainId, err := nameservers.SharedNSDomainDAO.FindDomainIdWithName(tx, this.clusterId, domain) + if err != nil { + return err + } + if domainId == 0 { + return errors.New("can not find domain '" + domain + "'") + } + + if len(record.Id) > 0 { + err = nameservers.SharedNSRecordDAO.DisableNSRecord(tx, types.Int64(record.Id)) + if err != nil { + return err + } + } else { + realRecord, err := nameservers.SharedNSRecordDAO.FindEnabledRecordWithName(tx, domainId, record.Name, record.Type) + if err != nil { + return err + } + if realRecord != nil { + err = nameservers.SharedNSRecordDAO.DisableNSRecord(tx, types.Int64(realRecord.Id)) + if err != nil { + return err + } + } + } + + return nil +} + +// DefaultRoute 默认线路 +func (this *LocalEdgeDNSProvider) DefaultRoute() string { + return "" +} diff --git a/internal/dnsclients/provider_local_edge_dns_test.go b/internal/dnsclients/provider_local_edge_dns_test.go new file mode 100644 index 00000000..ea5bda0c --- /dev/null +++ b/internal/dnsclients/provider_local_edge_dns_test.go @@ -0,0 +1,160 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dnsclients + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/logs" + "github.com/iwind/TeaGo/maps" + "testing" +) + +func TestLocalEdgeDNSProvider_GetRecords(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + records, err := provider.GetRecords("teaos.cn") + if err != nil { + t.Fatal(err) + } + logs.PrintAsJSON(records, t) +} + +func TestLocalEdgeDNSProvider_GetRoutes(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + routes, err := provider.GetRoutes("teaos.cn") + if err != nil { + t.Fatal(err) + } + logs.PrintAsJSON(routes, t) +} + +func TestLocalEdgeDNSProvider_QueryRecord(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + record, err := provider.QueryRecord("teaos.cn", "cdn", dnstypes.RecordTypeA) + if err != nil { + t.Fatal(err) + } + logs.PrintAsJSON(record) +} + +func TestLocalEdgeDNSProvider_AddRecord(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + err = provider.AddRecord("teaos.cn", &dnstypes.Record{ + Id: "", + Name: "example", + Type: dnstypes.RecordTypeA, + Value: "10.0.0.1", + Route: "7", + }) + if err != nil { + t.Fatal(err) + } + t.Log("ok") +} + +func TestLocalEdgeDNSProvider_UpdateRecord(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + record, err := provider.QueryRecord("teaos.cn", "cdn", dnstypes.RecordTypeA) + if err != nil { + t.Fatal(err) + } + if record == nil { + t.Log("not found record") + return + } + + //record.Id = "" + err = provider.UpdateRecord("teaos.cn", record, &dnstypes.Record{ + Id: "", + Name: record.Name, + Type: record.Type, + Value: "127.0.0.3", + Route: record.Route, + }) + if err != nil { + t.Fatal(err) + } + t.Log("ok") +} + +func TestLocalEdgeDNSProvider_DeleteRecord(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + err = provider.DeleteRecord("teaos.cn", &dnstypes.Record{ + Id: "", + Name: "example", + Type: "A", + Value: "", + Route: "", + }) + if err != nil { + t.Fatal(err) + } + t.Log("ok") +} + +func TestLocalEdgeDNSProvider_DefaultRoute(t *testing.T) { + dbs.NotifyReady() + + provider := &LocalEdgeDNSProvider{} + err := provider.Auth(maps.Map{ + "clusterId": 1, + }) + if err != nil { + t.Fatal(err) + } + + t.Log(provider.DefaultRoute()) +} diff --git a/internal/dnsclients/provider_user_edge_dns.go b/internal/dnsclients/provider_user_edge_dns.go new file mode 100644 index 00000000..364e477f --- /dev/null +++ b/internal/dnsclients/provider_user_edge_dns.go @@ -0,0 +1,59 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dnsclients + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" + "github.com/iwind/TeaGo/maps" +) + +type UserEdgeDNSProvider struct { +} + +// Auth 认证 +func (this *UserEdgeDNSProvider) Auth(params maps.Map) error { + // TODO + return nil +} + +// GetRecords 获取域名解析记录列表 +func (this *UserEdgeDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) { + // TODO + return +} + +// GetRoutes 读取域名支持的线路数据 +func (this *UserEdgeDNSProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { + // TODO + return +} + +// QueryRecord 查询单个记录 +func (this *UserEdgeDNSProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) { + // TODO + return nil, nil +} + +// AddRecord 设置记录 +func (this *UserEdgeDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error { + // TODO + return nil +} + +// UpdateRecord 修改记录 +func (this *UserEdgeDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error { + // TODO + return nil +} + +// DeleteRecord 删除记录 +func (this *UserEdgeDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error { + // TODO + return nil +} + +// DefaultRoute 默认线路 +func (this *UserEdgeDNSProvider) DefaultRoute() string { + // TODO + return "" +} diff --git a/internal/dnsclients/types.go b/internal/dnsclients/types.go index 970d6535..3a11fe9f 100644 --- a/internal/dnsclients/types.go +++ b/internal/dnsclients/types.go @@ -1,40 +1,70 @@ package dnsclients -import "github.com/iwind/TeaGo/maps" +import ( + teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" + "github.com/iwind/TeaGo/maps" +) type ProviderType = string // 服务商代号 const ( - ProviderTypeDNSPod ProviderType = "dnspod" - ProviderTypeAliDNS ProviderType = "alidns" - ProviderTypeDNSCom ProviderType = "dnscom" - ProviderTypeCloudFlare ProviderType = "cloudFlare" - ProviderTypeCustomHTTP ProviderType = "customHTTP" + ProviderTypeDNSPod ProviderType = "dnspod" // DNSPod + ProviderTypeAliDNS ProviderType = "alidns" // 阿里云DNS + ProviderTypeDNSCom ProviderType = "dnscom" // dns.com + ProviderTypeCloudFlare ProviderType = "cloudFlare" // CloudFlare DNS + ProviderTypeLocalEdgeDNS ProviderType = "localEdgeDNS" // 和当前系统集成的EdgeDNS + ProviderTypeUserEdgeDNS ProviderType = "userEdgeDNS" // 通过API连接的EdgeDNS + ProviderTypeCustomHTTP ProviderType = "customHTTP" // 自定义HTTP接口 ) -// AllProviderTypes 所有的服务商类型 -var AllProviderTypes = []maps.Map{ - { - "name": "阿里云DNS", - "code": ProviderTypeAliDNS, - }, - { - "name": "DNSPod", - "code": ProviderTypeDNSPod, - }, - /**{ - "name": "帝恩思DNS.COM", - "code": ProviderTypeDNSCom, - },**/ - { - "name": "CloudFlare DNS", - "code": ProviderTypeCloudFlare, - }, - { - "name": "自定义HTTP DNS", - "code": ProviderTypeCustomHTTP, - }, +// FindAllProviderTypes 所有的服务商类型 +func FindAllProviderTypes() []maps.Map { + typeMaps := []maps.Map{ + { + "name": "阿里云DNS", + "code": ProviderTypeAliDNS, + "description": "阿里云提供的DNS服务。", + }, + { + "name": "DNSPod", + "code": ProviderTypeDNSPod, + "description": "DNSPod提供的DNS服务。", + }, + /**{ + "name": "帝恩思DNS.COM", + "code": ProviderTypeDNSCom, + "description": "DNS.com提供的DNS服务。", + },**/ + { + "name": "CloudFlare DNS", + "code": ProviderTypeCloudFlare, + "description": "CloudFlare提供的DNS服务。", + }, + } + + if teaconst.IsPlus { + typeMaps = append(typeMaps, []maps.Map{ + { + "name": "集成EdgeDNS", + "code": ProviderTypeLocalEdgeDNS, + "description": "当前企业版提供的DNS服务。", + }, + // TODO 需要实现用户使用AccessId/AccessKey来连接DNS服务 + /**{ + "name": "用户EdgeDNS", + "code": ProviderTypeUserEdgeDNS, + "description": "通过API连接企业版提供的DNS服务。", + },**/ + }...) + } + + typeMaps = append(typeMaps, maps.Map{ + "name": "自定义HTTP DNS", + "code": ProviderTypeCustomHTTP, + "description": "通过自定义的HTTP接口提供DNS服务。", + }) + return typeMaps } // FindProvider 查找服务商实例 @@ -46,6 +76,10 @@ func FindProvider(providerType ProviderType) ProviderInterface { return &AliDNSProvider{} case ProviderTypeCloudFlare: return &CloudFlareProvider{} + case ProviderTypeLocalEdgeDNS: + return &LocalEdgeDNSProvider{} + case ProviderTypeUserEdgeDNS: + return &UserEdgeDNSProvider{} case ProviderTypeCustomHTTP: return &CustomHTTPProvider{} } @@ -54,7 +88,7 @@ func FindProvider(providerType ProviderType) ProviderInterface { // FindProviderTypeName 查找服务商名称 func FindProviderTypeName(providerType ProviderType) string { - for _, t := range AllProviderTypes { + for _, t := range FindAllProviderTypes() { if t.GetString("code") == providerType { return t.GetString("name") } diff --git a/internal/rpc/services/nameservers/service_ns_record.go b/internal/rpc/services/nameservers/service_ns_record.go index 734f972d..4d07be34 100644 --- a/internal/rpc/services/nameservers/service_ns_record.go +++ b/internal/rpc/services/nameservers/service_ns_record.go @@ -84,7 +84,7 @@ func (this *NSRecordService) ListEnabledNSRecords(ctx context.Context, req *pb.L } var tx = this.NullTx() - records, err := nameservers.SharedNSRecordDAO.ListAllEnabledRecords(tx, req.NsDomainId, req.Type, req.Keyword, req.NsRouteId, req.Offset, req.Size) + records, err := nameservers.SharedNSRecordDAO.ListEnabledRecords(tx, req.NsDomainId, req.Type, req.Keyword, req.NsRouteId, req.Offset, req.Size) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_dns_domain.go b/internal/rpc/services/service_dns_domain.go index 070dce8b..3d668b40 100644 --- a/internal/rpc/services/service_dns_domain.go +++ b/internal/rpc/services/service_dns_domain.go @@ -6,6 +6,7 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils" @@ -302,7 +303,7 @@ func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb func (this *DNSDomainService) convertDomainToPB(domain *dns.DNSDomain) (*pb.DNSDomain, error) { domainId := int64(domain.Id) - records := []*dnsclients.Record{} + records := []*dnstypes.Record{} if len(domain.Records) > 0 && domain.Records != "null" { err := json.Unmarshal([]byte(domain.Records), &records) if err != nil { @@ -376,7 +377,7 @@ func (this *DNSDomainService) convertDomainToPB(domain *dns.DNSDomain) (*pb.DNSD } // 转换域名记录信息 -func (this *DNSDomainService) convertRecordToPB(record *dnsclients.Record) *pb.DNSRecord { +func (this *DNSDomainService) convertRecordToPB(record *dnstypes.Record) *pb.DNSRecord { return &pb.DNSRecord{ Id: record.Id, Name: record.Name, @@ -387,7 +388,7 @@ func (this *DNSDomainService) convertRecordToPB(record *dnsclients.Record) *pb.D } // 检查集群节点变化 -func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, records []*dnsclients.Record, domainName string) (result []maps.Map, doneNodeRecords []*dnsclients.Record, doneServerRecords []*dnsclients.Record, countAllNodes int64, countAllServers int64, nodesChanged bool, serversChanged bool, err error) { +func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, records []*dnstypes.Record, domainName string) (result []maps.Map, doneNodeRecords []*dnstypes.Record, doneServerRecords []*dnstypes.Record, countAllNodes int64, countAllServers int64, nodesChanged bool, serversChanged bool, err error) { clusterId := int64(cluster.Id) clusterDnsName := cluster.DnsName clusterDomain := clusterDnsName + "." + domainName @@ -400,10 +401,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, return nil, nil, nil, 0, 0, false, false, err } countAllNodes = int64(len(nodes)) - nodeRecords := []*dnsclients.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复 - nodeRecordMapping := map[string]*dnsclients.Record{} // value_route => *Record + nodeRecords := []*dnstypes.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复 + nodeRecordMapping := map[string]*dnstypes.Record{} // value_route => *Record for _, record := range records { - if record.Type == dnsclients.RecordTypeA && record.Name == clusterDnsName { + if record.Type == dnstypes.RecordTypeA && record.Name == clusterDnsName { nodeRecords = append(nodeRecords, record) nodeRecordMapping[record.Value+"_"+record.Route] = record } @@ -441,10 +442,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, if !ok { result = append(result, maps.Map{ "action": "create", - "record": &dnsclients.Record{ + "record": &dnstypes.Record{ Id: "", Name: clusterDnsName, - Type: dnsclients.RecordTypeA, + Type: dnstypes.RecordTypeA, Value: ip, Route: route, }, @@ -475,10 +476,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, return nil, nil, nil, 0, 0, false, false, err } countAllServers = int64(len(servers)) - serverRecords := []*dnsclients.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复 - serverRecordsMap := map[string]*dnsclients.Record{} // dnsName => *Record + serverRecords := []*dnstypes.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复 + serverRecordsMap := map[string]*dnstypes.Record{} // dnsName => *Record for _, record := range records { - if record.Type == dnsclients.RecordTypeCName && record.Value == clusterDomain+"." { + if record.Type == dnstypes.RecordTypeCNAME && record.Value == clusterDomain+"." { serverRecords = append(serverRecords, record) serverRecordsMap[record.Name] = record } @@ -497,10 +498,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, serversChanged = true result = append(result, maps.Map{ "action": "create", - "record": &dnsclients.Record{ + "record": &dnstypes.Record{ Id: "", Name: dnsName, - Type: dnsclients.RecordTypeCName, + Type: dnstypes.RecordTypeCNAME, Value: clusterDomain + ".", Route: "", // 注意这里为空,需要在执行过程中获取默认值 }, @@ -645,7 +646,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) ( } for _, change := range allChanges { action := change.GetString("action") - record := change.Get("record").(*dnsclients.Record) + record := change.Get("record").(*dnstypes.Record) if len(record.Route) == 0 { record.Route = manager.DefaultRoute() diff --git a/internal/rpc/services/service_dns_provider.go b/internal/rpc/services/service_dns_provider.go index 27615be7..a9a27ed3 100644 --- a/internal/rpc/services/service_dns_provider.go +++ b/internal/rpc/services/service_dns_provider.go @@ -8,12 +8,12 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" ) -// DNS服务商相关服务 +// DNSProviderService DNS服务商相关服务 type DNSProviderService struct { BaseService } -// 创建服务商 +// CreateDNSProvider 创建服务商 func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.CreateDNSProviderRequest) (*pb.CreateDNSProviderResponse, error) { // 校验请求 adminId, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) @@ -31,7 +31,7 @@ func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.C return &pb.CreateDNSProviderResponse{DnsProviderId: providerId}, nil } -// 修改服务商 +// UpdateDNSProvider 修改服务商 func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.UpdateDNSProviderRequest) (*pb.RPCSuccess, error) { // 校验请求 _, _, err := this.ValidateAdminAndUser(ctx, 0, 0) @@ -50,7 +50,7 @@ func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.U return this.Success() } -// 计算服务商数量 +// CountAllEnabledDNSProviders 计算服务商数量 func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context, req *pb.CountAllEnabledDNSProvidersRequest) (*pb.RPCCountResponse, error) { // 校验请求 _, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId) @@ -67,7 +67,7 @@ func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context, return this.SuccessCount(count) } -// 列出单页服务商信息 +// ListEnabledDNSProviders 列出单页服务商信息 func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req *pb.ListEnabledDNSProvidersRequest) (*pb.ListEnabledDNSProvidersResponse, error) { // 校验请求 _, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId) @@ -97,7 +97,7 @@ func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil } -// 查找所有的DNS服务商 +// FindAllEnabledDNSProviders 查找所有的DNS服务商 func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context, req *pb.FindAllEnabledDNSProvidersRequest) (*pb.FindAllEnabledDNSProvidersResponse, error) { // 校验请求 _, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId) @@ -127,7 +127,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context, return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil } -// 删除服务商 +// DeleteDNSProvider 删除服务商 func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.DeleteDNSProviderRequest) (*pb.RPCSuccess, error) { // 校验请求 _, _, err := this.ValidateAdminAndUser(ctx, 0, 0) @@ -146,7 +146,7 @@ func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.D return this.Success() } -// 查找单个服务商 +// FindEnabledDNSProvider 查找单个服务商 func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req *pb.FindEnabledDNSProviderRequest) (*pb.FindEnabledDNSProviderResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -174,7 +174,7 @@ func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req }}, nil } -// 取得所有服务商类型 +// FindAllDNSProviderTypes 取得所有服务商类型 func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req *pb.FindAllDNSProviderTypesRequest) (*pb.FindAllDNSProviderTypesResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -183,16 +183,17 @@ func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req } result := []*pb.DNSProviderType{} - for _, t := range dnsclients.AllProviderTypes { + for _, t := range dnsclients.FindAllProviderTypes() { result = append(result, &pb.DNSProviderType{ - Name: t.GetString("name"), - Code: t.GetString("code"), + Name: t.GetString("name"), + Code: t.GetString("code"), + Description: t.GetString("description"), }) } return &pb.FindAllDNSProviderTypesResponse{ProviderTypes: result}, nil } -// 取得某个类型的所有服务商 +// FindAllEnabledDNSProvidersWithType 取得某个类型的所有服务商 func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.Context, req *pb.FindAllEnabledDNSProvidersWithTypeRequest) (*pb.FindAllEnabledDNSProvidersWithTypeResponse, error) { // 校验请求 _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) diff --git a/internal/rpc/services/service_node.go b/internal/rpc/services/service_node.go index 71f7f461..eb915d6c 100644 --- a/internal/rpc/services/service_node.go +++ b/internal/rpc/services/service_node.go @@ -5,7 +5,7 @@ import ( "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns" - "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/installers" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" @@ -156,7 +156,7 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List } dnsDomainId := int64(0) - domainRoutes := []*dnsclients.Route{} + domainRoutes := []*dnstypes.Route{} if clusterDNS != nil { dnsDomainId = int64(clusterDNS.DnsDomainId) if clusterDNS.DnsDomainId > 0 { diff --git a/internal/tasks/dns_task_executor.go b/internal/tasks/dns_task_executor.go index 9d7f20e3..9167b636 100644 --- a/internal/tasks/dns_task_executor.go +++ b/internal/tasks/dns_task_executor.go @@ -5,6 +5,7 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/db/models" dnsmodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/iwind/TeaGo/dbs" @@ -135,7 +136,7 @@ func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error { recordName := serverDNS.DnsName recordValue := clusterDNSName + "." + domain + "." recordRoute := manager.DefaultRoute() - recordType := dnsclients.RecordTypeCName + recordType := dnstypes.RecordTypeCNAME if serverDNS.State == models.ServerStateDisabled || serverDNS.IsOn == 0 { // 检查记录是否已经存在 record, err := manager.QueryRecord(domain, recordName, recordType) @@ -188,7 +189,7 @@ func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error { } } - err = manager.AddRecord(domain, &dnsclients.Record{ + err = manager.AddRecord(domain, &dnstypes.Record{ Id: "", Name: recordName, Type: recordType, @@ -275,9 +276,9 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { if err != nil { return err } - oldRecordsMap := map[string]*dnsclients.Record{} // route@value => record + oldRecordsMap := map[string]*dnstypes.Record{} // route@value => record for _, record := range records { - if record.Type == dnsclients.RecordTypeA && record.Name == clusterDNSName { + if record.Type == dnstypes.RecordTypeA && record.Name == clusterDNSName { key := record.Route + "@" + record.Value oldRecordsMap[key] = record } @@ -323,10 +324,10 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { continue } - err = manager.AddRecord(domain, &dnsclients.Record{ + err = manager.AddRecord(domain, &dnstypes.Record{ Id: "", Name: clusterDNSName, - Type: dnsclients.RecordTypeA, + Type: dnstypes.RecordTypeA, Value: ip, Route: route, })