支持阿里云DNS

This commit is contained in:
刘祥超
2020-11-15 11:57:49 +08:00
parent 2da1ab384c
commit afb414bca3
16 changed files with 500 additions and 41 deletions

View File

@@ -1 +0,0 @@
*_test.go

View File

@@ -0,0 +1,156 @@
package dnsclients
import (
"errors"
"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"
"github.com/iwind/TeaGo/maps"
"strings"
)
// 阿里云服务商
type AliDNSProvider struct {
accessKeyId string
accessKeySecret string
}
// 认证
func (this *AliDNSProvider) Auth(params maps.Map) error {
this.accessKeyId = params.GetString("accessKeyId")
this.accessKeySecret = params.GetString("accessKeySecret")
if len(this.accessKeyId) == 0 {
return errors.New("'accessKeyId' should not be empty")
}
if len(this.accessKeySecret) == 0 {
return errors.New("'accessKeySecret' should not be empty")
}
return nil
}
// 获取域名列表
func (this *AliDNSProvider) GetRecords(domain string) (records []*Record, err error) {
pageNumber := 1
size := 100
for {
req := alidns.CreateDescribeDomainRecordsRequest()
req.DomainName = domain
req.PageNumber = requests.NewInteger(pageNumber)
req.PageSize = requests.NewInteger(size)
resp := alidns.CreateDescribeDomainRecordsResponse()
err = this.doAPI(req, resp)
if err != nil {
return nil, err
}
for _, record := range resp.DomainRecords.Record {
// 修正Record
if record.Type == RecordTypeCName && !strings.HasSuffix(record.Value, ".") {
record.Value += "."
}
records = append(records, &Record{
Id: record.RecordId,
Name: record.RR,
Type: record.Type,
Value: record.Value,
Route: record.Line,
})
}
pageNumber++
if int64((pageNumber-1)*size) >= resp.TotalCount {
break
}
}
return
}
// 读取域名支持的线路数据
func (this *AliDNSProvider) GetRoutes(domain string) (routes []*Route, err error) {
req := alidns.CreateDescribeSupportLinesRequest()
req.DomainName = domain
resp := alidns.CreateDescribeSupportLinesResponse()
err = this.doAPI(req, resp)
if err != nil {
return nil, err
}
for _, line := range resp.RecordLines.RecordLine {
routes = append(routes, &Route{
Name: line.LineName,
Code: line.LineCode,
})
}
return
}
// 设置记录
func (this *AliDNSProvider) AddRecord(domain string, newRecord *Record) error {
req := alidns.CreateAddDomainRecordRequest()
req.RR = newRecord.Name
req.Type = newRecord.Type
req.Value = newRecord.Value
req.DomainName = domain
req.Line = newRecord.Route
resp := alidns.CreateAddDomainRecordResponse()
err := this.doAPI(req, resp)
if err != nil {
return err
}
if resp.IsSuccess() {
return nil
}
return errors.New(resp.GetHttpContentString())
}
// 修改记录
func (this *AliDNSProvider) UpdateRecord(domain string, record *Record, newRecord *Record) error {
req := alidns.CreateUpdateDomainRecordRequest()
req.RecordId = record.Id
req.RR = newRecord.Name
req.Type = newRecord.Type
req.Value = newRecord.Value
req.Line = newRecord.Route
resp := alidns.CreateUpdateDomainRecordResponse()
err := this.doAPI(req, resp)
return err
}
// 删除记录
func (this *AliDNSProvider) DeleteRecord(domain string, record *Record) error {
req := alidns.CreateDeleteDomainRecordRequest()
req.RecordId = record.Id
resp := alidns.CreateDeleteDomainRecordResponse()
err := this.doAPI(req, resp)
return err
}
// 默认线路
func (this *AliDNSProvider) DefaultRoute() string {
return "default"
}
// 执行请求
func (this *AliDNSProvider) doAPI(req requests.AcsRequest, resp responses.AcsResponse) error {
req.SetScheme("https")
client, err := alidns.NewClientWithAccessKey("cn-hangzhou", this.accessKeyId, this.accessKeySecret)
if err != nil {
return err
}
err = client.DoAction(req, resp)
if err != nil {
return err
}
if !resp.IsSuccess() {
return errors.New(resp.GetHttpContentString())
}
return nil
}

View File

@@ -0,0 +1,112 @@
package dnsclients
import (
"encoding/json"
_ "github.com/go-sql-driver/mysql"
_ "github.com/iwind/TeaGo/bootstrap"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
"testing"
)
func TestAliDNSProvider_GetRecords(t *testing.T) {
provider, err := testAliDNSProvider()
if err != nil {
t.Fatal(err)
}
records, err := provider.GetRecords("meloy.cn")
if err != nil {
t.Fatal(err)
}
logs.PrintAsJSON(records, t)
}
func TestAliDNSProvider_DeleteRecord(t *testing.T) {
provider, err := testAliDNSProvider()
if err != nil {
t.Fatal(err)
}
err = provider.DeleteRecord("meloy.cn", &Record{
Id: "20746603318032384",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func TestAliDNSProvider_GetRoutes(t *testing.T) {
provider, err := testAliDNSProvider()
if err != nil {
t.Fatal(err)
}
routes, err := provider.GetRoutes("meloy.cn")
if err != nil {
t.Fatal(err)
}
logs.PrintAsJSON(routes, t)
}
func TestAliDNSProvider_AddRecord(t *testing.T) {
provider, err := testAliDNSProvider()
if err != nil {
t.Fatal(err)
}
err = provider.AddRecord("meloy.cn", &Record{
Id: "",
Name: "test",
Type: RecordTypeA,
Value: "192.168.1.100",
Route: "unicom",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func TestAliDNSProvider_UpdateRecord(t *testing.T) {
provider, err := testAliDNSProvider()
if err != nil {
t.Fatal(err)
}
err = provider.UpdateRecord("meloy.cn", &Record{Id: "20746664455255040"}, &Record{
Id: "",
Name: "test",
Type: RecordTypeA,
Value: "192.168.1.101",
Route: "unicom",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func testAliDNSProvider() (ProviderInterface, error) {
db, err := dbs.Default()
if err != nil {
return nil, err
}
one, err := db.FindOne("SELECT * FROM edgeDNSProviders WHERE type='alidns' ORDER BY id DESC")
if err != nil {
return nil, err
}
apiParams := maps.Map{}
err = json.Unmarshal([]byte(one.GetString("apiParams")), &apiParams)
if err != nil {
return nil, err
}
provider := &AliDNSProvider{}
err = provider.Auth(apiParams)
if err != nil {
return nil, err
}
return provider, nil
}

View File

@@ -12,6 +12,7 @@ import (
"strings"
)
// DNSPod服务商
type DNSPodProvider struct {
apiId string
apiToken string
@@ -70,7 +71,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*Record, err er
}
// 读取线路数据
func (this *DNSPodProvider) GetRoutes(domain string) ([]string, error) {
func (this *DNSPodProvider) GetRoutes(domain string) (routes []*Route, err error) {
infoResp, err := this.post("/Domain.info", map[string]string{
"domain": domain,
})
@@ -92,12 +93,15 @@ func (this *DNSPodProvider) GetRoutes(domain string) ([]string, error) {
if len(lines) == 0 {
return nil, nil
}
lineStrings := []string{}
for _, line := range lines {
lineStrings = append(lineStrings, types.String(line))
lineString := types.String(line)
routes = append(routes, &Route{
Name: lineString,
Code: lineString,
})
}
return lineStrings, nil
return routes, nil
}
// 设置记录

View File

@@ -0,0 +1,110 @@
package dnsclients
import (
"encoding/json"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
"testing"
)
func TestDNSPodProvider_GetRoutes(t *testing.T) {
provider, err := testDNSPodProvider()
if err != nil {
t.Fatal(err)
}
routes, err := provider.GetRoutes("yun4s.cn")
if err != nil {
t.Fatal(err)
}
logs.PrintAsJSON(routes, t)
}
func TestDNSPodProvider_GetRecords(t *testing.T) {
provider, err := testDNSPodProvider()
if err != nil {
t.Fatal(err)
}
records, err := provider.GetRecords("yun4s.cn")
if err != nil {
t.Fatal(err)
}
for _, record := range records {
t.Log(record.Id, record.Type, record.Name, record.Value, record.Route)
}
}
func TestDNSPodProvider_AddRecord(t *testing.T) {
provider, err := testDNSPodProvider()
if err != nil {
t.Fatal(err)
}
err = provider.AddRecord("yun4s.cn", &Record{
Type: RecordTypeCName,
Name: "hello-forward",
Value: "hello.yun4s.cn",
Route: "联通",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func TestDNSPodProvider_UpdateRecord(t *testing.T) {
provider, err := testDNSPodProvider()
if err != nil {
t.Fatal(err)
}
err = provider.UpdateRecord("yun4s.cn", &Record{
Id: "697036856",
}, &Record{
Type: RecordTypeA,
Name: "hello",
Value: "192.168.1.102",
Route: "联通",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func TestDNSPodProvider_DeleteRecord(t *testing.T) {
provider, err := testDNSPodProvider()
if err != nil {
t.Fatal(err)
}
err = provider.DeleteRecord("yun4s.cn", &Record{
Id: "697040986",
})
if err != nil {
t.Fatal(err)
}
t.Log("ok")
}
func testDNSPodProvider() (ProviderInterface, error) {
db, err := dbs.Default()
if err != nil {
return nil, err
}
one, err := db.FindOne("SELECT * FROM edgeDNSProviders WHERE type='dnspod' ORDER BY id DESC")
if err != nil {
return nil, err
}
apiParams := maps.Map{}
err = json.Unmarshal([]byte(one.GetString("apiParams")), &apiParams)
if err != nil {
return nil, err
}
provider := &DNSPodProvider{}
err = provider.Auth(apiParams)
if err != nil {
return nil, err
}
return provider, nil
}

View File

@@ -11,7 +11,7 @@ type ProviderInterface interface {
GetRecords(domain string) (records []*Record, err error)
// 读取域名支持的线路数据
GetRoutes(domain string) (routes []string, err error)
GetRoutes(domain string) (routes []*Route, err error)
// 设置记录
AddRecord(domain string, newRecord *Record) error

View File

@@ -5,7 +5,7 @@ type RecordType = string
const (
RecordTypeA RecordType = "A"
RecordTypeCName RecordType = "CNAME"
RecordTypeText RecordType = "TXT"
RecordTypeTXT RecordType = "TXT"
)
type Record struct {

View File

@@ -0,0 +1,7 @@
package dnsclients
// 线路描述
type Route struct {
Name string `json:"name"`
Code string `json:"code"`
}

View File

@@ -7,24 +7,24 @@ type ProviderType = string
// 服务商代号
const (
ProviderTypeDNSPod ProviderType = "dnspod"
ProviderTypeAliyun ProviderType = "aliyun"
ProviderTypeAliDNS ProviderType = "alidns"
ProviderTypeDNSCom ProviderType = "dnscom"
)
// 所有的服务商类型
var AllProviderTypes = []maps.Map{
{
"name": "阿里云DNS",
"code": ProviderTypeAliDNS,
},
{
"name": "DNSPod",
"code": ProviderTypeDNSPod,
},
{
"name": "阿里云",
"code": ProviderTypeAliyun,
},
{
"name": "帝恩思",
/**{
"name": "帝恩思DNS.COM",
"code": ProviderTypeDNSCom,
},
},**/
}
// 查找服务商实例
@@ -32,6 +32,8 @@ func FindProvider(providerType ProviderType) ProviderInterface {
switch providerType {
case ProviderTypeDNSPod:
return &DNSPodProvider{}
case ProviderTypeAliDNS:
return &AliDNSProvider{}
}
return nil
}