实现在域名解析中使用EdgeDNS

This commit is contained in:
GoEdgeLab
2021-06-02 18:13:48 +08:00
parent ed33d243a0
commit 3131343056
28 changed files with 731 additions and 174 deletions

View File

@@ -1,10 +1,10 @@
package dnsclients
package dnstypes
type RecordType = string
const (
RecordTypeA RecordType = "A"
RecordTypeCName RecordType = "CNAME"
RecordTypeCNAME RecordType = "CNAME"
RecordTypeTXT RecordType = "TXT"
)

View File

@@ -1,4 +1,4 @@
package dnsclients
package dnstypes
// Route 线路描述
type Route struct {

View File

@@ -2,6 +2,7 @@ package dnsclients
import (
"errors"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
@@ -31,7 +32,7 @@ func (this *AliDNSProvider) Auth(params maps.Map) error {
}
// GetRecords 获取域名列表
func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err error) {
func (this *AliDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
pageNumber := 1
size := 100
@@ -48,11 +49,11 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er
}
for _, record := range resp.DomainRecords.Record {
// 修正Record
if record.Type == RecordTypeCName && !strings.HasSuffix(record.Value, ".") {
if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Value, ".") {
record.Value += "."
}
records = append(records, &Record{
records = append(records, &dnstypes.Record{
Id: record.RecordId,
Name: record.RR,
Type: record.Type,
@@ -71,7 +72,7 @@ func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err er
}
// GetRoutes 读取域名支持的线路数据
func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error) {
func (this *AliDNSProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
req := alidns.CreateDescribeSupportLinesRequest()
req.DomainName = domain
@@ -81,7 +82,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error
return nil, err
}
for _, line := range resp.RecordLines.RecordLine {
routes = append(routes, &Route{
routes = append(routes, &dnstypes.Route{
Name: line.LineName,
Code: line.LineCode,
})
@@ -90,7 +91,7 @@ func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error
}
// QueryRecord 查询单个记录
func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) {
func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) {
records, err := this.GetRecords(domain)
if err != nil {
return nil, err
@@ -104,7 +105,7 @@ func (this *AliDNSProvider) QueryRecord(domain string, name string, recordType R
}
// AddRecord 设置记录
func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error {
func (this *AliDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
req := alidns.CreateAddDomainRecordRequest()
req.RR = newRecord.Name
req.Type = newRecord.Type
@@ -125,7 +126,7 @@ func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error {
}
// UpdateRecord 修改记录
func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error {
func (this *AliDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error {
req := alidns.CreateUpdateDomainRecordRequest()
req.RecordId = record.Id
req.RR = newRecord.Name
@@ -139,7 +140,7 @@ func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecor
}
// DeleteRecord 删除记录
func (this *AliDNSProvider) DeleteRecord(domain string, record *Record) error {
func (this *AliDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
req := alidns.CreateDeleteDomainRecordRequest()
req.RecordId = record.Id

View File

@@ -2,6 +2,7 @@ package dnsclients
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
_ "github.com/go-sql-driver/mysql"
_ "github.com/iwind/TeaGo/bootstrap"
"github.com/iwind/TeaGo/dbs"
@@ -29,7 +30,7 @@ func TestAliDNSProvider_DeleteRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.DeleteRecord("meloy.cn", &Record{
err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{
Id: "20746603318032384",
})
if err != nil {
@@ -57,10 +58,10 @@ func TestAliDNSProvider_AddRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.AddRecord("meloy.cn", &Record{
err = provider.AddRecord("meloy.cn", &dnstypes.Record{
Id: "",
Name: "test",
Type: RecordTypeA,
Type: dnstypes.RecordTypeA,
Value: "192.168.1.100",
Route: "unicom",
})
@@ -76,10 +77,10 @@ func TestAliDNSProvider_UpdateRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.UpdateRecord("meloy.cn", &Record{Id: "20746664455255040"}, &Record{
err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "20746664455255040"}, &dnstypes.Record{
Id: "",
Name: "test",
Type: RecordTypeA,
Type: dnstypes.RecordTypeA,
Value: "192.168.1.101",
Route: "unicom",
})

View File

@@ -7,6 +7,7 @@ import (
"crypto/tls"
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/cloudflare"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/iwind/TeaGo/maps"
"io"
@@ -59,7 +60,7 @@ func (this *CloudFlareProvider) Auth(params maps.Map) error {
}
// GetRecords 获取域名解析记录列表
func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, err error) {
func (this *CloudFlareProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
zoneId, err := this.findZoneIdWithDomain(domain)
if err != nil {
return nil, err
@@ -81,13 +82,13 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er
for _, record := range resp.Result {
// 修正Record
if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") {
if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") {
record.Content += "."
}
record.Name = strings.TrimSuffix(record.Name, "."+domain)
records = append(records, &Record{
records = append(records, &dnstypes.Record{
Id: record.Id,
Name: record.Name,
Type: record.Type,
@@ -101,15 +102,15 @@ func (this *CloudFlareProvider) GetRecords(domain string) (records []*Record, er
}
// GetRoutes 读取域名支持的线路数据
func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*Route, err error) {
routes = []*Route{
func (this *CloudFlareProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
routes = []*dnstypes.Route{
{Name: "默认", Code: CloudFlareDefaultRoute},
}
return
}
// QueryRecord 查询单个记录
func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) {
func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) {
zoneId, err := this.findZoneIdWithDomain(domain)
if err != nil {
return nil, err
@@ -131,13 +132,13 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy
record := resp.Result[0]
// 修正Record
if record.Type == RecordTypeCName && !strings.HasSuffix(record.Content, ".") {
if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Content, ".") {
record.Content += "."
}
record.Name = strings.TrimSuffix(record.Name, "."+domain)
return &Record{
return &dnstypes.Record{
Id: record.Id,
Name: record.Name,
Type: record.Type,
@@ -147,7 +148,7 @@ func (this *CloudFlareProvider) QueryRecord(domain string, name string, recordTy
}
// AddRecord 设置记录
func (this *CloudFlareProvider) AddRecord(domain string, newRecord *Record) error {
func (this *CloudFlareProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
zoneId, err := this.findZoneIdWithDomain(domain)
if err != nil {
return err
@@ -167,7 +168,7 @@ func (this *CloudFlareProvider) AddRecord(domain string, newRecord *Record) erro
}
// UpdateRecord 修改记录
func (this *CloudFlareProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error {
func (this *CloudFlareProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error {
zoneId, err := this.findZoneIdWithDomain(domain)
if err != nil {
return err
@@ -183,7 +184,7 @@ func (this *CloudFlareProvider) UpdateRecord(domain string, record *Record, newR
}
// DeleteRecord 删除记录
func (this *CloudFlareProvider) DeleteRecord(domain string, record *Record) error {
func (this *CloudFlareProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
zoneId, err := this.findZoneIdWithDomain(domain)
if err != nil {
return err

View File

@@ -4,6 +4,7 @@ package dnsclients
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/logs"
@@ -45,7 +46,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
}
{
t.Log("== www.meloy.cn/A ==")
record, err := provider.QueryRecord("meloy.cn", "www", RecordTypeA)
record, err := provider.QueryRecord("meloy.cn", "www", dnstypes.RecordTypeA)
if err != nil {
t.Fatal(err)
}
@@ -53,7 +54,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
}
{
t.Log("== www.meloy.cn/CNAME ==")
record, err := provider.QueryRecord("meloy.cn", "www", RecordTypeCName)
record, err := provider.QueryRecord("meloy.cn", "www", dnstypes.RecordTypeCNAME)
if err != nil {
t.Fatal(err)
}
@@ -61,7 +62,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
}
{
t.Log("== hello.meloy.cn ==")
record, err := provider.QueryRecord("meloy.cn", "hello", RecordTypeA)
record, err := provider.QueryRecord("meloy.cn", "hello", dnstypes.RecordTypeA)
if err != nil {
t.Fatal(err)
}
@@ -69,7 +70,7 @@ func TestCloudFlareProvider_QueryRecord(t *testing.T) {
}
{
t.Log("== test.meloy.cn ==")
record, err := provider.QueryRecord("meloy.cn", "test", RecordTypeCName)
record, err := provider.QueryRecord("meloy.cn", "test", dnstypes.RecordTypeCNAME)
if err != nil {
t.Fatal(err)
}
@@ -83,10 +84,10 @@ func TestCloudFlareProvider_AddRecord(t *testing.T) {
t.Fatal(err)
}
{
err = provider.AddRecord("meloy.cn", &Record{
err = provider.AddRecord("meloy.cn", &dnstypes.Record{
Id: "",
Name: "test",
Type: RecordTypeA,
Type: dnstypes.RecordTypeA,
Value: "182.92.212.46",
Route: "",
})
@@ -95,10 +96,10 @@ func TestCloudFlareProvider_AddRecord(t *testing.T) {
}
}
{
err = provider.AddRecord("meloy.cn", &Record{
err = provider.AddRecord("meloy.cn", &dnstypes.Record{
Id: "",
Name: "test1",
Type: RecordTypeCName,
Type: dnstypes.RecordTypeCNAME,
Value: "cdn.meloy.cn.",
Route: "",
})
@@ -114,10 +115,10 @@ func TestCloudFlareProvider_UpdateRecord(t *testing.T) {
if err != nil {
t.Fatal(err)
}
err = provider.UpdateRecord("meloy.cn", &Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &Record{
err = provider.UpdateRecord("meloy.cn", &dnstypes.Record{Id: "b4da7ad9f90173ec37c80ba6bb70641a"}, &dnstypes.Record{
Id: "",
Name: "test1",
Type: RecordTypeCName,
Type: dnstypes.RecordTypeCNAME,
Value: "cdn123.meloy.cn.",
Route: "",
})
@@ -132,7 +133,7 @@ func TestCloudFlareProvider_DeleteRecord(t *testing.T) {
if err != nil {
t.Fatal(err)
}
err = provider.DeleteRecord("meloy.cn", &Record{
err = provider.DeleteRecord("meloy.cn", &dnstypes.Record{
Id: "86282d89bbd1f66a69ca409da84f34b1",
})
if err != nil {

View File

@@ -7,6 +7,7 @@ import (
"encoding/json"
"fmt"
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/iwind/TeaGo/maps"
"io/ioutil"
@@ -49,7 +50,7 @@ func (this *CustomHTTPProvider) Auth(params maps.Map) error {
}
// GetRecords 获取域名解析记录列表
func (this *CustomHTTPProvider) GetRecords(domain string) (records []*Record, err error) {
func (this *CustomHTTPProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
resp, err := this.post(maps.Map{
"action": "GetRecords",
"domain": domain,
@@ -62,7 +63,7 @@ func (this *CustomHTTPProvider) GetRecords(domain string) (records []*Record, er
}
// GetRoutes 读取域名支持的线路数据
func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*Route, err error) {
func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
resp, err := this.post(maps.Map{
"action": "GetRoutes",
"domain": domain,
@@ -75,7 +76,7 @@ func (this *CustomHTTPProvider) GetRoutes(domain string) (routes []*Route, err e
}
// QueryRecord 查询单个记录
func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) {
func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) {
resp, err := this.post(maps.Map{
"action": "QueryRecord",
"domain": domain,
@@ -88,7 +89,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy
if len(resp) == 0 {
return nil, nil
}
record := &Record{}
record := &dnstypes.Record{}
err = json.Unmarshal(resp, record)
if err != nil {
return nil, err
@@ -100,7 +101,7 @@ func (this *CustomHTTPProvider) QueryRecord(domain string, name string, recordTy
}
// AddRecord 设置记录
func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *Record) error {
func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
_, err := this.post(maps.Map{
"action": "AddRecord",
"domain": domain,
@@ -110,7 +111,7 @@ func (this *CustomHTTPProvider) AddRecord(domain string, newRecord *Record) erro
}
// UpdateRecord 修改记录
func (this *CustomHTTPProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error {
func (this *CustomHTTPProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error {
_, err := this.post(maps.Map{
"action": "UpdateRecord",
"domain": domain,
@@ -121,7 +122,7 @@ func (this *CustomHTTPProvider) UpdateRecord(domain string, record *Record, newR
}
// DeleteRecord 删除记录
func (this *CustomHTTPProvider) DeleteRecord(domain string, record *Record) error {
func (this *CustomHTTPProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
_, err := this.post(maps.Map{
"action": "DeleteRecord",
"domain": domain,

View File

@@ -1,6 +1,7 @@
package dnsclients
import (
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
"testing"
@@ -15,10 +16,10 @@ func TestCustomHTTPProvider_AddRecord(t *testing.T) {
if err != nil {
t.Fatal(err)
}
err = provider.AddRecord("hello.com", &Record{
err = provider.AddRecord("hello.com", &dnstypes.Record{
Id: "",
Name: "world",
Type: RecordTypeA,
Type: dnstypes.RecordTypeA,
Value: "127.0.0.1",
Route: "default",
})

View File

@@ -3,6 +3,7 @@ package dnsclients
import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
@@ -35,7 +36,7 @@ func (this *DNSPodProvider) Auth(params maps.Map) error {
}
// GetRecords 获取域名列表
func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err error) {
func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
offset := 0
size := 100
for {
@@ -53,7 +54,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er
recordSlice := recordsResp.GetSlice("records")
for _, record := range recordSlice {
recordMap := maps.NewMap(record)
records = append(records, &Record{
records = append(records, &dnstypes.Record{
Id: recordMap.GetString("id"),
Name: recordMap.GetString("name"),
Type: recordMap.GetString("type"),
@@ -73,7 +74,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er
}
// GetRoutes 读取线路数据
func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error) {
func (this *DNSPodProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
infoResp, err := this.post("/Domain.info", map[string]string{
"domain": domain,
})
@@ -97,7 +98,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error
}
for _, line := range lines {
lineString := types.String(line)
routes = append(routes, &Route{
routes = append(routes, &dnstypes.Route{
Name: lineString,
Code: lineString,
})
@@ -107,7 +108,7 @@ func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error
}
// QueryRecord 查询单个记录
func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType RecordType) (*Record, error) {
func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error) {
records, err := this.GetRecords(domain)
if err != nil {
return nil, err
@@ -121,13 +122,13 @@ func (this *DNSPodProvider) QueryRecord(domain string, name string, recordType R
}
// AddRecord 设置记录
func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error {
func (this *DNSPodProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
if newRecord == nil {
return errors.New("invalid new record")
}
// 在CHANGE记录后面加入点
if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") {
if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") {
newRecord.Value += "."
}
_, err := this.post("/Record.Create", map[string]string{
@@ -141,7 +142,7 @@ func (this *DNSPodProvider) AddRecord(domain string, newRecord *Record) error {
}
// UpdateRecord 修改记录
func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error {
func (this *DNSPodProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error {
if record == nil {
return errors.New("invalid record")
}
@@ -150,7 +151,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor
}
// 在CHANGE记录后面加入点
if newRecord.Type == RecordTypeCName && !strings.HasSuffix(newRecord.Value, ".") {
if newRecord.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(newRecord.Value, ".") {
newRecord.Value += "."
}
_, err := this.post("/Record.Modify", map[string]string{
@@ -165,7 +166,7 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *Record, newRecor
}
// DeleteRecord 删除记录
func (this *DNSPodProvider) DeleteRecord(domain string, record *Record) error {
func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
if record == nil {
return errors.New("invalid record to delete")
}

View File

@@ -2,6 +2,7 @@ package dnsclients
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
@@ -40,8 +41,8 @@ func TestDNSPodProvider_AddRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.AddRecord("yun4s.cn", &Record{
Type: RecordTypeCName,
err = provider.AddRecord("yun4s.cn", &dnstypes.Record{
Type: dnstypes.RecordTypeCNAME,
Name: "hello-forward",
Value: "hello.yun4s.cn",
Route: "联通",
@@ -58,10 +59,10 @@ func TestDNSPodProvider_UpdateRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.UpdateRecord("yun4s.cn", &Record{
err = provider.UpdateRecord("yun4s.cn", &dnstypes.Record{
Id: "697036856",
}, &Record{
Type: RecordTypeA,
}, &dnstypes.Record{
Type: dnstypes.RecordTypeA,
Name: "hello",
Value: "192.168.1.102",
Route: "联通",
@@ -78,7 +79,7 @@ func TestDNSPodProvider_DeleteRecord(t *testing.T) {
t.Fatal(err)
}
err = provider.DeleteRecord("yun4s.cn", &Record{
err = provider.DeleteRecord("yun4s.cn", &dnstypes.Record{
Id: "697040986",
})
if err != nil {

View File

@@ -1,6 +1,9 @@
package dnsclients
import "github.com/iwind/TeaGo/maps"
import (
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
"github.com/iwind/TeaGo/maps"
)
// ProviderInterface DNS操作接口
type ProviderInterface interface {
@@ -8,22 +11,22 @@ type ProviderInterface interface {
Auth(params maps.Map) error
// GetRecords 获取域名解析记录列表
GetRecords(domain string) (records []*Record, err error)
GetRecords(domain string) (records []*dnstypes.Record, err error)
// GetRoutes 读取域名支持的线路数据
GetRoutes(domain string) (routes []*Route, err error)
GetRoutes(domain string) (routes []*dnstypes.Route, err error)
// QueryRecord 查询单个记录
QueryRecord(domain string, name string, recordType RecordType) (*Record, error)
QueryRecord(domain string, name string, recordType dnstypes.RecordType) (*dnstypes.Record, error)
// AddRecord 设置记录
AddRecord(domain string, newRecord *Record) error
AddRecord(domain string, newRecord *dnstypes.Record) error
// UpdateRecord 修改记录
UpdateRecord(domain string, record *Record, newRecord *Record) error
UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error
// DeleteRecord 删除记录
DeleteRecord(domain string, record *Record) error
DeleteRecord(domain string, record *dnstypes.Record) error
// DefaultRoute 默认线路
DefaultRoute() string

View 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 ""
}

View 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())
}

View 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 ""
}

View File

@@ -1,40 +1,70 @@
package dnsclients
import "github.com/iwind/TeaGo/maps"
import (
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
"github.com/iwind/TeaGo/maps"
)
type ProviderType = string
// 服务商代号
const (
ProviderTypeDNSPod ProviderType = "dnspod"
ProviderTypeAliDNS ProviderType = "alidns"
ProviderTypeDNSCom ProviderType = "dnscom"
ProviderTypeCloudFlare ProviderType = "cloudFlare"
ProviderTypeCustomHTTP ProviderType = "customHTTP"
ProviderTypeDNSPod ProviderType = "dnspod" // DNSPod
ProviderTypeAliDNS ProviderType = "alidns" // 阿里云DNS
ProviderTypeDNSCom ProviderType = "dnscom" // dns.com
ProviderTypeCloudFlare ProviderType = "cloudFlare" // CloudFlare DNS
ProviderTypeLocalEdgeDNS ProviderType = "localEdgeDNS" // 和当前系统集成的EdgeDNS
ProviderTypeUserEdgeDNS ProviderType = "userEdgeDNS" // 通过API连接的EdgeDNS
ProviderTypeCustomHTTP ProviderType = "customHTTP" // 自定义HTTP接口
)
// AllProviderTypes 所有的服务商类型
var AllProviderTypes = []maps.Map{
{
"name": "阿里云DNS",
"code": ProviderTypeAliDNS,
},
{
"name": "DNSPod",
"code": ProviderTypeDNSPod,
},
/**{
"name": "帝恩思DNS.COM",
"code": ProviderTypeDNSCom,
},**/
{
"name": "CloudFlare DNS",
"code": ProviderTypeCloudFlare,
},
{
"name": "自定义HTTP DNS",
"code": ProviderTypeCustomHTTP,
},
// FindAllProviderTypes 所有的服务商类型
func FindAllProviderTypes() []maps.Map {
typeMaps := []maps.Map{
{
"name": "阿里云DNS",
"code": ProviderTypeAliDNS,
"description": "阿里云提供的DNS服务。",
},
{
"name": "DNSPod",
"code": ProviderTypeDNSPod,
"description": "DNSPod提供的DNS服务。",
},
/**{
"name": "帝恩思DNS.COM",
"code": ProviderTypeDNSCom,
"description": "DNS.com提供的DNS服务。",
},**/
{
"name": "CloudFlare DNS",
"code": ProviderTypeCloudFlare,
"description": "CloudFlare提供的DNS服务。",
},
}
if teaconst.IsPlus {
typeMaps = append(typeMaps, []maps.Map{
{
"name": "集成EdgeDNS",
"code": ProviderTypeLocalEdgeDNS,
"description": "当前企业版提供的DNS服务。",
},
// TODO 需要实现用户使用AccessId/AccessKey来连接DNS服务
/**{
"name": "用户EdgeDNS",
"code": ProviderTypeUserEdgeDNS,
"description": "通过API连接企业版提供的DNS服务。",
},**/
}...)
}
typeMaps = append(typeMaps, maps.Map{
"name": "自定义HTTP DNS",
"code": ProviderTypeCustomHTTP,
"description": "通过自定义的HTTP接口提供DNS服务。",
})
return typeMaps
}
// FindProvider 查找服务商实例
@@ -46,6 +76,10 @@ func FindProvider(providerType ProviderType) ProviderInterface {
return &AliDNSProvider{}
case ProviderTypeCloudFlare:
return &CloudFlareProvider{}
case ProviderTypeLocalEdgeDNS:
return &LocalEdgeDNSProvider{}
case ProviderTypeUserEdgeDNS:
return &UserEdgeDNSProvider{}
case ProviderTypeCustomHTTP:
return &CustomHTTPProvider{}
}
@@ -54,7 +88,7 @@ func FindProvider(providerType ProviderType) ProviderInterface {
// FindProviderTypeName 查找服务商名称
func FindProviderTypeName(providerType ProviderType) string {
for _, t := range AllProviderTypes {
for _, t := range FindAllProviderTypes() {
if t.GetString("code") == providerType {
return t.GetString("name")
}