diff options
Diffstat (limited to 'cloudflare')
| -rw-r--r-- | cloudflare/api.go | 4 | ||||
| -rw-r--r-- | cloudflare/create.go | 57 | ||||
| -rw-r--r-- | cloudflare/delete.go | 64 | ||||
| -rw-r--r-- | cloudflare/http.go | 85 |
4 files changed, 207 insertions, 3 deletions
diff --git a/cloudflare/api.go b/cloudflare/api.go index 293857f..41ddae6 100644 --- a/cloudflare/api.go +++ b/cloudflare/api.go @@ -99,7 +99,7 @@ func SetRow(dnsRow *RRT) { } func GetZonefile(c *ConfigT) *DNSRecords { - var url = cloudflareURL + c.ZoneID + "/dns_records/" + var url = cloudflareURL + c.ZoneID + "/dns_records/?per_page=100" log.Println("getZonefile()", c.Domain, url) req, err := http.NewRequest("GET", url, nil) if err != nil { @@ -162,7 +162,7 @@ func makeJSON(dnsRow *RRT) string { // https://api.cloudflare.com/client/v4/zones func GetZones(auth, email string) *DNSRecords { - var url = "https://api.cloudflare.com/client/v4/zones" + var url = "https://api.cloudflare.com/client/v4/zones?per_page=100" log.Println("getZones()", url) req, err := http.NewRequest("GET", url, nil) if err != nil { diff --git a/cloudflare/create.go b/cloudflare/create.go new file mode 100644 index 0000000..5d75b0c --- /dev/null +++ b/cloudflare/create.go @@ -0,0 +1,57 @@ +/* + This will attempt to create a RR in a DNS zone file. + + Create("wit.com", "test.wit.com", "1.1.1.1" +*/ + +package cloudflare + +import ( + "os" + + "go.wit.com/log" +) + +func Create(zone string, hostname string, value string) bool { + log.Info("cloudflare.Create() START", zone, hostname, value) + key := os.Getenv("CF_API_KEY") + email := os.Getenv("CF_API_EMAIL") + + if (key == "") { + log.Warn("cloudflare.Create() MISSING environment variable CF_API_KEY") + return false + } + if (email == "") { + log.Warn("cloudflare.Create() MISSING environment variable CF_API_EMAIL") + return false + } + + GetZones(key, email) + var z *ConfigT + for d, v := range Config { + log.Info("cloudflare.Create() zone =", d, "value =", v) + if (zone == d) { + z = Config[zone] + log.Info("cloudflare.Create() FOUND ZONE", zone, "ID =", z.ZoneID) + } + } + if (z == nil) { + log.Warn("cloudflare.Create() COULD NOT FIND ZONE", zone) + return false + } + log.Info("cloudflare.Create() FOUND ZONE", z) + + // make a json record to send on port 80 to cloudflare + var data string + data = `{"content": "` + value + `", ` + data += `"name": "` + hostname + `", ` + data += `"type": "AAAA", ` + data += `"ttl": "1", ` + data += `"comment": "WIT DNS Control Panel"` + data += `}` + + result := doCurlCreate(key, email, z.ZoneID, data) + pretty, _ := FormatJSON(result) + log.Info("cloudflare.Create() result =", pretty) + return true +} diff --git a/cloudflare/delete.go b/cloudflare/delete.go new file mode 100644 index 0000000..aa59105 --- /dev/null +++ b/cloudflare/delete.go @@ -0,0 +1,64 @@ +/* + This will attempt to delete a RR in a DNS zone file. + + Delete("wit.com", "test.wit.com", "1.1.1.1" +*/ + +package cloudflare + +import ( + "os" + + "go.wit.com/log" +) + +func Delete(zone string, hostname string, value string) bool { + // CFdialog.emailNode.SetText(os.Getenv("CF_API_EMAIL")) + // CFdialog.apiNode.SetText(os.Getenv("CF_API_KEY")) + + log.Info("cloudflare.Delete() START", zone, hostname, value) + key := os.Getenv("CF_API_KEY") + email := os.Getenv("CF_API_EMAIL") + + if (key == "") { + log.Warn("cloudflare.Delete() MISSING environment variable CF_API_KEY") + return false + } + if (email == "") { + log.Warn("cloudflare.Delete() MISSING environment variable CF_API_EMAIL") + return false + } + + GetZones(key, email) + var z *ConfigT + for d, v := range Config { + log.Info("cloudflare.Delete() zone =", d, "value =", v) + if (zone == d) { + z = Config[zone] + log.Info("cloudflare.Delete() FOUND ZONE", zone, "ID =", z.ZoneID) + } + } + if (z == nil) { + log.Warn("cloudflare.Delete() COULD NOT FIND ZONE", zone) + return false + } + log.Info("cloudflare.Delete() FOUND ZONE", z) + + records := GetZonefile(z) + for i, record := range records.Result { + if (record.Name == hostname) { + log.Info("cloudflare.Delete() FOUND hostname:", i, record.ID, record.Type, record.Name, record.Content) + } + if (record.Content == value) { + log.Info("cloudflare.Delete() FOUND CONTENT:", i, record.ID, record.Type, record.Name, record.Content) + log.Info("cloudflare.Delete() DO THE ACTUAL cloudflare DELETE here") + result := doCurlDelete(key, email, z.ZoneID, record.ID) + pretty, _ := FormatJSON(result) + log.Info("cloudflare.Delete() result =", pretty) + return true + } + } + + log.Info("cloudflare.Delete() NEVER FOUND cloudflare value:", value) + return false +} diff --git a/cloudflare/http.go b/cloudflare/http.go index 1917c8b..f976b96 100644 --- a/cloudflare/http.go +++ b/cloudflare/http.go @@ -2,10 +2,11 @@ package cloudflare import ( - "log" "io/ioutil" "net/http" "bytes" + + "go.wit.com/log" ) /* @@ -26,6 +27,88 @@ curl --request POST \ }' */ +func doCurlDelete(auth string, email string, zoneId string, rrId string) string { + var err error + var req *http.Request + + if zoneId == "" { + log.Warn("doCurlDelete() zoneId == nil") + return "" + } + + if rrId == "" { + log.Warn("doCurlDelete() rrId == nil") + return "" + } + + data := []byte("") + + url := "https://api.cloudflare.com/client/v4/zones/" + zoneId + "/dns_records/" + rrId + + req, err = http.NewRequest(http.MethodDelete, url, bytes.NewBuffer(data)) + + // Set headers + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Auth-Key", auth) + req.Header.Set("X-Auth-Email", email) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Println(err) + return "" + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println(err) + return "" + } + + return string(body) +} + +func doCurlCreate(auth string, email string, zoneId string, data string) string { + var err error + var req *http.Request + + if zoneId == "" { + log.Warn("doCurlDelete() zoneId == nil") + return "" + } + + url := "https://api.cloudflare.com/client/v4/zones/" + zoneId + "/dns_records/" + + log.Info("doCurlCreate() POST url =", url) + log.Info("doCurlCreate() POST Auth =", auth) + log.Info("doCurlCreate() POST Email =", email) + log.Info("doCurlCreate() POST data =", data) + + req, err = http.NewRequest(http.MethodPost, url, bytes.NewBuffer( []byte(data) )) + + // Set headers + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Auth-Key", auth) + req.Header.Set("X-Auth-Email", email) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Println(err) + return "" + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println(err) + return "" + } + + return string(body) +} + func doCurl(method string, rr *RRT) string { var err error var req *http.Request |
