83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/cloudflare/cloudflare-go"
|
|
)
|
|
|
|
type Cloudflare struct {
|
|
Zone string `json:"zone" yaml:"zone"`
|
|
Token string `json:"token" yaml:"token"`
|
|
Email string `json:"email" yaml:"email"`
|
|
}
|
|
|
|
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 == "" || p.Email == "" || p.Token == "" {
|
|
return nil, errors.New("cloudflare config error")
|
|
}
|
|
|
|
p.ZoneResource = cloudflare.ZoneIdentifier(p.Zone)
|
|
var err error
|
|
p.Api, err = cloudflare.New(p.Cloudflare.Token, p.Cloudflare.Email)
|
|
return &p, err
|
|
}
|
|
|
|
func (a DnsProvider) SetDomainRecord(domain, ip string) error {
|
|
rc := cloudflare.ResourceContainer{Identifier: a.Cloudflare.Zone}
|
|
dnsRecords, resultInfo, err := a.Api.ListDNSRecords(
|
|
context.TODO(),
|
|
&rc,
|
|
cloudflare.ListDNSRecordsParams{
|
|
Name: domain,
|
|
},
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if resultInfo.Count == 0 {
|
|
log.Println("not found record for domain:", domain)
|
|
return errors.New("not found record for domain:" + domain)
|
|
}
|
|
|
|
log.Println("found record(s) for domain:", domain)
|
|
for _, record := range dnsRecords {
|
|
fmt.Println(record.ID, record.Name, record.Content)
|
|
}
|
|
|
|
// update record
|
|
record := dnsRecords[0]
|
|
record, err = a.Api.UpdateDNSRecord(context.TODO(), &rc, cloudflare.UpdateDNSRecordParams{
|
|
ID: record.ID,
|
|
Name: record.Name,
|
|
Type: record.Type,
|
|
Content: ip,
|
|
TTL: record.TTL,
|
|
Proxied: record.Proxied,
|
|
Comment: &record.Comment,
|
|
})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println("update record success:", record.ID, record.Name, record.Content)
|
|
return nil
|
|
}
|