summaryrefslogtreecommitdiff
path: root/cloudflare
diff options
context:
space:
mode:
Diffstat (limited to 'cloudflare')
-rw-r--r--cloudflare/api.go4
-rw-r--r--cloudflare/create.go57
-rw-r--r--cloudflare/delete.go64
-rw-r--r--cloudflare/http.go85
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