mirror of
https://github.com/jeessy2/ddns-go.git
synced 2025-10-20 15:33:46 +08:00
* feat: init the i18n * fix: porkbun * refactor: http_util GetHTTPResponse * fix: save * fix: add more i18n * feat: i18n at writing.html * feat: README EN * fix: default api * fix: pic
183 lines
4.4 KiB
Go
183 lines
4.4 KiB
Go
package dns
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/jeessy2/ddns-go/v5/config"
|
|
"github.com/jeessy2/ddns-go/v5/util"
|
|
)
|
|
|
|
const (
|
|
alidnsEndpoint string = "https://alidns.aliyuncs.com/"
|
|
)
|
|
|
|
// https://help.aliyun.com/document_detail/29776.html?spm=a2c4g.11186623.6.672.715a45caji9dMA
|
|
// Alidns Alidns
|
|
type Alidns struct {
|
|
DNS config.DNS
|
|
Domains config.Domains
|
|
TTL string
|
|
}
|
|
|
|
// AlidnsRecord record
|
|
type AlidnsRecord struct {
|
|
DomainName string
|
|
RecordID string
|
|
Value string
|
|
}
|
|
|
|
// AlidnsSubDomainRecords 记录
|
|
type AlidnsSubDomainRecords struct {
|
|
TotalCount int
|
|
DomainRecords struct {
|
|
Record []AlidnsRecord
|
|
}
|
|
}
|
|
|
|
// AlidnsResp 修改/添加返回结果
|
|
type AlidnsResp struct {
|
|
RecordID string
|
|
RequestID string
|
|
}
|
|
|
|
// Init 初始化
|
|
func (ali *Alidns) Init(dnsConf *config.DnsConfig, ipv4cache *util.IpCache, ipv6cache *util.IpCache) {
|
|
ali.Domains.Ipv4Cache = ipv4cache
|
|
ali.Domains.Ipv6Cache = ipv6cache
|
|
ali.DNS = dnsConf.DNS
|
|
ali.Domains.GetNewIp(dnsConf)
|
|
if dnsConf.TTL == "" {
|
|
// 默认600s
|
|
ali.TTL = "600"
|
|
} else {
|
|
ali.TTL = dnsConf.TTL
|
|
}
|
|
}
|
|
|
|
// AddUpdateDomainRecords 添加或更新IPv4/IPv6记录
|
|
func (ali *Alidns) AddUpdateDomainRecords() config.Domains {
|
|
ali.addUpdateDomainRecords("A")
|
|
ali.addUpdateDomainRecords("AAAA")
|
|
return ali.Domains
|
|
}
|
|
|
|
func (ali *Alidns) addUpdateDomainRecords(recordType string) {
|
|
ipAddr, domains := ali.Domains.GetNewIpResult(recordType)
|
|
|
|
if ipAddr == "" {
|
|
return
|
|
}
|
|
|
|
for _, domain := range domains {
|
|
var records AlidnsSubDomainRecords
|
|
// 获取当前域名信息
|
|
params := domain.GetCustomParams()
|
|
params.Set("Action", "DescribeSubDomainRecords")
|
|
params.Set("DomainName", domain.DomainName)
|
|
params.Set("SubDomain", domain.GetFullDomain())
|
|
params.Set("Type", recordType)
|
|
err := ali.request(params, &records)
|
|
|
|
if err != nil {
|
|
util.Log("查询域名信息发生异常! %s", err)
|
|
domain.UpdateStatus = config.UpdatedFailed
|
|
return
|
|
}
|
|
|
|
if records.TotalCount > 0 {
|
|
// 默认第一个
|
|
recordSelected := records.DomainRecords.Record[0]
|
|
if params.Has("RecordId") {
|
|
for i := 0; i < len(records.DomainRecords.Record); i++ {
|
|
if records.DomainRecords.Record[i].RecordID == params.Get("RecordId") {
|
|
recordSelected = records.DomainRecords.Record[i]
|
|
}
|
|
}
|
|
}
|
|
// 存在,更新
|
|
ali.modify(recordSelected, domain, recordType, ipAddr)
|
|
} else {
|
|
// 不存在,创建
|
|
ali.create(domain, recordType, ipAddr)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// 创建
|
|
func (ali *Alidns) create(domain *config.Domain, recordType string, ipAddr string) {
|
|
params := domain.GetCustomParams()
|
|
params.Set("Action", "AddDomainRecord")
|
|
params.Set("DomainName", domain.DomainName)
|
|
params.Set("RR", domain.GetSubDomain())
|
|
params.Set("Type", recordType)
|
|
params.Set("Value", ipAddr)
|
|
params.Set("TTL", ali.TTL)
|
|
|
|
var result AlidnsResp
|
|
err := ali.request(params, &result)
|
|
|
|
if err == nil && result.RecordID != "" {
|
|
util.Log("新增域名解析 %s 成功! IP: %s", domain, ipAddr)
|
|
domain.UpdateStatus = config.UpdatedSuccess
|
|
} else {
|
|
util.Log("新增域名解析 %s 失败! 异常信息: %s", domain, err)
|
|
domain.UpdateStatus = config.UpdatedFailed
|
|
}
|
|
}
|
|
|
|
// 修改
|
|
func (ali *Alidns) modify(recordSelected AlidnsRecord, domain *config.Domain, recordType string, ipAddr string) {
|
|
|
|
// 相同不修改
|
|
if recordSelected.Value == ipAddr {
|
|
util.Log("你的IP %s 没有变化, 域名 %s", ipAddr, domain)
|
|
return
|
|
}
|
|
|
|
params := domain.GetCustomParams()
|
|
params.Set("Action", "UpdateDomainRecord")
|
|
params.Set("RR", domain.GetSubDomain())
|
|
params.Set("RecordId", recordSelected.RecordID)
|
|
params.Set("Type", recordType)
|
|
params.Set("Value", ipAddr)
|
|
params.Set("TTL", ali.TTL)
|
|
|
|
var result AlidnsResp
|
|
err := ali.request(params, &result)
|
|
|
|
if err == nil && result.RecordID != "" {
|
|
util.Log("更新域名解析 %s 成功! IP: %s", domain, ipAddr)
|
|
domain.UpdateStatus = config.UpdatedSuccess
|
|
} else {
|
|
util.Log("更新域名解析 %s 失败! 异常信息: %s", domain, err)
|
|
domain.UpdateStatus = config.UpdatedFailed
|
|
}
|
|
}
|
|
|
|
// request 统一请求接口
|
|
func (ali *Alidns) request(params url.Values, result interface{}) (err error) {
|
|
|
|
util.AliyunSigner(ali.DNS.ID, ali.DNS.Secret, ¶ms)
|
|
|
|
req, err := http.NewRequest(
|
|
"GET",
|
|
alidnsEndpoint,
|
|
bytes.NewBuffer(nil),
|
|
)
|
|
req.URL.RawQuery = params.Encode()
|
|
|
|
if err != nil {
|
|
util.Log("异常信息: %s", err)
|
|
return
|
|
}
|
|
|
|
client := util.CreateHTTPClient()
|
|
resp, err := client.Do(req)
|
|
err = util.GetHTTPResponse(resp, err, result)
|
|
|
|
return
|
|
}
|