mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 07:50:25 +08:00 
			
		
		
		
	实现在域名解析中使用EdgeDNS
This commit is contained in:
		@@ -2,6 +2,7 @@ package acme
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/go-acme/lego/v4/challenge/dns01"
 | 
						"github.com/go-acme/lego/v4/challenge/dns01"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
@@ -24,15 +25,15 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error {
 | 
				
			|||||||
		return errors.New("invalid fqdn value")
 | 
							return errors.New("invalid fqdn value")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	recordName := fqdn[:index]
 | 
						recordName := fqdn[:index]
 | 
				
			||||||
	record, err := this.raw.QueryRecord(domain, recordName, dnsclients.RecordTypeTXT)
 | 
						record, err := this.raw.QueryRecord(domain, recordName, dnstypes.RecordTypeTXT)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.New("query DNS record failed: " + err.Error())
 | 
							return errors.New("query DNS record failed: " + err.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if record == nil {
 | 
						if record == nil {
 | 
				
			||||||
		err = this.raw.AddRecord(domain, &dnsclients.Record{
 | 
							err = this.raw.AddRecord(domain, &dnstypes.Record{
 | 
				
			||||||
			Id:    "",
 | 
								Id:    "",
 | 
				
			||||||
			Name:  recordName,
 | 
								Name:  recordName,
 | 
				
			||||||
			Type:  dnsclients.RecordTypeTXT,
 | 
								Type:  dnstypes.RecordTypeTXT,
 | 
				
			||||||
			Value: value,
 | 
								Value: value,
 | 
				
			||||||
			Route: this.raw.DefaultRoute(),
 | 
								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())
 | 
								return errors.New("create DNS record failed: " + err.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = this.raw.UpdateRecord(domain, record, &dnsclients.Record{
 | 
							err = this.raw.UpdateRecord(domain, record, &dnstypes.Record{
 | 
				
			||||||
			Name:  recordName,
 | 
								Name:  recordName,
 | 
				
			||||||
			Type:  dnsclients.RecordTypeTXT,
 | 
								Type:  dnstypes.RecordTypeTXT,
 | 
				
			||||||
			Value: value,
 | 
								Value: value,
 | 
				
			||||||
			Route: this.raw.DefaultRoute(),
 | 
								Route: this.raw.DefaultRoute(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								internal/const/vars.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								internal/const/vars.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package teaconst
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						IsPlus = false
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -2,6 +2,7 @@ package authority
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
@@ -27,6 +28,9 @@ var SharedAuthorityKeyDAO *AuthorityKeyDAO
 | 
				
			|||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	dbs.OnReady(func() {
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
		SharedAuthorityKeyDAO = NewAuthorityKeyDAO()
 | 
							SharedAuthorityKeyDAO = NewAuthorityKeyDAO()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 初始化IsPlus值
 | 
				
			||||||
 | 
							_, _ = SharedAuthorityKeyDAO.IsPlus(nil)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -73,7 +77,14 @@ func (this *AuthorityKeyDAO) ReadKey(tx *dbs.Tx) (key *AuthorityKey, err error)
 | 
				
			|||||||
	if one == nil {
 | 
						if one == nil {
 | 
				
			||||||
		return nil, 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
 | 
					// ResetKey 重置Key
 | 
				
			||||||
@@ -92,5 +103,6 @@ func (this *AuthorityKeyDAO) IsPlus(tx *dbs.Tx) (bool, error) {
 | 
				
			|||||||
	if key == nil {
 | 
						if key == nil {
 | 
				
			||||||
		return false, 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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,17 +7,17 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestAuthorityKeyDAO_UpdateValue(t *testing.T) {
 | 
					func TestAuthorityKeyDAO_UpdateValue(t *testing.T) {
 | 
				
			||||||
	err := NewAuthorityKeyDAO().UpdateValue(nil, "12345678")
 | 
						err := NewAuthorityKeyDAO().UpdateKey(nil, "12345678", "", "", "", []string{}, "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	t.Logf("ok")
 | 
						t.Log("ok")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestAuthorityKeyDAO_ReadValue(t *testing.T) {
 | 
					func TestAuthorityKeyDAO_ReadValue(t *testing.T) {
 | 
				
			||||||
	value, err := NewAuthorityKeyDAO().ReadValue(nil)
 | 
						value, err := NewAuthorityKeyDAO().ReadKey(nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	t.Logf(value)
 | 
						t.Log(value)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ package dns
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
@@ -39,7 +39,7 @@ func init() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// EnableDNSDomain 启用条目
 | 
				
			||||||
func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
					func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
				
			||||||
	_, err := this.Query(tx).
 | 
						_, err := this.Query(tx).
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
@@ -48,7 +48,7 @@ func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 禁用条目
 | 
					// DisableDNSDomain 禁用条目
 | 
				
			||||||
func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
					func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
				
			||||||
	_, err := this.Query(tx).
 | 
						_, err := this.Query(tx).
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
@@ -57,7 +57,7 @@ func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找启用中的条目
 | 
					// FindEnabledDNSDomain 查找启用中的条目
 | 
				
			||||||
func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain, error) {
 | 
					func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain, error) {
 | 
				
			||||||
	result, err := this.Query(tx).
 | 
						result, err := this.Query(tx).
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
@@ -69,7 +69,7 @@ func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain
 | 
				
			|||||||
	return result.(*DNSDomain), err
 | 
						return result.(*DNSDomain), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 根据主键查找名称
 | 
					// FindDNSDomainName 根据主键查找名称
 | 
				
			||||||
func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error) {
 | 
					func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error) {
 | 
				
			||||||
	return this.Query(tx).
 | 
						return this.Query(tx).
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
@@ -77,7 +77,7 @@ func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error
 | 
				
			|||||||
		FindStringCol("")
 | 
							FindStringCol("")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建域名
 | 
					// CreateDomain 创建域名
 | 
				
			||||||
func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64, providerId int64, name string) (int64, error) {
 | 
					func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64, providerId int64, name string) (int64, error) {
 | 
				
			||||||
	op := NewDNSDomainOperator()
 | 
						op := NewDNSDomainOperator()
 | 
				
			||||||
	op.ProviderId = providerId
 | 
						op.ProviderId = providerId
 | 
				
			||||||
@@ -93,7 +93,7 @@ func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64,
 | 
				
			|||||||
	return types.Int64(op.Id), nil
 | 
						return types.Int64(op.Id), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改域名
 | 
					// UpdateDomain 修改域名
 | 
				
			||||||
func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string, isOn bool) error {
 | 
					func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string, isOn bool) error {
 | 
				
			||||||
	if domainId <= 0 {
 | 
						if domainId <= 0 {
 | 
				
			||||||
		return errors.New("invalid domainId")
 | 
							return errors.New("invalid domainId")
 | 
				
			||||||
@@ -109,7 +109,7 @@ func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string,
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查询一个服务商下面的所有域名
 | 
					// FindAllEnabledDomainsWithProviderId 查询一个服务商下面的所有域名
 | 
				
			||||||
func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (result []*DNSDomain, err error) {
 | 
					func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (result []*DNSDomain, err error) {
 | 
				
			||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		State(DNSDomainStateEnabled).
 | 
							State(DNSDomainStateEnabled).
 | 
				
			||||||
@@ -120,7 +120,7 @@ func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, provid
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 计算某个服务商下的域名数量
 | 
					// CountAllEnabledDomainsWithProviderId 计算某个服务商下的域名数量
 | 
				
			||||||
func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (int64, error) {
 | 
					func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (int64, error) {
 | 
				
			||||||
	return this.Query(tx).
 | 
						return this.Query(tx).
 | 
				
			||||||
		State(DNSDomainStateEnabled).
 | 
							State(DNSDomainStateEnabled).
 | 
				
			||||||
@@ -128,7 +128,7 @@ func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, provi
 | 
				
			|||||||
		Count()
 | 
							Count()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 更新域名数据
 | 
					// UpdateDomainData 更新域名数据
 | 
				
			||||||
func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data string) error {
 | 
					func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data string) error {
 | 
				
			||||||
	if domainId <= 0 {
 | 
						if domainId <= 0 {
 | 
				
			||||||
		return errors.New("invalid domainId")
 | 
							return errors.New("invalid domainId")
 | 
				
			||||||
@@ -140,7 +140,7 @@ func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data stri
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 更新域名解析记录
 | 
					// UpdateDomainRecords 更新域名解析记录
 | 
				
			||||||
func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, recordsJSON []byte) error {
 | 
					func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, recordsJSON []byte) error {
 | 
				
			||||||
	if domainId <= 0 {
 | 
						if domainId <= 0 {
 | 
				
			||||||
		return errors.New("invalid domainId")
 | 
							return errors.New("invalid domainId")
 | 
				
			||||||
@@ -153,7 +153,7 @@ func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, record
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 更新线路
 | 
					// UpdateDomainRoutes 更新线路
 | 
				
			||||||
func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJSON []byte) error {
 | 
					func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJSON []byte) error {
 | 
				
			||||||
	if domainId <= 0 {
 | 
						if domainId <= 0 {
 | 
				
			||||||
		return errors.New("invalid domainId")
 | 
							return errors.New("invalid domainId")
 | 
				
			||||||
@@ -166,8 +166,8 @@ func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJ
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找域名线路
 | 
					// FindDomainRoutes 查找域名线路
 | 
				
			||||||
func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnsclients.Route, error) {
 | 
					func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnstypes.Route, error) {
 | 
				
			||||||
	routes, err := this.Query(tx).
 | 
						routes, err := this.Query(tx).
 | 
				
			||||||
		Pk(domainId).
 | 
							Pk(domainId).
 | 
				
			||||||
		Result("routes").
 | 
							Result("routes").
 | 
				
			||||||
@@ -178,7 +178,7 @@ func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnscl
 | 
				
			|||||||
	if len(routes) == 0 || routes == "null" {
 | 
						if len(routes) == 0 || routes == "null" {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result := []*dnsclients.Route{}
 | 
						result := []*dnstypes.Route{}
 | 
				
			||||||
	err = json.Unmarshal([]byte(routes), &result)
 | 
						err = json.Unmarshal([]byte(routes), &result)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -186,7 +186,7 @@ func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnscl
 | 
				
			|||||||
	return result, nil
 | 
						return result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找线路名称
 | 
					// FindDomainRouteName 查找线路名称
 | 
				
			||||||
func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeCode string) (string, error) {
 | 
					func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeCode string) (string, error) {
 | 
				
			||||||
	routes, err := this.FindDomainRoutes(tx, domainId)
 | 
						routes, err := this.FindDomainRoutes(tx, domainId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -200,7 +200,7 @@ func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeC
 | 
				
			|||||||
	return "", nil
 | 
						return "", nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 判断是否有域名可选
 | 
					// ExistAvailableDomains 判断是否有域名可选
 | 
				
			||||||
func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) {
 | 
					func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) {
 | 
				
			||||||
	subQuery, err := SharedDNSProviderDAO.Query(tx).
 | 
						subQuery, err := SharedDNSProviderDAO.Query(tx).
 | 
				
			||||||
		Where("state=1"). // 这里要使用非变量
 | 
							Where("state=1"). // 这里要使用非变量
 | 
				
			||||||
@@ -216,7 +216,7 @@ func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) {
 | 
				
			|||||||
		Exist()
 | 
							Exist()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 检查域名解析记录是否存在
 | 
					// ExistDomainRecord 检查域名解析记录是否存在
 | 
				
			||||||
func (this *DNSDomainDAO) ExistDomainRecord(tx *dbs.Tx, domainId int64, recordName string, recordType string, recordRoute string, recordValue string) (bool, error) {
 | 
					func (this *DNSDomainDAO) ExistDomainRecord(tx *dbs.Tx, domainId int64, recordName string, recordType string, recordRoute string, recordValue string) (bool, error) {
 | 
				
			||||||
	query := maps.Map{
 | 
						query := maps.Map{
 | 
				
			||||||
		"name": recordName,
 | 
							"name": recordName,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,15 +2,15 @@ package dns
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取所有的线路
 | 
					// DecodeRoutes 获取所有的线路
 | 
				
			||||||
func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) {
 | 
					func (this *DNSDomain) DecodeRoutes() ([]*dnstypes.Route, error) {
 | 
				
			||||||
	if len(this.Routes) == 0 || this.Routes == "null" {
 | 
						if len(this.Routes) == 0 || this.Routes == "null" {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result := []*dnsclients.Route{}
 | 
						result := []*dnstypes.Route{}
 | 
				
			||||||
	err := json.Unmarshal([]byte(this.Routes), &result)
 | 
						err := json.Unmarshal([]byte(this.Routes), &result)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -18,7 +18,7 @@ func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) {
 | 
				
			|||||||
	return result, nil
 | 
						return result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 检查是否包含某个线路
 | 
					// ContainsRouteCode 检查是否包含某个线路
 | 
				
			||||||
func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) {
 | 
					func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) {
 | 
				
			||||||
	routes, err := this.DecodeRoutes()
 | 
						routes, err := this.DecodeRoutes()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -32,13 +32,13 @@ func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) {
 | 
				
			|||||||
	return false, nil
 | 
						return false, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取所有的记录
 | 
					// DecodeRecords 获取所有的记录
 | 
				
			||||||
func (this *DNSDomain) DecodeRecords() ([]*dnsclients.Record, error) {
 | 
					func (this *DNSDomain) DecodeRecords() ([]*dnstypes.Record, error) {
 | 
				
			||||||
	records := this.Records
 | 
						records := this.Records
 | 
				
			||||||
	if len(records) == 0 || records == "null" {
 | 
						if len(records) == 0 || records == "null" {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result := []*dnsclients.Record{}
 | 
						result := []*dnstypes.Record{}
 | 
				
			||||||
	err := json.Unmarshal([]byte(records), &result)
 | 
						err := json.Unmarshal([]byte(records), &result)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -184,3 +184,13 @@ func (this *NSDomainDAO) ListDomainsAfterVersion(tx *dbs.Tx, version int64, size
 | 
				
			|||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
	return
 | 
						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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,7 +162,7 @@ func (this *NSRecordDAO) CountAllEnabledRecords(tx *dbs.Tx, domainId int64, dnsT
 | 
				
			|||||||
	return query.Count()
 | 
						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).
 | 
						query := this.Query(tx).
 | 
				
			||||||
		Attr("domainId", domainId).
 | 
							Attr("domainId", domainId).
 | 
				
			||||||
		State(NSRecordStateEnabled)
 | 
							State(NSRecordStateEnabled)
 | 
				
			||||||
@@ -204,3 +204,17 @@ func (this *NSRecordDAO) ListRecordsAfterVersion(tx *dbs.Tx, version int64, size
 | 
				
			|||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
	return
 | 
						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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
package dnsclients
 | 
					package dnstypes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RecordType = string
 | 
					type RecordType = string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	RecordTypeA     RecordType = "A"
 | 
						RecordTypeA     RecordType = "A"
 | 
				
			||||||
	RecordTypeCName RecordType = "CNAME"
 | 
						RecordTypeCNAME RecordType = "CNAME"
 | 
				
			||||||
	RecordTypeTXT   RecordType = "TXT"
 | 
						RecordTypeTXT   RecordType = "TXT"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package dnsclients
 | 
					package dnstypes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Route 线路描述
 | 
					// Route 线路描述
 | 
				
			||||||
type Route struct {
 | 
					type Route struct {
 | 
				
			||||||
@@ -2,6 +2,7 @@ package dnsclients
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"errors"
 | 
						"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/requests"
 | 
				
			||||||
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
 | 
						"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
 | 
				
			||||||
	"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
 | 
						"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
 | 
				
			||||||
@@ -31,7 +32,7 @@ func (this *AliDNSProvider) Auth(params maps.Map) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRecords 获取域名列表
 | 
					// GetRecords 获取域名列表
 | 
				
			||||||
func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err error) {
 | 
					func (this *AliDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
 | 
				
			||||||
	pageNumber := 1
 | 
						pageNumber := 1
 | 
				
			||||||
	size := 100
 | 
						size := 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -48,11 +49,11 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		for _, record := range resp.DomainRecords.Record {
 | 
							for _, record := range resp.DomainRecords.Record {
 | 
				
			||||||
			// 修正Record
 | 
								// 修正Record
 | 
				
			||||||
			if record.Type == RecordTypeCName && !strings.HasSuffix(record.Value, ".") {
 | 
								if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Value, ".") {
 | 
				
			||||||
				record.Value += "."
 | 
									record.Value += "."
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			records = append(records, &Record{
 | 
								records = append(records, &dnstypes.Record{
 | 
				
			||||||
				Id:    record.RecordId,
 | 
									Id:    record.RecordId,
 | 
				
			||||||
				Name:  record.RR,
 | 
									Name:  record.RR,
 | 
				
			||||||
				Type:  record.Type,
 | 
									Type:  record.Type,
 | 
				
			||||||
@@ -71,7 +72,7 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRoutes 读取域名支持的线路数据
 | 
					// 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 := alidns.CreateDescribeSupportLinesRequest()
 | 
				
			||||||
	req.DomainName = domain
 | 
						req.DomainName = domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -81,7 +82,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, line := range resp.RecordLines.RecordLine {
 | 
						for _, line := range resp.RecordLines.RecordLine {
 | 
				
			||||||
		routes = append(routes, &Route{
 | 
							routes = append(routes, &dnstypes.Route{
 | 
				
			||||||
			Name: line.LineName,
 | 
								Name: line.LineName,
 | 
				
			||||||
			Code: line.LineCode,
 | 
								Code: line.LineCode,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -90,7 +91,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// QueryRecord 查询单个记录
 | 
					// 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)
 | 
						records, err := this.GetRecords(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -104,7 +105,7 @@ func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType R
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddRecord 设置记录
 | 
					// AddRecord 设置记录
 | 
				
			||||||
func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error {
 | 
					func (this *AliDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
 | 
				
			||||||
	req := alidns.CreateAddDomainRecordRequest()
 | 
						req := alidns.CreateAddDomainRecordRequest()
 | 
				
			||||||
	req.RR = newRecord.Name
 | 
						req.RR = newRecord.Name
 | 
				
			||||||
	req.Type = newRecord.Type
 | 
						req.Type = newRecord.Type
 | 
				
			||||||
@@ -125,7 +126,7 @@ func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateRecord 修改记录
 | 
					// 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 := alidns.CreateUpdateDomainRecordRequest()
 | 
				
			||||||
	req.RecordId = record.Id
 | 
						req.RecordId = record.Id
 | 
				
			||||||
	req.RR = newRecord.Name
 | 
						req.RR = newRecord.Name
 | 
				
			||||||
@@ -139,7 +140,7 @@ func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecor
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteRecord 删除记录
 | 
					// DeleteRecord 删除记录
 | 
				
			||||||
func (this *AliDNSProvider) DeleteRecord(domain string, record *Record) error {
 | 
					func (this *AliDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
 | 
				
			||||||
	req := alidns.CreateDeleteDomainRecordRequest()
 | 
						req := alidns.CreateDeleteDomainRecordRequest()
 | 
				
			||||||
	req.RecordId = record.Id
 | 
						req.RecordId = record.Id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ package dnsclients
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	_ "github.com/iwind/TeaGo/bootstrap"
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
@@ -29,7 +30,7 @@ func TestAliDNSProvider_DeleteRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.DeleteRecord("meloy.cn", &Record{
 | 
						err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{
 | 
				
			||||||
		Id: "20746603318032384",
 | 
							Id: "20746603318032384",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -57,10 +58,10 @@ func TestAliDNSProvider_AddRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.AddRecord("meloy.cn", &Record{
 | 
						err = provider.AddRecord("meloy.cn", &dnstypes.Record{
 | 
				
			||||||
		Id:    "",
 | 
							Id:    "",
 | 
				
			||||||
		Name:  "test",
 | 
							Name:  "test",
 | 
				
			||||||
		Type:  RecordTypeA,
 | 
							Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
		Value: "192.168.1.100",
 | 
							Value: "192.168.1.100",
 | 
				
			||||||
		Route: "unicom",
 | 
							Route: "unicom",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -76,10 +77,10 @@ func TestAliDNSProvider_UpdateRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.UpdateRecord("meloy.cn", &Record{Id: "20746664455255040"}, &Record{
 | 
						err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "20746664455255040"}, &dnstypes.Record{
 | 
				
			||||||
		Id:    "",
 | 
							Id:    "",
 | 
				
			||||||
		Name:  "test",
 | 
							Name:  "test",
 | 
				
			||||||
		Type:  RecordTypeA,
 | 
							Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
		Value: "192.168.1.101",
 | 
							Value: "192.168.1.101",
 | 
				
			||||||
		Route: "unicom",
 | 
							Route: "unicom",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ import (
 | 
				
			|||||||
	"crypto/tls"
 | 
						"crypto/tls"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/cloudflare"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/cloudflare"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
@@ -59,7 +60,7 @@ func (this *CloudFlareProvider) Auth(params maps.Map) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRecords 获取域名解析记录列表
 | 
					// 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)
 | 
						zoneId, err := this.findZoneIdWithDomain(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -81,13 +82,13 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		for _, record := range resp.Result {
 | 
							for _, record := range resp.Result {
 | 
				
			||||||
			// 修正Record
 | 
								// 修正Record
 | 
				
			||||||
			if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") {
 | 
								if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") {
 | 
				
			||||||
				record.Content += "."
 | 
									record.Content += "."
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			record.Name = strings.TrimSuffix(record.Name, "."+domain)
 | 
								record.Name = strings.TrimSuffix(record.Name, "."+domain)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			records = append(records, &Record{
 | 
								records = append(records, &dnstypes.Record{
 | 
				
			||||||
				Id:    record.Id,
 | 
									Id:    record.Id,
 | 
				
			||||||
				Name:  record.Name,
 | 
									Name:  record.Name,
 | 
				
			||||||
				Type:  record.Type,
 | 
									Type:  record.Type,
 | 
				
			||||||
@@ -101,15 +102,15 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRoutes 读取域名支持的线路数据
 | 
					// GetRoutes 读取域名支持的线路数据
 | 
				
			||||||
func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*Route, err error) {
 | 
					func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
 | 
				
			||||||
	routes = []*Route{
 | 
						routes = []*dnstypes.Route{
 | 
				
			||||||
		{Name: "默认", Code: CloudFlareDefaultRoute},
 | 
							{Name: "默认", Code: CloudFlareDefaultRoute},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// QueryRecord 查询单个记录
 | 
					// 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)
 | 
						zoneId, err := this.findZoneIdWithDomain(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -131,13 +132,13 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy
 | 
				
			|||||||
	record := resp.Result[0]
 | 
						record := resp.Result[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 修正Record
 | 
						// 修正Record
 | 
				
			||||||
	if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") {
 | 
						if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") {
 | 
				
			||||||
		record.Content += "."
 | 
							record.Content += "."
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	record.Name = strings.TrimSuffix(record.Name, "."+domain)
 | 
						record.Name = strings.TrimSuffix(record.Name, "."+domain)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &Record{
 | 
						return &dnstypes.Record{
 | 
				
			||||||
		Id:    record.Id,
 | 
							Id:    record.Id,
 | 
				
			||||||
		Name:  record.Name,
 | 
							Name:  record.Name,
 | 
				
			||||||
		Type:  record.Type,
 | 
							Type:  record.Type,
 | 
				
			||||||
@@ -147,7 +148,7 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddRecord 设置记录
 | 
					// 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)
 | 
						zoneId, err := this.findZoneIdWithDomain(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@@ -167,7 +168,7 @@ func (this *CloudFlareProvider) AddRecord(domain string, newRecord *Record) erro
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateRecord 修改记录
 | 
					// 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)
 | 
						zoneId, err := this.findZoneIdWithDomain(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@@ -183,7 +184,7 @@ func (this *CloudFlareProvider) UpdateRecord(domain string, record *Record, newR
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteRecord 删除记录
 | 
					// 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)
 | 
						zoneId, err := this.findZoneIdWithDomain(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ package dnsclients
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
@@ -45,7 +46,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		t.Log("== www.meloy.cn/A ==")
 | 
							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 {
 | 
							if err != nil {
 | 
				
			||||||
			t.Fatal(err)
 | 
								t.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -53,7 +54,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		t.Log("== www.meloy.cn/CNAME ==")
 | 
							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 {
 | 
							if err != nil {
 | 
				
			||||||
			t.Fatal(err)
 | 
								t.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -61,7 +62,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		t.Log("== hello.meloy.cn ==")
 | 
							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 {
 | 
							if err != nil {
 | 
				
			||||||
			t.Fatal(err)
 | 
								t.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -69,7 +70,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		t.Log("== test.meloy.cn ==")
 | 
							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 {
 | 
							if err != nil {
 | 
				
			||||||
			t.Fatal(err)
 | 
								t.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -83,10 +84,10 @@ func TestCloudFlareProvider_AddRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		err = provider.AddRecord("meloy.cn", &Record{
 | 
							err = provider.AddRecord("meloy.cn", &dnstypes.Record{
 | 
				
			||||||
			Id:    "",
 | 
								Id:    "",
 | 
				
			||||||
			Name:  "test",
 | 
								Name:  "test",
 | 
				
			||||||
			Type:  RecordTypeA,
 | 
								Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
			Value: "182.92.212.46",
 | 
								Value: "182.92.212.46",
 | 
				
			||||||
			Route: "",
 | 
								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:    "",
 | 
								Id:    "",
 | 
				
			||||||
			Name:  "test1",
 | 
								Name:  "test1",
 | 
				
			||||||
			Type:  RecordTypeCName,
 | 
								Type:  dnstypes.RecordTypeCNAME,
 | 
				
			||||||
			Value: "cdn.meloy.cn.",
 | 
								Value: "cdn.meloy.cn.",
 | 
				
			||||||
			Route: "",
 | 
								Route: "",
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -114,10 +115,10 @@ func TestCloudFlareProvider_UpdateRecord(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = provider.UpdateRecord("meloy.cn", &Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &Record{
 | 
						err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &dnstypes.Record{
 | 
				
			||||||
		Id:    "",
 | 
							Id:    "",
 | 
				
			||||||
		Name:  "test1",
 | 
							Name:  "test1",
 | 
				
			||||||
		Type:  RecordTypeCName,
 | 
							Type:  dnstypes.RecordTypeCNAME,
 | 
				
			||||||
		Value: "cdn123.meloy.cn.",
 | 
							Value: "cdn123.meloy.cn.",
 | 
				
			||||||
		Route: "",
 | 
							Route: "",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -132,7 +133,7 @@ func TestCloudFlareProvider_DeleteRecord(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = provider.DeleteRecord("meloy.cn", &Record{
 | 
						err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{
 | 
				
			||||||
		Id: "86282d89bbd1f66a69ca409da84f34b1",
 | 
							Id: "86282d89bbd1f66a69ca409da84f34b1",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
@@ -49,7 +50,7 @@ func (this *CustomHTTPProvider) Auth(params maps.Map) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRecords 获取域名解析记录列表
 | 
					// 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{
 | 
						resp, err := this.post(maps.Map{
 | 
				
			||||||
		"action": "GetRecords",
 | 
							"action": "GetRecords",
 | 
				
			||||||
		"domain": domain,
 | 
							"domain": domain,
 | 
				
			||||||
@@ -62,7 +63,7 @@ func (this *CustomHTTPProvider) GetRecords(domain string) (records []*Record, er
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRoutes 读取域名支持的线路数据
 | 
					// 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{
 | 
						resp, err := this.post(maps.Map{
 | 
				
			||||||
		"action": "GetRoutes",
 | 
							"action": "GetRoutes",
 | 
				
			||||||
		"domain": domain,
 | 
							"domain": domain,
 | 
				
			||||||
@@ -75,7 +76,7 @@ func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*Route, err e
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// QueryRecord 查询单个记录
 | 
					// 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{
 | 
						resp, err := this.post(maps.Map{
 | 
				
			||||||
		"action":     "QueryRecord",
 | 
							"action":     "QueryRecord",
 | 
				
			||||||
		"domain":     domain,
 | 
							"domain":     domain,
 | 
				
			||||||
@@ -88,7 +89,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy
 | 
				
			|||||||
	if len(resp) == 0 {
 | 
						if len(resp) == 0 {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	record := &Record{}
 | 
						record := &dnstypes.Record{}
 | 
				
			||||||
	err = json.Unmarshal(resp, record)
 | 
						err = json.Unmarshal(resp, record)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -100,7 +101,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddRecord 设置记录
 | 
					// 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{
 | 
						_, err := this.post(maps.Map{
 | 
				
			||||||
		"action":    "AddRecord",
 | 
							"action":    "AddRecord",
 | 
				
			||||||
		"domain":    domain,
 | 
							"domain":    domain,
 | 
				
			||||||
@@ -110,7 +111,7 @@ func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *Record) erro
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateRecord 修改记录
 | 
					// 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{
 | 
						_, err := this.post(maps.Map{
 | 
				
			||||||
		"action":    "UpdateRecord",
 | 
							"action":    "UpdateRecord",
 | 
				
			||||||
		"domain":    domain,
 | 
							"domain":    domain,
 | 
				
			||||||
@@ -121,7 +122,7 @@ func (this *CustomHTTPProvider) UpdateRecord(domain string, record *Record, newR
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteRecord 删除记录
 | 
					// 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{
 | 
						_, err := this.post(maps.Map{
 | 
				
			||||||
		"action": "DeleteRecord",
 | 
							"action": "DeleteRecord",
 | 
				
			||||||
		"domain": domain,
 | 
							"domain": domain,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package dnsclients
 | 
					package dnsclients
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
@@ -15,10 +16,10 @@ func TestCustomHTTPProvider_AddRecord(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = provider.AddRecord("hello.com", &Record{
 | 
						err = provider.AddRecord("hello.com", &dnstypes.Record{
 | 
				
			||||||
		Id:    "",
 | 
							Id:    "",
 | 
				
			||||||
		Name:  "world",
 | 
							Name:  "world",
 | 
				
			||||||
		Type:  RecordTypeA,
 | 
							Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
		Value: "127.0.0.1",
 | 
							Value: "127.0.0.1",
 | 
				
			||||||
		Route: "default",
 | 
							Route: "default",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package dnsclients
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
@@ -35,7 +36,7 @@ func (this *DNSPodProvider) Auth(params maps.Map) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRecords 获取域名列表
 | 
					// GetRecords 获取域名列表
 | 
				
			||||||
func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err error) {
 | 
					func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
 | 
				
			||||||
	offset := 0
 | 
						offset := 0
 | 
				
			||||||
	size := 100
 | 
						size := 100
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
@@ -53,7 +54,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er
 | 
				
			|||||||
		recordSlice := recordsResp.GetSlice("records")
 | 
							recordSlice := recordsResp.GetSlice("records")
 | 
				
			||||||
		for _, record := range recordSlice {
 | 
							for _, record := range recordSlice {
 | 
				
			||||||
			recordMap := maps.NewMap(record)
 | 
								recordMap := maps.NewMap(record)
 | 
				
			||||||
			records = append(records, &Record{
 | 
								records = append(records, &dnstypes.Record{
 | 
				
			||||||
				Id:    recordMap.GetString("id"),
 | 
									Id:    recordMap.GetString("id"),
 | 
				
			||||||
				Name:  recordMap.GetString("name"),
 | 
									Name:  recordMap.GetString("name"),
 | 
				
			||||||
				Type:  recordMap.GetString("type"),
 | 
									Type:  recordMap.GetString("type"),
 | 
				
			||||||
@@ -73,7 +74,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetRoutes 读取线路数据
 | 
					// 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{
 | 
						infoResp, err := this.post("/Domain.info", map[string]string{
 | 
				
			||||||
		"domain": domain,
 | 
							"domain": domain,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -97,7 +98,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, line := range lines {
 | 
						for _, line := range lines {
 | 
				
			||||||
		lineString := types.String(line)
 | 
							lineString := types.String(line)
 | 
				
			||||||
		routes = append(routes, &Route{
 | 
							routes = append(routes, &dnstypes.Route{
 | 
				
			||||||
			Name: lineString,
 | 
								Name: lineString,
 | 
				
			||||||
			Code: lineString,
 | 
								Code: lineString,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
@@ -107,7 +108,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// QueryRecord 查询单个记录
 | 
					// 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)
 | 
						records, err := this.GetRecords(domain)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -121,13 +122,13 @@ func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType R
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddRecord 设置记录
 | 
					// AddRecord 设置记录
 | 
				
			||||||
func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error {
 | 
					func (this *DNSPodProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
 | 
				
			||||||
	if newRecord == nil {
 | 
						if newRecord == nil {
 | 
				
			||||||
		return errors.New("invalid new record")
 | 
							return errors.New("invalid new record")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 在CHANGE记录后面加入点
 | 
						// 在CHANGE记录后面加入点
 | 
				
			||||||
	if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") {
 | 
						if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") {
 | 
				
			||||||
		newRecord.Value += "."
 | 
							newRecord.Value += "."
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_, err := this.post("/Record.Create", map[string]string{
 | 
						_, err := this.post("/Record.Create", map[string]string{
 | 
				
			||||||
@@ -141,7 +142,7 @@ func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateRecord 修改记录
 | 
					// 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 {
 | 
						if record == nil {
 | 
				
			||||||
		return errors.New("invalid record")
 | 
							return errors.New("invalid record")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -150,7 +151,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 在CHANGE记录后面加入点
 | 
						// 在CHANGE记录后面加入点
 | 
				
			||||||
	if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") {
 | 
						if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") {
 | 
				
			||||||
		newRecord.Value += "."
 | 
							newRecord.Value += "."
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_, err := this.post("/Record.Modify", map[string]string{
 | 
						_, err := this.post("/Record.Modify", map[string]string{
 | 
				
			||||||
@@ -165,7 +166,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteRecord 删除记录
 | 
					// DeleteRecord 删除记录
 | 
				
			||||||
func (this *DNSPodProvider) DeleteRecord(domain string, record *Record) error {
 | 
					func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
 | 
				
			||||||
	if record == nil {
 | 
						if record == nil {
 | 
				
			||||||
		return errors.New("invalid record to delete")
 | 
							return errors.New("invalid record to delete")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ package dnsclients
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
@@ -40,8 +41,8 @@ func TestDNSPodProvider_AddRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.AddRecord("yun4s.cn", &Record{
 | 
						err = provider.AddRecord("yun4s.cn", &dnstypes.Record{
 | 
				
			||||||
		Type:  RecordTypeCName,
 | 
							Type:  dnstypes.RecordTypeCNAME,
 | 
				
			||||||
		Name:  "hello-forward",
 | 
							Name:  "hello-forward",
 | 
				
			||||||
		Value: "hello.yun4s.cn",
 | 
							Value: "hello.yun4s.cn",
 | 
				
			||||||
		Route: "联通",
 | 
							Route: "联通",
 | 
				
			||||||
@@ -58,10 +59,10 @@ func TestDNSPodProvider_UpdateRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.UpdateRecord("yun4s.cn", &Record{
 | 
						err = provider.UpdateRecord("yun4s.cn", &dnstypes.Record{
 | 
				
			||||||
		Id: "697036856",
 | 
							Id: "697036856",
 | 
				
			||||||
	}, &Record{
 | 
						}, &dnstypes.Record{
 | 
				
			||||||
		Type:  RecordTypeA,
 | 
							Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
		Name:  "hello",
 | 
							Name:  "hello",
 | 
				
			||||||
		Value: "192.168.1.102",
 | 
							Value: "192.168.1.102",
 | 
				
			||||||
		Route: "联通",
 | 
							Route: "联通",
 | 
				
			||||||
@@ -78,7 +79,7 @@ func TestDNSPodProvider_DeleteRecord(t *testing.T) {
 | 
				
			|||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = provider.DeleteRecord("yun4s.cn", &Record{
 | 
						err = provider.DeleteRecord("yun4s.cn", &dnstypes.Record{
 | 
				
			||||||
		Id: "697040986",
 | 
							Id: "697040986",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,9 @@
 | 
				
			|||||||
package dnsclients
 | 
					package dnsclients
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "github.com/iwind/TeaGo/maps"
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ProviderInterface DNS操作接口
 | 
					// ProviderInterface DNS操作接口
 | 
				
			||||||
type ProviderInterface interface {
 | 
					type ProviderInterface interface {
 | 
				
			||||||
@@ -8,22 +11,22 @@ type ProviderInterface interface {
 | 
				
			|||||||
	Auth(params maps.Map) error
 | 
						Auth(params maps.Map) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// GetRecords 获取域名解析记录列表
 | 
						// GetRecords 获取域名解析记录列表
 | 
				
			||||||
	GetRecords(domain string) (records []*Record, err error)
 | 
						GetRecords(domain string) (records []*dnstypes.Record, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// GetRoutes 读取域名支持的线路数据
 | 
						// GetRoutes 读取域名支持的线路数据
 | 
				
			||||||
	GetRoutes(domain string) (routes []*Route, err error)
 | 
						GetRoutes(domain string) (routes []*dnstypes.Route, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// QueryRecord 查询单个记录
 | 
						// QueryRecord 查询单个记录
 | 
				
			||||||
	QueryRecord(domain string, name string, recordType RecordType) (*Record, error)
 | 
						QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// AddRecord 设置记录
 | 
						// AddRecord 设置记录
 | 
				
			||||||
	AddRecord(domain string, newRecord *Record) error
 | 
						AddRecord(domain string, newRecord *dnstypes.Record) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// UpdateRecord 修改记录
 | 
						// UpdateRecord 修改记录
 | 
				
			||||||
	UpdateRecord(domain string, record *Record, newRecord *Record) error
 | 
						UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DeleteRecord 删除记录
 | 
						// DeleteRecord 删除记录
 | 
				
			||||||
	DeleteRecord(domain string, record *Record) error
 | 
						DeleteRecord(domain string, record *dnstypes.Record) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DefaultRoute 默认线路
 | 
						// DefaultRoute 默认线路
 | 
				
			||||||
	DefaultRoute() string
 | 
						DefaultRoute() string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										246
									
								
								internal/dnsclients/provider_local_edge_dns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								internal/dnsclients/provider_local_edge_dns.go
									
									
									
									
									
										Normal file
									
								
							@@ -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 ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										160
									
								
								internal/dnsclients/provider_local_edge_dns_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								internal/dnsclients/provider_local_edge_dns_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -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())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										59
									
								
								internal/dnsclients/provider_user_edge_dns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								internal/dnsclients/provider_user_edge_dns.go
									
									
									
									
									
										Normal file
									
								
							@@ -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 ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,40 +1,70 @@
 | 
				
			|||||||
package dnsclients
 | 
					package dnsclients
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "github.com/iwind/TeaGo/maps"
 | 
					import (
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ProviderType = string
 | 
					type ProviderType = string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 服务商代号
 | 
					// 服务商代号
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	ProviderTypeDNSPod     ProviderType = "dnspod"
 | 
						ProviderTypeDNSPod       ProviderType = "dnspod"       // DNSPod
 | 
				
			||||||
	ProviderTypeAliDNS     ProviderType = "alidns"
 | 
						ProviderTypeAliDNS       ProviderType = "alidns"       // 阿里云DNS
 | 
				
			||||||
	ProviderTypeDNSCom     ProviderType = "dnscom"
 | 
						ProviderTypeDNSCom       ProviderType = "dnscom"       // dns.com
 | 
				
			||||||
	ProviderTypeCloudFlare ProviderType = "cloudFlare"
 | 
						ProviderTypeCloudFlare   ProviderType = "cloudFlare"   // CloudFlare DNS
 | 
				
			||||||
	ProviderTypeCustomHTTP ProviderType = "customHTTP"
 | 
						ProviderTypeLocalEdgeDNS ProviderType = "localEdgeDNS" // 和当前系统集成的EdgeDNS
 | 
				
			||||||
 | 
						ProviderTypeUserEdgeDNS  ProviderType = "userEdgeDNS"  // 通过API连接的EdgeDNS
 | 
				
			||||||
 | 
						ProviderTypeCustomHTTP   ProviderType = "customHTTP"   // 自定义HTTP接口
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AllProviderTypes 所有的服务商类型
 | 
					// FindAllProviderTypes 所有的服务商类型
 | 
				
			||||||
var AllProviderTypes = []maps.Map{
 | 
					func FindAllProviderTypes() []maps.Map {
 | 
				
			||||||
 | 
						typeMaps := []maps.Map{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name":        "阿里云DNS",
 | 
								"name":        "阿里云DNS",
 | 
				
			||||||
			"code":        ProviderTypeAliDNS,
 | 
								"code":        ProviderTypeAliDNS,
 | 
				
			||||||
 | 
								"description": "阿里云提供的DNS服务。",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name":        "DNSPod",
 | 
								"name":        "DNSPod",
 | 
				
			||||||
			"code":        ProviderTypeDNSPod,
 | 
								"code":        ProviderTypeDNSPod,
 | 
				
			||||||
 | 
								"description": "DNSPod提供的DNS服务。",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		/**{
 | 
							/**{
 | 
				
			||||||
			"name": "帝恩思DNS.COM",
 | 
								"name": "帝恩思DNS.COM",
 | 
				
			||||||
			"code": ProviderTypeDNSCom,
 | 
								"code": ProviderTypeDNSCom,
 | 
				
			||||||
 | 
								"description": "DNS.com提供的DNS服务。",
 | 
				
			||||||
		},**/
 | 
							},**/
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name":        "CloudFlare DNS",
 | 
								"name":        "CloudFlare DNS",
 | 
				
			||||||
			"code":        ProviderTypeCloudFlare,
 | 
								"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",
 | 
							"name":        "自定义HTTP DNS",
 | 
				
			||||||
		"code":        ProviderTypeCustomHTTP,
 | 
							"code":        ProviderTypeCustomHTTP,
 | 
				
			||||||
	},
 | 
							"description": "通过自定义的HTTP接口提供DNS服务。",
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return typeMaps
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FindProvider 查找服务商实例
 | 
					// FindProvider 查找服务商实例
 | 
				
			||||||
@@ -46,6 +76,10 @@ func FindProvider(providerType ProviderType) ProviderInterface {
 | 
				
			|||||||
		return &AliDNSProvider{}
 | 
							return &AliDNSProvider{}
 | 
				
			||||||
	case ProviderTypeCloudFlare:
 | 
						case ProviderTypeCloudFlare:
 | 
				
			||||||
		return &CloudFlareProvider{}
 | 
							return &CloudFlareProvider{}
 | 
				
			||||||
 | 
						case ProviderTypeLocalEdgeDNS:
 | 
				
			||||||
 | 
							return &LocalEdgeDNSProvider{}
 | 
				
			||||||
 | 
						case ProviderTypeUserEdgeDNS:
 | 
				
			||||||
 | 
							return &UserEdgeDNSProvider{}
 | 
				
			||||||
	case ProviderTypeCustomHTTP:
 | 
						case ProviderTypeCustomHTTP:
 | 
				
			||||||
		return &CustomHTTPProvider{}
 | 
							return &CustomHTTPProvider{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -54,7 +88,7 @@ func FindProvider(providerType ProviderType) ProviderInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindProviderTypeName 查找服务商名称
 | 
					// FindProviderTypeName 查找服务商名称
 | 
				
			||||||
func FindProviderTypeName(providerType ProviderType) string {
 | 
					func FindProviderTypeName(providerType ProviderType) string {
 | 
				
			||||||
	for _, t := range AllProviderTypes {
 | 
						for _, t := range FindAllProviderTypes() {
 | 
				
			||||||
		if t.GetString("code") == providerType {
 | 
							if t.GetString("code") == providerType {
 | 
				
			||||||
			return t.GetString("name")
 | 
								return t.GetString("name")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,7 @@ func (this *NSRecordService) ListEnabledNSRecords(ctx context.Context, req *pb.L
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						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 {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
 | 
						"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) {
 | 
					func (this *DNSDomainService) convertDomainToPB(domain *dns.DNSDomain) (*pb.DNSDomain, error) {
 | 
				
			||||||
	domainId := int64(domain.Id)
 | 
						domainId := int64(domain.Id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	records := []*dnsclients.Record{}
 | 
						records := []*dnstypes.Record{}
 | 
				
			||||||
	if len(domain.Records) > 0 && domain.Records != "null" {
 | 
						if len(domain.Records) > 0 && domain.Records != "null" {
 | 
				
			||||||
		err := json.Unmarshal([]byte(domain.Records), &records)
 | 
							err := json.Unmarshal([]byte(domain.Records), &records)
 | 
				
			||||||
		if err != nil {
 | 
							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{
 | 
						return &pb.DNSRecord{
 | 
				
			||||||
		Id:    record.Id,
 | 
							Id:    record.Id,
 | 
				
			||||||
		Name:  record.Name,
 | 
							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)
 | 
						clusterId := int64(cluster.Id)
 | 
				
			||||||
	clusterDnsName := cluster.DnsName
 | 
						clusterDnsName := cluster.DnsName
 | 
				
			||||||
	clusterDomain := clusterDnsName + "." + domainName
 | 
						clusterDomain := clusterDnsName + "." + domainName
 | 
				
			||||||
@@ -400,10 +401,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
 | 
				
			|||||||
		return nil, nil, nil, 0, 0, false, false, err
 | 
							return nil, nil, nil, 0, 0, false, false, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	countAllNodes = int64(len(nodes))
 | 
						countAllNodes = int64(len(nodes))
 | 
				
			||||||
	nodeRecords := []*dnsclients.Record{}                // 之所以用数组再存一遍,是因为dnsName可能会重复
 | 
						nodeRecords := []*dnstypes.Record{}                // 之所以用数组再存一遍,是因为dnsName可能会重复
 | 
				
			||||||
	nodeRecordMapping := map[string]*dnsclients.Record{} // value_route => *Record
 | 
						nodeRecordMapping := map[string]*dnstypes.Record{} // value_route => *Record
 | 
				
			||||||
	for _, record := range records {
 | 
						for _, record := range records {
 | 
				
			||||||
		if record.Type == dnsclients.RecordTypeA && record.Name == clusterDnsName {
 | 
							if record.Type == dnstypes.RecordTypeA && record.Name == clusterDnsName {
 | 
				
			||||||
			nodeRecords = append(nodeRecords, record)
 | 
								nodeRecords = append(nodeRecords, record)
 | 
				
			||||||
			nodeRecordMapping[record.Value+"_"+record.Route] = record
 | 
								nodeRecordMapping[record.Value+"_"+record.Route] = record
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -441,10 +442,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
 | 
				
			|||||||
				if !ok {
 | 
									if !ok {
 | 
				
			||||||
					result = append(result, maps.Map{
 | 
										result = append(result, maps.Map{
 | 
				
			||||||
						"action": "create",
 | 
											"action": "create",
 | 
				
			||||||
						"record": &dnsclients.Record{
 | 
											"record": &dnstypes.Record{
 | 
				
			||||||
							Id:    "",
 | 
												Id:    "",
 | 
				
			||||||
							Name:  clusterDnsName,
 | 
												Name:  clusterDnsName,
 | 
				
			||||||
							Type:  dnsclients.RecordTypeA,
 | 
												Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
							Value: ip,
 | 
												Value: ip,
 | 
				
			||||||
							Route: route,
 | 
												Route: route,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
@@ -475,10 +476,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
 | 
				
			|||||||
		return nil, nil, nil, 0, 0, false, false, err
 | 
							return nil, nil, nil, 0, 0, false, false, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	countAllServers = int64(len(servers))
 | 
						countAllServers = int64(len(servers))
 | 
				
			||||||
	serverRecords := []*dnsclients.Record{}             // 之所以用数组再存一遍,是因为dnsName可能会重复
 | 
						serverRecords := []*dnstypes.Record{}             // 之所以用数组再存一遍,是因为dnsName可能会重复
 | 
				
			||||||
	serverRecordsMap := map[string]*dnsclients.Record{} // dnsName => *Record
 | 
						serverRecordsMap := map[string]*dnstypes.Record{} // dnsName => *Record
 | 
				
			||||||
	for _, record := range records {
 | 
						for _, record := range records {
 | 
				
			||||||
		if record.Type == dnsclients.RecordTypeCName && record.Value == clusterDomain+"." {
 | 
							if record.Type == dnstypes.RecordTypeCNAME && record.Value == clusterDomain+"." {
 | 
				
			||||||
			serverRecords = append(serverRecords, record)
 | 
								serverRecords = append(serverRecords, record)
 | 
				
			||||||
			serverRecordsMap[record.Name] = record
 | 
								serverRecordsMap[record.Name] = record
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -497,10 +498,10 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
 | 
				
			|||||||
			serversChanged = true
 | 
								serversChanged = true
 | 
				
			||||||
			result = append(result, maps.Map{
 | 
								result = append(result, maps.Map{
 | 
				
			||||||
				"action": "create",
 | 
									"action": "create",
 | 
				
			||||||
				"record": &dnsclients.Record{
 | 
									"record": &dnstypes.Record{
 | 
				
			||||||
					Id:    "",
 | 
										Id:    "",
 | 
				
			||||||
					Name:  dnsName,
 | 
										Name:  dnsName,
 | 
				
			||||||
					Type:  dnsclients.RecordTypeCName,
 | 
										Type:  dnstypes.RecordTypeCNAME,
 | 
				
			||||||
					Value: clusterDomain + ".",
 | 
										Value: clusterDomain + ".",
 | 
				
			||||||
					Route: "", // 注意这里为空,需要在执行过程中获取默认值
 | 
										Route: "", // 注意这里为空,需要在执行过程中获取默认值
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
@@ -645,7 +646,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, change := range allChanges {
 | 
						for _, change := range allChanges {
 | 
				
			||||||
		action := change.GetString("action")
 | 
							action := change.GetString("action")
 | 
				
			||||||
		record := change.Get("record").(*dnsclients.Record)
 | 
							record := change.Get("record").(*dnstypes.Record)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(record.Route) == 0 {
 | 
							if len(record.Route) == 0 {
 | 
				
			||||||
			record.Route = manager.DefaultRoute()
 | 
								record.Route = manager.DefaultRoute()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,12 +8,12 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DNS服务商相关服务
 | 
					// DNSProviderService DNS服务商相关服务
 | 
				
			||||||
type DNSProviderService struct {
 | 
					type DNSProviderService struct {
 | 
				
			||||||
	BaseService
 | 
						BaseService
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建服务商
 | 
					// CreateDNSProvider 创建服务商
 | 
				
			||||||
func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.CreateDNSProviderRequest) (*pb.CreateDNSProviderResponse, error) {
 | 
					func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.CreateDNSProviderRequest) (*pb.CreateDNSProviderResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	adminId, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
 | 
						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
 | 
						return &pb.CreateDNSProviderResponse{DnsProviderId: providerId}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改服务商
 | 
					// UpdateDNSProvider 修改服务商
 | 
				
			||||||
func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.UpdateDNSProviderRequest) (*pb.RPCSuccess, error) {
 | 
					func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.UpdateDNSProviderRequest) (*pb.RPCSuccess, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := this.ValidateAdminAndUser(ctx, 0, 0)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx, 0, 0)
 | 
				
			||||||
@@ -50,7 +50,7 @@ func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.U
 | 
				
			|||||||
	return this.Success()
 | 
						return this.Success()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 计算服务商数量
 | 
					// CountAllEnabledDNSProviders 计算服务商数量
 | 
				
			||||||
func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context, req *pb.CountAllEnabledDNSProvidersRequest) (*pb.RPCCountResponse, error) {
 | 
					func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context, req *pb.CountAllEnabledDNSProvidersRequest) (*pb.RPCCountResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId)
 | 
				
			||||||
@@ -67,7 +67,7 @@ func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context,
 | 
				
			|||||||
	return this.SuccessCount(count)
 | 
						return this.SuccessCount(count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 列出单页服务商信息
 | 
					// ListEnabledDNSProviders 列出单页服务商信息
 | 
				
			||||||
func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req *pb.ListEnabledDNSProvidersRequest) (*pb.ListEnabledDNSProvidersResponse, error) {
 | 
					func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req *pb.ListEnabledDNSProvidersRequest) (*pb.ListEnabledDNSProvidersResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId)
 | 
						_, _, 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
 | 
						return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找所有的DNS服务商
 | 
					// FindAllEnabledDNSProviders 查找所有的DNS服务商
 | 
				
			||||||
func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context, req *pb.FindAllEnabledDNSProvidersRequest) (*pb.FindAllEnabledDNSProvidersResponse, error) {
 | 
					func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context, req *pb.FindAllEnabledDNSProvidersRequest) (*pb.FindAllEnabledDNSProvidersResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId)
 | 
				
			||||||
@@ -127,7 +127,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context,
 | 
				
			|||||||
	return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil
 | 
						return &pb.FindAllEnabledDNSProvidersResponse{DnsProviders: result}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 删除服务商
 | 
					// DeleteDNSProvider 删除服务商
 | 
				
			||||||
func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.DeleteDNSProviderRequest) (*pb.RPCSuccess, error) {
 | 
					func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.DeleteDNSProviderRequest) (*pb.RPCSuccess, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := this.ValidateAdminAndUser(ctx, 0, 0)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx, 0, 0)
 | 
				
			||||||
@@ -146,7 +146,7 @@ func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.D
 | 
				
			|||||||
	return this.Success()
 | 
						return this.Success()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找单个服务商
 | 
					// FindEnabledDNSProvider 查找单个服务商
 | 
				
			||||||
func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req *pb.FindEnabledDNSProviderRequest) (*pb.FindEnabledDNSProviderResponse, error) {
 | 
					func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req *pb.FindEnabledDNSProviderRequest) (*pb.FindEnabledDNSProviderResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
@@ -174,7 +174,7 @@ func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req
 | 
				
			|||||||
	}}, nil
 | 
						}}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 取得所有服务商类型
 | 
					// FindAllDNSProviderTypes 取得所有服务商类型
 | 
				
			||||||
func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req *pb.FindAllDNSProviderTypesRequest) (*pb.FindAllDNSProviderTypesResponse, error) {
 | 
					func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req *pb.FindAllDNSProviderTypesRequest) (*pb.FindAllDNSProviderTypesResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
@@ -183,16 +183,17 @@ func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result := []*pb.DNSProviderType{}
 | 
						result := []*pb.DNSProviderType{}
 | 
				
			||||||
	for _, t := range dnsclients.AllProviderTypes {
 | 
						for _, t := range dnsclients.FindAllProviderTypes() {
 | 
				
			||||||
		result = append(result, &pb.DNSProviderType{
 | 
							result = append(result, &pb.DNSProviderType{
 | 
				
			||||||
			Name:        t.GetString("name"),
 | 
								Name:        t.GetString("name"),
 | 
				
			||||||
			Code:        t.GetString("code"),
 | 
								Code:        t.GetString("code"),
 | 
				
			||||||
 | 
								Description: t.GetString("description"),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &pb.FindAllDNSProviderTypesResponse{ProviderTypes: result}, nil
 | 
						return &pb.FindAllDNSProviderTypesResponse{ProviderTypes: result}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 取得某个类型的所有服务商
 | 
					// FindAllEnabledDNSProvidersWithType 取得某个类型的所有服务商
 | 
				
			||||||
func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.Context, req *pb.FindAllEnabledDNSProvidersWithTypeRequest) (*pb.FindAllEnabledDNSProvidersWithTypeResponse, error) {
 | 
					func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.Context, req *pb.FindAllEnabledDNSProvidersWithTypeRequest) (*pb.FindAllEnabledDNSProvidersWithTypeResponse, error) {
 | 
				
			||||||
	// 校验请求
 | 
						// 校验请求
 | 
				
			||||||
	_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
 | 
						"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/errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/installers"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/installers"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						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)
 | 
						dnsDomainId := int64(0)
 | 
				
			||||||
	domainRoutes := []*dnsclients.Route{}
 | 
						domainRoutes := []*dnstypes.Route{}
 | 
				
			||||||
	if clusterDNS != nil {
 | 
						if clusterDNS != nil {
 | 
				
			||||||
		dnsDomainId = int64(clusterDNS.DnsDomainId)
 | 
							dnsDomainId = int64(clusterDNS.DnsDomainId)
 | 
				
			||||||
		if clusterDNS.DnsDomainId > 0 {
 | 
							if clusterDNS.DnsDomainId > 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	dnsmodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
 | 
						dnsmodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
@@ -135,7 +136,7 @@ func (this *DNSTaskExecutor) doServer(taskId int64, serverId int64) error {
 | 
				
			|||||||
	recordName := serverDNS.DnsName
 | 
						recordName := serverDNS.DnsName
 | 
				
			||||||
	recordValue := clusterDNSName + "." + domain + "."
 | 
						recordValue := clusterDNSName + "." + domain + "."
 | 
				
			||||||
	recordRoute := manager.DefaultRoute()
 | 
						recordRoute := manager.DefaultRoute()
 | 
				
			||||||
	recordType := dnsclients.RecordTypeCName
 | 
						recordType := dnstypes.RecordTypeCNAME
 | 
				
			||||||
	if serverDNS.State == models.ServerStateDisabled || serverDNS.IsOn == 0 {
 | 
						if serverDNS.State == models.ServerStateDisabled || serverDNS.IsOn == 0 {
 | 
				
			||||||
		// 检查记录是否已经存在
 | 
							// 检查记录是否已经存在
 | 
				
			||||||
		record, err := manager.QueryRecord(domain, recordName, recordType)
 | 
							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:    "",
 | 
								Id:    "",
 | 
				
			||||||
			Name:  recordName,
 | 
								Name:  recordName,
 | 
				
			||||||
			Type:  recordType,
 | 
								Type:  recordType,
 | 
				
			||||||
@@ -275,9 +276,9 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	oldRecordsMap := map[string]*dnsclients.Record{} // route@value => record
 | 
						oldRecordsMap := map[string]*dnstypes.Record{} // route@value => record
 | 
				
			||||||
	for _, record := range records {
 | 
						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
 | 
								key := record.Route + "@" + record.Value
 | 
				
			||||||
			oldRecordsMap[key] = record
 | 
								oldRecordsMap[key] = record
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -323,10 +324,10 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error {
 | 
				
			|||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				err = manager.AddRecord(domain, &dnsclients.Record{
 | 
									err = manager.AddRecord(domain, &dnstypes.Record{
 | 
				
			||||||
					Id:    "",
 | 
										Id:    "",
 | 
				
			||||||
					Name:  clusterDNSName,
 | 
										Name:  clusterDNSName,
 | 
				
			||||||
					Type:  dnsclients.RecordTypeA,
 | 
										Type:  dnstypes.RecordTypeA,
 | 
				
			||||||
					Value: ip,
 | 
										Value: ip,
 | 
				
			||||||
					Route: route,
 | 
										Route: route,
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user