Files
EdgeAPI/internal/dnsclients/provider_alidns.go

220 lines
5.4 KiB
Go
Raw Normal View History

2020-11-15 11:57:49 +08:00
package dnsclients
import (
"errors"
2021-06-02 18:13:48 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
2020-11-15 11:57:49 +08:00
"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"
2021-09-20 20:01:21 +08:00
"github.com/iwind/TeaGo/types"
2020-11-15 11:57:49 +08:00
"strings"
)
2021-04-15 17:02:01 +08:00
// AliDNSProvider 阿里云服务商
2020-11-15 11:57:49 +08:00
type AliDNSProvider struct {
BaseProvider
2020-11-15 11:57:49 +08:00
accessKeyId string
accessKeySecret string
2022-05-07 21:00:07 +08:00
regionId string
2020-11-15 11:57:49 +08:00
}
2021-04-15 17:02:01 +08:00
// Auth 认证
2020-11-15 11:57:49 +08:00
func (this *AliDNSProvider) Auth(params maps.Map) error {
this.accessKeyId = params.GetString("accessKeyId")
this.accessKeySecret = params.GetString("accessKeySecret")
2022-05-07 21:00:07 +08:00
this.regionId = params.GetString("regionId")
2020-11-15 11:57:49 +08:00
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")
}
2022-05-07 21:00:07 +08:00
if len(this.regionId) == 0 {
this.regionId = "cn-hangzhou"
}
2020-11-15 11:57:49 +08:00
return nil
}
// GetDomains 获取所有域名列表
func (this *AliDNSProvider) GetDomains() (domains []string, err error) {
pageNumber := 1
size := 100
for {
req := alidns.CreateDescribeDomainsRequest()
req.PageNumber = requests.NewInteger(pageNumber)
req.PageSize = requests.NewInteger(size)
resp := alidns.CreateDescribeDomainsResponse()
err = this.doAPI(req, resp)
if err != nil {
return nil, err
}
for _, domain := range resp.Domains.Domain {
domains = append(domains, domain.DomainName)
}
pageNumber++
if int64((pageNumber-1)*size) >= resp.TotalCount {
break
}
}
return
}
2021-04-15 17:02:01 +08:00
// GetRecords 获取域名列表
2021-06-02 18:13:48 +08:00
func (this *AliDNSProvider) GetRecords(domain string) (records []*dnstypes.Record, err error) {
2020-11-15 11:57:49 +08:00
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
2021-06-02 18:13:48 +08:00
if record.Type == dnstypes.RecordTypeCNAME && !strings.HasSuffix(record.Value, ".") {
2020-11-15 11:57:49 +08:00
record.Value += "."
}
2021-06-02 18:13:48 +08:00
records = append(records, &dnstypes.Record{
2020-11-15 11:57:49 +08:00
Id: record.RecordId,
Name: record.RR,
Type: record.Type,
Value: record.Value,
Route: record.Line,
2021-09-20 20:01:21 +08:00
TTL: types.Int32(record.TTL),
2020-11-15 11:57:49 +08:00
})
}
pageNumber++
if int64((pageNumber-1)*size) >= resp.TotalCount {
break
}
}
return
}
2021-04-15 17:02:01 +08:00
// GetRoutes 读取域名支持的线路数据
2021-06-02 18:13:48 +08:00
func (this *AliDNSProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
2020-11-15 11:57:49 +08:00
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 {
2021-06-02 18:13:48 +08:00
routes = append(routes, &dnstypes.Route{
2020-11-15 11:57:49 +08:00
Name: line.LineName,
Code: line.LineCode,
})
}
return
}
2021-04-15 17:02:01 +08:00
// QueryRecord 查询单个记录
2021-06-02 18:13:48 +08:00
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
}
for _, record := range records {
if record.Name == name && record.Type == recordType {
return record, nil
}
}
return nil, err
}
2021-04-15 17:02:01 +08:00
// AddRecord 设置记录
2021-06-02 18:13:48 +08:00
func (this *AliDNSProvider) AddRecord(domain string, newRecord *dnstypes.Record) error {
2020-11-15 11:57:49 +08:00
req := alidns.CreateAddDomainRecordRequest()
req.RR = newRecord.Name
req.Type = newRecord.Type
req.Value = newRecord.Value
req.DomainName = domain
req.Line = newRecord.Route
2021-09-20 20:01:21 +08:00
if newRecord.TTL > 0 {
req.TTL = requests.NewInteger(types.Int(newRecord.TTL))
}
2020-11-15 11:57:49 +08:00
resp := alidns.CreateAddDomainRecordResponse()
err := this.doAPI(req, resp)
if err != nil {
return this.WrapError(err, domain, newRecord)
2020-11-15 11:57:49 +08:00
}
if resp.IsSuccess() {
return nil
}
return this.WrapError(errors.New(resp.GetHttpContentString()), domain, newRecord)
2020-11-15 11:57:49 +08:00
}
2021-04-15 17:02:01 +08:00
// UpdateRecord 修改记录
2021-06-02 18:13:48 +08:00
func (this *AliDNSProvider) UpdateRecord(domain string, record *dnstypes.Record, newRecord *dnstypes.Record) error {
2020-11-15 11:57:49 +08:00
req := alidns.CreateUpdateDomainRecordRequest()
req.RecordId = record.Id
req.RR = newRecord.Name
req.Type = newRecord.Type
req.Value = newRecord.Value
req.Line = newRecord.Route
2021-09-20 20:01:21 +08:00
if newRecord.TTL > 0 {
req.TTL = requests.NewInteger(types.Int(newRecord.TTL))
}
2020-11-15 11:57:49 +08:00
resp := alidns.CreateUpdateDomainRecordResponse()
err := this.doAPI(req, resp)
return this.WrapError(err, domain, newRecord)
2020-11-15 11:57:49 +08:00
}
2021-04-15 17:02:01 +08:00
// DeleteRecord 删除记录
2021-06-02 18:13:48 +08:00
func (this *AliDNSProvider) DeleteRecord(domain string, record *dnstypes.Record) error {
2020-11-15 11:57:49 +08:00
req := alidns.CreateDeleteDomainRecordRequest()
req.RecordId = record.Id
resp := alidns.CreateDeleteDomainRecordResponse()
err := this.doAPI(req, resp)
return this.WrapError(err, domain, record)
2020-11-15 11:57:49 +08:00
}
2021-04-15 17:02:01 +08:00
// DefaultRoute 默认线路
2020-11-15 11:57:49 +08:00
func (this *AliDNSProvider) DefaultRoute() string {
return "default"
}
// 执行请求
func (this *AliDNSProvider) doAPI(req requests.AcsRequest, resp responses.AcsResponse) error {
req.SetScheme("https")
2022-05-07 21:00:07 +08:00
client, err := alidns.NewClientWithAccessKey(this.regionId, this.accessKeyId, this.accessKeySecret)
2020-11-15 11:57:49 +08:00
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
}