2023-03-20 01:01:44 -04:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
2023-03-23 15:30:55 -04:00
|
|
|
"log"
|
2023-03-20 01:01:44 -04:00
|
|
|
"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 := "<UNSET>"
|
|
|
|
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)
|
2023-03-23 15:30:55 -04:00
|
|
|
makeRecord := func() (libdns.Record, error) {
|
2023-03-20 01:01:44 -04:00
|
|
|
switch {
|
|
|
|
case cname != "":
|
2023-03-23 15:30:55 -04:00
|
|
|
return libdns.Record{
|
|
|
|
Type: "CNAME",
|
|
|
|
Name: sub,
|
|
|
|
Value: cname,
|
|
|
|
}, nil
|
2023-03-20 01:01:44 -04:00
|
|
|
case len(ip) == net.IPv4len:
|
2023-03-23 15:30:55 -04:00
|
|
|
return libdns.Record{
|
|
|
|
Type: "A",
|
|
|
|
Name: sub,
|
|
|
|
Value: ip.To4().String(),
|
|
|
|
}, nil
|
2023-03-20 01:01:44 -04:00
|
|
|
case len(ip) == net.IPv6len:
|
2023-03-23 15:30:55 -04:00
|
|
|
return libdns.Record{
|
|
|
|
Type: "AAAA",
|
|
|
|
Name: sub,
|
|
|
|
Value: ip.To16().String(),
|
|
|
|
}, nil
|
2023-03-20 01:01:44 -04:00
|
|
|
}
|
2023-03-23 15:30:55 -04:00
|
|
|
return libdns.Record{}, fmt.Errorf("neither cname nor valid ip is set")
|
2023-03-20 01:01:44 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
if sub != "<UNSET>" {
|
2023-03-23 15:30:55 -04:00
|
|
|
record, err := makeRecord()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
log.Printf("setting record, %+v", record)
|
|
|
|
newRecs, err := provider.SetRecords(ctx, zone, []libdns.Record{record})
|
2023-03-20 01:01:44 -04:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|