237 lines
5.4 KiB
Go
237 lines
5.4 KiB
Go
// This is a simple example
|
|
package main
|
|
|
|
import (
|
|
"os"
|
|
"fmt"
|
|
"log"
|
|
"bufio"
|
|
"strings"
|
|
|
|
"go.wit.com/gui"
|
|
"go.wit.com/control-panel-dns/cloudflare"
|
|
)
|
|
|
|
var title string = "Cloudflare DNS Control Panel"
|
|
var outfile string = "/tmp/guilogfile"
|
|
var configfile string = ".config/wit/cloudflare"
|
|
var myGui *gui.Node
|
|
|
|
var buttonCounter int = 5
|
|
var gridW int = 5
|
|
var gridH int = 3
|
|
|
|
var mainWindow, more, more2 *gui.Node
|
|
|
|
func main() {
|
|
config = make(map[string]*configT)
|
|
readConfig()
|
|
myGui = gui.New().Default()
|
|
makeCloudflareWindow()
|
|
|
|
// This is just a optional goroutine to watch that things are alive
|
|
gui.Watchdog()
|
|
gui.StandardExit()
|
|
}
|
|
|
|
// This creates a window
|
|
func makeCloudflareWindow() {
|
|
var t *gui.Node
|
|
|
|
log.Println("buttonWindow() START")
|
|
|
|
mainWindow = myGui.NewWindow(title).SetText(title)
|
|
|
|
// this tab has the master cloudflare API credentials
|
|
makeConfigTab(mainWindow)
|
|
|
|
t = mainWindow.NewTab("Zones")
|
|
vb := t.NewBox("vBox", false)
|
|
g1 := vb.NewGroup("zones")
|
|
|
|
// make dropdown list of zones
|
|
zonedrop = g1.NewDropdown("zone")
|
|
zonedrop.AddText("example.org")
|
|
for d, _ := range config {
|
|
zonedrop.AddText(d)
|
|
}
|
|
zonedrop.AddText("stablesid.org")
|
|
|
|
zonedrop.Custom = func () {
|
|
domain := zonedrop.S
|
|
log.Println("custom dropdown() zone (domain name) =", zonedrop.Name, domain)
|
|
if (config[domain] == nil) {
|
|
log.Println("custom dropdown() config[domain] = nil for domain =", domain)
|
|
domainWidget.SetText(domain)
|
|
zoneWidget.SetText("")
|
|
authWidget.SetText("")
|
|
emailWidget.SetText("")
|
|
} else {
|
|
log.Println("custom dropdown() a =", domain, config[domain].zoneID, config[domain].auth, config[domain].email)
|
|
domainWidget.SetText(config[domain].domain)
|
|
zoneWidget.SetText(config[domain].zoneID)
|
|
authWidget.SetText(config[domain].auth)
|
|
emailWidget.SetText(config[domain].email)
|
|
}
|
|
}
|
|
|
|
more = g1.NewGroup("data")
|
|
showCloudflareCredentials(more)
|
|
|
|
makeDebugTab(mainWindow)
|
|
}
|
|
|
|
func makeConfigTab(window *gui.Node) {
|
|
t := window.NewTab("Get Zones")
|
|
vb := t.NewBox("vBox", false)
|
|
g1 := vb.NewGroup("Cloudflare API Config")
|
|
|
|
g1.NewLabel("If you have an API key with access to list all of /n your zone files, enter it here. \n \n Alternatively, you can set the enviroment variables: \n env $CF_API_KEY \n env $CF_API_EMAIL\n")
|
|
|
|
// make grid to display credentials
|
|
grid := g1.NewGrid("credsGrid", 2, 4) // width = 2
|
|
|
|
grid.NewLabel("Auth Key")
|
|
aw := grid.NewEntryLine("CF_API_KEY")
|
|
aw.SetText(os.Getenv("CF_API_KEY"))
|
|
|
|
grid.NewLabel("Email")
|
|
ew := grid.NewEntryLine("CF_API_EMAIL")
|
|
ew.SetText(os.Getenv("CF_API_EMAIL"))
|
|
|
|
var url string = "https://api.cloudflare.com/client/v4/zones/"
|
|
grid.NewLabel("Cloudflare API")
|
|
grid.NewLabel(url)
|
|
|
|
grid.Pad()
|
|
|
|
vb.NewButton("getZones()", func () {
|
|
log.Println("getZones()")
|
|
getZones(aw.S, ew.S)
|
|
})
|
|
|
|
vb.NewButton("cloudflare wit.com", func () {
|
|
cloudflare.CreateRR(myGui, "wit.com", "3777302ac4a78cd7fa4f6d3f72086d06")
|
|
})
|
|
|
|
t.Pad()
|
|
t.Margin()
|
|
vb.Pad()
|
|
vb.Margin()
|
|
g1.Pad()
|
|
g1.Margin()
|
|
}
|
|
|
|
func makeDebugTab(window *gui.Node) {
|
|
t2 := window.NewTab("debug")
|
|
g := t2.NewGroup("debug")
|
|
g.NewButton("Load 'gocui'", func () {
|
|
// this set the xterm and mate-terminal window title. maybe works generally?
|
|
fmt.Println("\033]0;" + title + "blah \007")
|
|
myGui.LoadToolkit("gocui")
|
|
})
|
|
|
|
g.NewButton("Load 'andlabs'", func () {
|
|
myGui.LoadToolkit("andlabs")
|
|
})
|
|
|
|
g.NewButton("gui.DebugWindow()", func () {
|
|
gui.DebugWindow()
|
|
})
|
|
|
|
g.NewButton("List all Widgets", func () {
|
|
myGui.ListChildren(true)
|
|
})
|
|
g.NewButton("Dump all Widgets", func () {
|
|
myGui.Dump()
|
|
})
|
|
}
|
|
|
|
func showCloudflareCredentials(box *gui.Node) {
|
|
// make grid to display credentials
|
|
grid := box.NewGrid("credsGrid", 2, 4) // width = 2
|
|
|
|
grid.NewLabel("Domain")
|
|
domainWidget = grid.NewEntryLine("CF_API_DOMAIN")
|
|
|
|
grid.NewLabel("Zone ID")
|
|
zoneWidget = grid.NewEntryLine("CF_API_ZONEID")
|
|
|
|
grid.NewLabel("Auth Key")
|
|
authWidget = grid.NewEntryLine("CF_API_KEY")
|
|
|
|
grid.NewLabel("Email")
|
|
emailWidget = grid.NewEntryLine("CF_API_EMAIL")
|
|
|
|
var url string = "https://api.cloudflare.com/client/v4/zones/"
|
|
grid.NewLabel("Cloudflare API")
|
|
grid.NewLabel(url)
|
|
|
|
grid.Pad()
|
|
|
|
loadButton = box.NewButton("Load Cloudflare DNS zonefile", func () {
|
|
var domain configT
|
|
domain.domain = domainWidget.S
|
|
domain.zoneID = zoneWidget.S
|
|
domain.auth = authWidget.S
|
|
domain.email = emailWidget.S
|
|
loadDNS(&domain)
|
|
})
|
|
}
|
|
|
|
func readConfig() {
|
|
homeDir, err := os.UserHomeDir()
|
|
if err != nil {
|
|
log.Println("searchPaths() error. exiting here?")
|
|
}
|
|
filename := homeDir + "/" + configfile
|
|
log.Println("filename =", filename)
|
|
|
|
readFileLineByLine(filename)
|
|
// os.Exit(0)
|
|
}
|
|
|
|
// readFileLineByLine opens a file and reads through each line.
|
|
func readFileLineByLine(filename string) error {
|
|
// Open the file.
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
log.Println("readFileLineByLine() =", filename)
|
|
|
|
// Create a new Scanner for the file.
|
|
scanner := bufio.NewScanner(file)
|
|
|
|
// Read through each line using scanner.
|
|
for scanner.Scan() {
|
|
var newc *configT
|
|
newc = new(configT)
|
|
|
|
line := scanner.Text()
|
|
parts := strings.Fields(line)
|
|
|
|
if (len(parts) < 4) {
|
|
log.Println("readFileLineByLine() SKIP =", parts)
|
|
continue
|
|
}
|
|
|
|
newc.domain = parts[0]
|
|
newc.zoneID = parts[1]
|
|
newc.auth = parts[2]
|
|
newc.email = parts[3]
|
|
|
|
config[parts[0]] = newc
|
|
log.Println("readFileLineByLine() =", newc.domain, newc.zoneID, newc.auth, newc.email)
|
|
}
|
|
|
|
// Check for errors during Scan.
|
|
if err := scanner.Err(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|