/* This will let you edit a single Resource Record within a DNS zone file. For example: google-dns.wit.com. 1 IN A 8.8.8.8 */ package cloudflare import ( "os" "go.wit.com/gui" "go.wit.com/lib/gadgets" "go.wit.com/log" ) func init() { Config = make(map[string]*ConfigT) } func CreateRR(myGui *gui.Node, zone string, zoneID string) *gadgets.BasicWindow { if CFdialog.cloudflareW != nil { // skip this if the window has already been created log.Warn("createRR() the cloudflare window already exists") CFdialog.cloudflareB.Disable() return CFdialog.cloudflareW } CFdialog.cloudflareW = gadgets.NewBasicWindow(myGui, "cloudflare "+zone+" API") group := CFdialog.cloudflareW.Box().NewGroup("Create a new DNS Resource Record (rr)") // make a grid 2 things wide grid := group.NewGrid("gridnuts", 2, 3) grid.NewLabel("zone") CFdialog.zoneNode = grid.NewLabel("zone") CFdialog.zoneNode.SetText(zone) grid.NewLabel("zone ID") CFdialog.zoneIdNode = grid.NewLabel("zoneID") CFdialog.zoneIdNode.SetText(zoneID) grid.NewLabel("shell env $CF_API_EMAIL") CFdialog.emailNode = grid.NewLabel("type") CFdialog.emailNode.SetText(os.Getenv("CF_API_EMAIL")) grid.NewLabel("shell env $CF_API_KEY") CFdialog.apiNode = grid.NewLabel("type") CFdialog.apiNode.SetText(os.Getenv("CF_API_KEY")) grid.NewLabel("Resource Record ID") CFdialog.rrNode = grid.NewLabel("type") CFdialog.rrNode.SetText(os.Getenv("cloudflare RR id")) grid.NewLabel("Record Type") CFdialog.TypeNode = grid.NewCombobox() CFdialog.TypeNode.AddText("A") CFdialog.TypeNode.AddText("AAAA") CFdialog.TypeNode.AddText("CNAME") CFdialog.TypeNode.AddText("TXT") CFdialog.TypeNode.AddText("MX") CFdialog.TypeNode.AddText("NS") CFdialog.TypeNode.Custom = func() { DoChange() } CFdialog.TypeNode.SetText("AAAA") grid.NewLabel("Name (usually the hostname)") CFdialog.NameNode = grid.NewCombobox() CFdialog.NameNode.AddText("www") CFdialog.NameNode.AddText("mail") CFdialog.NameNode.AddText("git") CFdialog.NameNode.AddText("go") CFdialog.NameNode.AddText("blog") CFdialog.NameNode.AddText("ns1") CFdialog.NameNode.Custom = func() { DoChange() } CFdialog.NameNode.SetText("www") grid.NewLabel("Cloudflare Proxy") CFdialog.proxyNode = grid.NewDropdown() CFdialog.proxyNode.AddText("On") CFdialog.proxyNode.AddText("Off") CFdialog.proxyNode.Custom = func() { DoChange() } CFdialog.proxyNode.SetText("Off") grid.NewLabel("Value") CFdialog.ValueNode = grid.NewCombobox() CFdialog.ValueNode.AddText("127.0.0.1") CFdialog.ValueNode.AddText("2001:4860:4860::8888") CFdialog.ValueNode.AddText("ipv6.wit.com") CFdialog.ValueNode.Custom = func() { DoChange() } CFdialog.ValueNode.SetText("127.0.0.1") CFdialog.ValueNode.Expand() grid.NewLabel("URL") CFdialog.urlNode = grid.NewLabel("URL") group.NewLabel("curl") CFdialog.curlNode = group.NewTextbox("curl") CFdialog.curlNode.Custom = func() { DoChange() } CFdialog.curlNode.SetText("put the curl text here") CFdialog.resultNode = group.NewTextbox("result") CFdialog.resultNode.SetText("API response will show here") CFdialog.SaveNode = group.NewButton("Save curlPost()", func() { dnsRow := DoChange() result := curlPost(dnsRow) CFdialog.resultNode.SetText(result) // CreateCurlRR() // url, data := CreateCurlRR() // result := curl(url, data) // CFdialog.resultNode.SetText(result) }) // CFdialog.saveNode.Disable() group.NewButton("New RR doCurl(PUT)", func() { rr := DoChange() rr.url = "https://api.cloudflare.com/client/v4/zones/" + rr.ZoneID + "/dns_records" result := doCurl("POST", rr) CFdialog.resultNode.SetText(result) pretty, _ := FormatJSON(result) log.Spew(pretty) }) group.NewButton("Update RR doCurl(PUT)", func() { rr := DoChange() rr.url = "https://api.cloudflare.com/client/v4/zones/" + rr.ZoneID + "/dns_records/" + rr.ID result := doCurl("PUT", rr) CFdialog.resultNode.SetText(result) pretty, _ := FormatJSON(result) log.Spew(pretty) }) // CFdialog.saveNode.Disable() group.Pad() grid.Pad() grid.Expand() return CFdialog.cloudflareW }