package main import ( "context" "encoding/json" "flag" "fmt" "log" "net" "os" "github.com/libdns/cloudflare" "github.com/libdns/libdns" ) var ( domain = os.Getenv("DOMAIN") token = os.Getenv("CF_TOKEN") ) func main() { ctx := context.TODO() ip := net.IPv4(127, 0, 0, 1) var cname string sub := "" var path string flag.StringVar(&domain, "d", domain, "Domain name, e.g. example.com") flag.StringVar(&sub, "s", sub, "Subdomain to add dns entry for, e.g. blog") flag.StringVar(&token, "a", token, "Cloudflare API Token") flag.TextVar(&ip, "i", ip, "IP address") flag.StringVar(&cname, "c", cname, "CNAME target") flag.StringVar(&path, "o", path, "path to save all records as json, e.g. ./records.json") flag.Parse() provider := cloudflare.Provider{APIToken: token} zone := domain + "." fmt.Println(zone, sub, cname) makeRecord := func() (libdns.Record, error) { switch { case cname != "": return libdns.Record{ Type: "CNAME", Name: sub, Value: cname, }, nil case len(ip) == net.IPv4len: return libdns.Record{ Type: "A", Name: sub, Value: ip.To4().String(), }, nil case len(ip) == net.IPv6len: return libdns.Record{ Type: "AAAA", Name: sub, Value: ip.To16().String(), }, nil } return libdns.Record{}, fmt.Errorf("neither cname nor valid ip is set") } if sub != "" { record, err := makeRecord() if err != nil { panic(err) } log.Printf("setting record, %+v", record) newRecs, err := provider.SetRecords(ctx, zone, []libdns.Record{record}) if err != nil { panic(err) } fmt.Println(newRecs) } if path != "" { recs, err := provider.GetRecords(ctx, zone) if err != nil { panic(err) } data, err := json.Marshal(recs) if err != nil { panic(err) } err = os.WriteFile(path, data, 0644) if err != nil { panic(err) } } }