From 89a8a36b51bb66f19a4f81875096a0a7921b7b04 Mon Sep 17 00:00:00 2001 From: Balakrishnan Balasubramanian Date: Mon, 20 Mar 2023 01:01:44 -0400 Subject: [PATCH] Initial commit --- go.mod | 8 +++++ go.sum | 5 ++++ main.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..99c1c8b --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module go.balki.me/cloudflaredns + +go 1.20 + +require ( + github.com/libdns/cloudflare v0.1.0 + github.com/libdns/libdns v0.2.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..5e2ef10 --- /dev/null +++ b/go.sum @@ -0,0 +1,5 @@ +github.com/libdns/cloudflare v0.1.0 h1:93WkJaGaiXCe353LHEP36kAWCUw0YjFqwhkBkU2/iic= +github.com/libdns/cloudflare v0.1.0/go.mod h1:a44IP6J1YH6nvcNl1PverfJviADgXUnsozR3a7vBKN8= +github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= +github.com/libdns/libdns v0.2.1 h1:Wu59T7wSHRgtA0cfxC+n1c/e+O3upJGWytknkmFEDis= +github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= diff --git a/main.go b/main.go new file mode 100644 index 0000000..79fec74 --- /dev/null +++ b/main.go @@ -0,0 +1,92 @@ +package main + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "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) + setRecords := func() ([]libdns.Record, error) { + switch { + case cname != "": + return provider.SetRecords(ctx, zone, []libdns.Record{ + { + Type: "CNAME", + Name: sub, + Value: cname, + }, + }) + case len(ip) == net.IPv4len: + return provider.SetRecords(ctx, zone, []libdns.Record{ + { + Type: "A", + Name: sub, + Value: ip.To4().String(), + }, + }) + case len(ip) == net.IPv6len: + return provider.SetRecords(ctx, zone, []libdns.Record{ + { + Type: "AAAA", + Name: sub, + Value: ip.To16().String(), + }, + }) + } + return nil, fmt.Errorf("neither cname nor valid ip is set") + } + + if sub != "" { + newRecs, err := setRecords() + if err != nil { + fmt.Printf("%#v\n", err) + 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) + } + } +}