diff --git a/dns/dnspod/dnspod.go b/dns/dnspod/dnspod.go new file mode 100644 index 0000000..3bb1885 --- /dev/null +++ b/dns/dnspod/dnspod.go @@ -0,0 +1,71 @@ +package dnspod + +import ( + dnsUtil "github.com/Mmx233/BitSrunLoginGo/dns/util" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/regions" + dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323" + "net/http" + "strings" +) + +type DnsProvider struct { + Client *dnspod.Client `mapstructure:"-"` + TTL uint64 `mapstructure:"-"` + SecretId string `mapstructure:"secret_id"` + SecretKey string `mapstructure:"secret_key"` +} + +func New(ttl uint64, conf map[string]interface{}, Http *http.Transport) (*DnsProvider, error) { + var p = DnsProvider{TTL: ttl} + e := dnsUtil.DecodeConfig(conf, &p) + if e != nil { + return nil, e + } + p.Client, e = dnspod.NewClient(common.NewCredential(p.SecretId, p.SecretKey), regions.Guangzhou, profile.NewClientProfile()) + p.Client.WithHttpTransport(Http) + return &p, e +} + +func (a DnsProvider) SetDomainRecord(domain, ip string) error { + subDomain, rootDomain, e := dnsUtil.DecodeDomain(domain) + if e != nil { + return e + } + + var ( + recordType = "A" + recordLine = "默认" + limit uint64 = 1 + ) + + reqRecordList := dnspod.NewDescribeRecordListRequest() + reqRecordList.Domain = &rootDomain + reqRecordList.Subdomain = &subDomain + reqRecordList.Limit = &limit + res, e := a.Client.DescribeRecordList(reqRecordList) + if (e != nil && strings.Contains(e.Error(), dnspod.RESOURCENOTFOUND_NODATAOFRECORD)) || (e == nil && len(res.Response.RecordList) == 0) { + reqNewRecord := dnspod.NewCreateRecordRequest() + reqNewRecord.TTL = &a.TTL + reqNewRecord.Domain = &rootDomain + reqNewRecord.RecordType = &recordType + reqNewRecord.RecordLine = &recordLine + reqNewRecord.Value = &ip + reqNewRecord.SubDomain = &subDomain + _, e = a.Client.CreateRecord(reqNewRecord) + return e + } else if e != nil { + return e + } + + reqModifyRecord := dnspod.NewModifyRecordRequest() + reqModifyRecord.Domain = &rootDomain + reqModifyRecord.SubDomain = &subDomain + reqModifyRecord.Value = &ip + reqModifyRecord.RecordId = res.Response.RecordList[0].RecordId + reqModifyRecord.RecordLine = &recordLine + reqModifyRecord.RecordType = &recordType + _, e = a.Client.ModifyRecord(reqModifyRecord) + return e +} diff --git a/go.mod b/go.mod index 21fe74f..79dbc8a 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,8 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/sirupsen/logrus v1.9.0 github.com/spf13/viper v1.14.0 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.569 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.569 ) require ( diff --git a/go.sum b/go.sum index ef5c32d..2130482 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,6 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.56.0 h1:ipMEKt3/33fgv8CdHnxn9hba1HzJ67hf0VyCdprIaro= -github.com/cloudflare/cloudflare-go v0.56.0/go.mod h1:Xv29BilsDBBZUneqqnSEJT4HRi1YMn4RvWitAVkESOI= github.com/cloudflare/cloudflare-go v0.57.1 h1:c9OhL/WusagBirP+CIJeCqS7OjT9kiWjtJv4lwxp3ZM= github.com/cloudflare/cloudflare-go v0.57.1/go.mod h1:cD8AqNMMaL1A0Sj9XKo3Xu9ZVHwHqgXJofb1ya210GQ= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -151,8 +149,6 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= @@ -195,6 +191,10 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.569 h1:ucwAQxGji/1kHSsnFf/w/BJ35rU7lFaUAq+uUKzwufE= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.569/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.569 h1:Xk0PwybQBDa+iUVMpViz+0+B30/adfA6gqdERyLPz8A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.569/go.mod h1:EqKGMv+JkEzzkY7WNl46/S9dhfiWXcBSmkDJJ4S3qik= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=