68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"github.com/cloudflare/cloudflare-go"
|
|
"net/http"
|
|
)
|
|
|
|
type Cloudflare struct {
|
|
Zone string `json:"zone" yaml:"zone"`
|
|
Token string `json:"token" yaml:"token"`
|
|
}
|
|
|
|
type DnsProvider struct {
|
|
Api *cloudflare.API
|
|
TTL int
|
|
ZoneResource *cloudflare.ResourceContainer
|
|
Cloudflare
|
|
}
|
|
|
|
func New(ttl int, conf Cloudflare, Http *http.Client) (*DnsProvider, error) {
|
|
var p = DnsProvider{
|
|
TTL: ttl,
|
|
Cloudflare: conf,
|
|
}
|
|
if p.Zone == "" {
|
|
return nil, errors.New("cloudflare zone 不能为空")
|
|
}
|
|
if p.Token == "" {
|
|
return nil, errors.New("cloudflare token 不能为空")
|
|
}
|
|
p.ZoneResource = cloudflare.ZoneIdentifier(p.Zone)
|
|
var err error
|
|
p.Api, err = cloudflare.NewWithAPIToken(p.Token, cloudflare.HTTPClient(Http))
|
|
return &p, err
|
|
}
|
|
|
|
func (a DnsProvider) SetDomainRecord(domain, ip string) error {
|
|
records, _, err := a.Api.ListDNSRecords(context.Background(), a.ZoneResource, cloudflare.ListDNSRecordsParams{
|
|
Type: "A",
|
|
Name: domain,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(records) == 0 {
|
|
_, err = a.Api.CreateDNSRecord(context.Background(), a.ZoneResource, cloudflare.CreateDNSRecordParams{
|
|
Type: "A",
|
|
Name: domain,
|
|
Content: ip,
|
|
TTL: a.TTL,
|
|
})
|
|
return err
|
|
} else {
|
|
record := records[0]
|
|
if record.Content == ip {
|
|
return nil
|
|
}
|
|
_, err = a.Api.UpdateDNSRecord(context.Background(), a.ZoneResource, cloudflare.UpdateDNSRecordParams{
|
|
ID: record.ID,
|
|
Content: ip,
|
|
})
|
|
return err
|
|
}
|
|
}
|