Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2024-01-10 20:22:25 -06:00
parent ad8a25d85f
commit f8df2d1ce3
10 changed files with 99 additions and 167 deletions

View File

@ -1,6 +1,5 @@
.PHONY: debian .PHONY: debian
run: build run: build
# ./control-panel-dns >/tmp/witgui.log.stderr 2>&1 # ./control-panel-dns >/tmp/witgui.log.stderr 2>&1
cp -f control-panel-dns ~/ cp -f control-panel-dns ~/

View File

@ -42,6 +42,7 @@ type digStatus struct {
speed *gadgets.OneLiner speed *gadgets.OneLiner
speedActual *gadgets.OneLiner speedActual *gadgets.OneLiner
detailsGroup *gui.Node
details *gui.Node details *gui.Node
dsLocalhost *resolverStatus dsLocalhost *resolverStatus
dsLocalNetwork *resolverStatus dsLocalNetwork *resolverStatus
@ -77,7 +78,8 @@ func NewDigStatusWindow(p *gui.Node) *digStatus {
ds.speedActual = gadgets.NewOneLiner(g, "actual").Set("unknown") ds.speedActual = gadgets.NewOneLiner(g, "actual").Set("unknown")
// make the area to store the raw details // make the area to store the raw details
ds.details = ds.window.Box().NewGroup("Details") ds.detailsGroup = ds.window.Box().NewGroup("Details")
ds.details = ds.detailsGroup.NewBox("bw vbox", false)
ds.dsLocalhost = NewResolverStatus(ds.details, "(localhost)", "127.0.0.1:53", "go.wit.com") ds.dsLocalhost = NewResolverStatus(ds.details, "(localhost)", "127.0.0.1:53", "go.wit.com")
ds.dsLocalNetwork = NewResolverStatus(ds.details, "(Local Network)", "192.168.86.1:53", "go.wit.com") ds.dsLocalNetwork = NewResolverStatus(ds.details, "(Local Network)", "192.168.86.1:53", "go.wit.com")
ds.dsCloudflare = NewResolverStatus(ds.details, "(cloudflare)", "1.1.1.1:53", "go.wit.com") ds.dsCloudflare = NewResolverStatus(ds.details, "(cloudflare)", "1.1.1.1:53", "go.wit.com")

15
dns.go
View File

@ -40,6 +40,7 @@ func (h *Host) setIPv4(ipv4s map[string]*IPtype) {
} }
} }
/*
func lookupNSprovider(domain string) string { func lookupNSprovider(domain string) string {
for s, d := range me.nsmap { for s, d := range me.nsmap {
log.Log(CHANGE, "lookupNS() domain =", d, "server =", s) log.Log(CHANGE, "lookupNS() domain =", d, "server =", s)
@ -50,6 +51,7 @@ func lookupNSprovider(domain string) string {
} }
return "blah" return "blah"
} }
*/
// nsLookup performs an NS lookup on the given domain name. // nsLookup performs an NS lookup on the given domain name.
func lookupNS(domain string) { func lookupNS(domain string) {
@ -94,22 +96,15 @@ func lookupNS(domain string) {
} }
} }
// getDomain returns the second-to-last part of a domain name. // returns the second-to-last part of a domain name.
func setProvider(hostname string) { func setProvider(hostname string) {
var provider string = "" var provider string = ""
parts := strings.Split(hostname, ".") parts := strings.Split(hostname, ".")
if len(parts) >= 2 { if len(parts) >= 2 {
provider = parts[len(parts)-2] provider = parts[len(parts)-2]
} }
if me.APIprovider != provider { if me.statusDNS.GetDNSapi() != provider {
log.Log(CHANGE, "setProvider() changed to =", provider) log.Log(CHANGE, "setProvider() changed to =", provider)
} }
me.APIprovider = provider me.statusDNS.SetDNSapi(provider)
/*
if (me.DnsAPI.S != provider) {
me.changed = true
log.Log(CHANGE, "setProvider() changed to =", provider)
me.DnsAPI.SetText(provider)
}
*/
} }

View File

@ -5,6 +5,8 @@
package main package main
import ( import (
"time"
"go.wit.com/log" "go.wit.com/log"
"go.wit.com/gui/gui" "go.wit.com/gui/gui"
"go.wit.com/gui/gadgets" "go.wit.com/gui/gadgets"
@ -27,9 +29,10 @@ type errorBox struct {
} }
type anError struct { type anError struct {
kind string // what kind of error is it? // kind ProblemType // what kind of error is it?
aaaa string // action ActionType
status string // aaaa string
// status string
kindLabel *gui.Node kindLabel *gui.Node
actionLabel *gui.Node actionLabel *gui.Node
@ -89,11 +92,13 @@ func (eb *errorBox) addIPerror(kind ProblemType, action ActionType, ip string) b
tmp := kind.String() + " " + ip tmp := kind.String() + " " + ip
if eb.fixes[tmp] != nil { if eb.fixes[tmp] != nil {
log.Log(WARN, "Error is already here", kind, ip) log.Log(WARN, "Error is already here", kind, ip)
log.Log(WARN, "kind =", kind)
log.Log(WARN, "action =", action)
log.Log(WARN, "ip =", ip)
return false return false
} }
anErr := new(anError) anErr := new(anError)
anErr.aaaa = ip
anErr.kindLabel = eb.grid.NewLabel(kind.String()) anErr.kindLabel = eb.grid.NewLabel(kind.String())
anErr.actionLabel = eb.grid.NewLabel(action.String()) anErr.actionLabel = eb.grid.NewLabel(action.String())
@ -105,7 +110,12 @@ func (eb *errorBox) addIPerror(kind ProblemType, action ActionType, ip string) b
}) })
anErr.problem = new(Problem) anErr.problem = new(Problem)
anErr.problem.kind = kind anErr.problem.kind = kind
anErr.problem.action = action
anErr.problem.aaaa = ip anErr.problem.aaaa = ip
anErr.problem.born = time.Now()
anErr.problem.duration = 30 * time.Second
anErr.problem.begun = false
anErr.problem.begunResult = false
eb.fixes[tmp] = anErr eb.fixes[tmp] = anErr
return false return false
} }
@ -125,22 +135,57 @@ func (eb *errorBox) fix(key string) bool {
return true return true
} }
myErr := eb.fixes[key] myErr := eb.fixes[key]
log.Log(WARN, "should try to fix", myErr.kind, "here. IP =", myErr.aaaa) log.Log(WARN, "should try to fix", myErr.problem.kind, "here. IP =", myErr.problem.aaaa)
if myErr.kind == "DELETE" { if ! me.autofix.B {
if deleteFromDNS(myErr.aaaa) { log.Log(WARN, "not autofixing. autofix == false")
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Worked") log.Log(WARN, "problem.kind =", myErr.problem.kind)
} else { log.Log(WARN, "problem.action =", myErr.problem.action)
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Failed") log.Log(WARN, "problem.aaaa =", myErr.problem.aaaa)
} log.Log(WARN, "problem.duration =", myErr.problem.duration)
return true log.Log(WARN, "problem.begun =", myErr.problem.begun)
log.Log(WARN, "problem.begunResult =", myErr.problem.begunResult)
// if myErr.problem.begunTime != nil {
log.Log(WARN, "problem.begunTime =", myErr.problem.begunTime)
// }
return false
} }
if myErr.kind == "CREATE" { if myErr.problem.begun {
if addToDNS(myErr.aaaa) { log.Log(WARN, "problem has already begun. need to check the status of the problem here")
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Worked") log.Log(WARN, "problem.begun =", myErr.problem.begun)
} else { log.Log(WARN, "problem.begunResult =", myErr.problem.begunResult)
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Failed") log.Log(WARN, "problem.duration =", myErr.problem.duration)
delay := time.Since(myErr.problem.begunTime)
log.Log(WARN, "problem duration time =", delay)
if delay >= myErr.problem.duration {
log.Log(WARN, "duration eclipsed. check the status of the error here")
}
return false
}
if myErr.problem.kind == RR {
if myErr.problem.action == DELETE {
myErr.problem.begun = true
myErr.problem.begunTime = time.Now()
if deleteFromDNS(myErr.problem.aaaa) {
log.Log(INFO, "Delete AAAA", myErr.problem.aaaa, "Worked")
myErr.problem.begunResult = true
} else {
log.Log(INFO, "Delete AAAA", myErr.problem.aaaa, "Failed")
myErr.problem.begunResult = false
}
return true
}
if myErr.problem.action == CREATE {
myErr.problem.begun = true
myErr.problem.begunTime = time.Now()
if addToDNS(myErr.problem.aaaa) {
log.Log(INFO, "Delete AAAA", myErr.problem.aaaa, "Worked")
myErr.problem.begunResult = true
} else {
log.Log(INFO, "Delete AAAA", myErr.problem.aaaa, "Failed")
myErr.problem.begunResult = false
}
return true
} }
return true
} }
return false return false
} }

View File

@ -46,6 +46,7 @@ type hostnameStatus struct {
dnsA *gadgets.OneLiner dnsA *gadgets.OneLiner
dnsAAAA *gadgets.OneLiner dnsAAAA *gadgets.OneLiner
dnsAPI *gadgets.OneLiner dnsAPI *gadgets.OneLiner
APIprovider string
speed *gadgets.OneLiner speed *gadgets.OneLiner
speedActual *gadgets.OneLiner speedActual *gadgets.OneLiner
@ -96,25 +97,6 @@ func NewHostnameStatusWindow(p *gui.Node) *hostnameStatus {
group.Pad() group.Pad()
grid.Pad() grid.Pad()
/*
group = hs.window.Box().NewGroup("Actions")
grid = group.NewGrid("LookupDetails", 2, 2)
hs.dnsValue = grid.NewLabel("3.4.5.6")
hs.dnsAction = grid.NewButton("CHECK", func () {
log.Warn("should", hs.dnsAction.S, "here for", hs.dnsValue.S)
if (hs.dnsAction.S == "DELETE") {
hs.deleteDNSrecord(hs.dnsValue.S)
}
if (hs.dnsAction.S == "CREATE") {
hs.createDNSrecord(hs.dnsValue.S)
}
})
*/
group.Pad()
grid.Pad()
hs.hidden = false hs.hidden = false
hs.ready = true hs.ready = true
return hs return hs
@ -381,5 +363,14 @@ func (hs *hostnameStatus) Hide() {
} }
func (hs *hostnameStatus) GetDNSapi() string { func (hs *hostnameStatus) GetDNSapi() string {
return me.APIprovider return hs.APIprovider
}
func (hs *hostnameStatus) SetDNSapi(api string) {
if api == hs.APIprovider {
return
}
hs.APIprovider = api
hs.dnsAPI.Set(api)
hs.changed = true
} }

View File

@ -1,110 +0,0 @@
/*
Show your IPv6 addresses
*/
package main
import (
"go.wit.com/log"
"go.wit.com/gui/gui"
"go.wit.com/gui/gadgets"
)
type ipv6box struct {
name string // the problem name
parent *gui.Node
group *gui.Node
grid *gui.Node
l *gui.Node
b *gui.Node
fixes map[string]*anError
something *gadgets.OneLiner
}
type anIPv6 struct {
kind string // what kind of error is it?
aaaa string
status string
kindLabel *gui.Node
ipLabel *gui.Node
statusLabel *gui.Node
button *gui.Node
}
func NewIpv6box(p *gui.Node, name string, ip string) *ipv6box {
var ib *ipv6box
ib = new(ipv6box)
ib.parent = p
ib.group = p.NewGroup(name)
ib.grid = ib.group.NewGrid("stuff", 4, 1)
ib.grid.NewLabel("Type")
ib.grid.NewLabel("IP")
ib.grid.NewLabel("Status")
ib.grid.NewLabel("")
ib.fixes = make(map[string]*anError)
return ib
}
func (ib *ipv6box) add(kind string, ip string) bool {
tmp := kind + " " + ip
if ib.fixes[tmp] != nil {
log.Log(WARN, "Error is already here", kind, ip)
return false
}
anErr := new(anError)
anErr.kind = kind
anErr.aaaa = ip
anErr.kindLabel = ib.grid.NewLabel(kind)
anErr.ipLabel = ib.grid.NewLabel(ip)
anErr.statusLabel = ib.grid.NewLabel("")
anErr.button = ib.grid.NewButton(kind, func() {
log.Log(WARN, "got", kind, "here. IP =", ip)
ib.fix(tmp)
})
ib.fixes[tmp] = anErr
return false
}
func (ib *ipv6box) fix(key string) bool {
if ib.fixes[key] == nil {
log.Log(WARN, "Unknown error. could not find key =", key)
log.Log(WARN, "TODO: probably remove this error. key =", key)
return true
}
myErr := ib.fixes[key]
log.Log(WARN, "should try to fix", myErr.kind, "here. IP =", myErr.aaaa)
if myErr.kind == "DELETE" {
if deleteFromDNS(myErr.aaaa) {
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Worked")
} else {
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Failed")
}
return true
}
if myErr.kind == "CREATE" {
if addToDNS(myErr.aaaa) {
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Worked")
} else {
log.Log(INFO, "Delete AAAA", myErr.aaaa, "Failed")
}
return true
}
return false
}
func (ib *ipv6box) update() bool {
return false
}
func (ib *ipv6box) toggle() {
}

View File

@ -123,7 +123,11 @@ func main() {
// lookup the NS records for your domain // lookup the NS records for your domain
// if your host is test.wit.com, find the NS resource records for wit.com // if your host is test.wit.com, find the NS resource records for wit.com
lookupNS(me.statusOS.GetDomainName()) lookupNS(me.statusOS.GetDomainName())
log.Log(CHANGE, "updateDNS() END") log.Log(CHANGE, "lookupNS() RUNNING NOW. this will determine your DNS API provider")
}
if me.statusDNS.GetDNSapi() == "unknown" {
lookupNS(me.statusOS.GetDomainName())
log.Log(CHANGE, "lookupNS() RUNNING NOW. this will determine your DNS API provider")
} }
}) })
s := fmt.Sprint(duration) s := fmt.Sprint(duration)

View File

@ -18,7 +18,12 @@ type Problem struct {
value string value string
aaaa string aaaa string
fixed bool fixed bool
duration *time.Duration duration time.Duration // how long until you should check to see if it's fixed
born time.Time // when first reported
begun bool // weather or not fixing it has begun
begunTime time.Time // when the attempt to fix the problem happened
begunResult bool // weather or not the attempt worked
} }
var IPcreate = Problem { var IPcreate = Problem {
@ -62,9 +67,9 @@ func (s ProblemType) String() string {
case RR: case RR:
return "RR" return "RR"
default: default:
return "something" return "FIXMEP"
} }
return "someprob" return "FIXMEP"
} }
func (s ActionType) String() string { func (s ActionType) String() string {
@ -76,7 +81,7 @@ func (s ActionType) String() string {
case DELETE: case DELETE:
return "DELETE" return "DELETE"
default: default:
return "something" return "FIXMEA"
} }
return "someprob" return "FIXMEA"
} }

View File

@ -71,6 +71,7 @@ func NewResolverStatus(p *gui.Node, title string, server string, hostname string
rs = new(resolverStatus) rs = new(resolverStatus)
rs.parent = p rs.parent = p
rs.group = p.NewGroup(server + " " + title + " lookup") rs.group = p.NewGroup(server + " " + title + " lookup")
rs.group = rs.group.NewBox("bw vbox", false)
rs.grid = rs.group.NewGrid("LookupStatus", 5, 2) rs.grid = rs.group.NewGrid("LookupStatus", 5, 2)
rs.server = server rs.server = server

View File

@ -29,7 +29,7 @@ type Host struct {
// WHEN THESE ARE ALL "WORKING", then everything is good // WHEN THESE ARE ALL "WORKING", then everything is good
hostnameStatus *gui.Node // a summary for the user of where things are hostnameStatus *gui.Node // a summary for the user of where things are
DnsAPIstatus *gui.Node // does your DNS API work? DnsAPIstatus *gui.Node // does your DNS API work?
APIprovider string // APIprovider string
apiButton *gui.Node // the button you click for the API config page apiButton *gui.Node // the button you click for the API config page
artificialSleep float64 `default:"0.7"` // artificial sleep on startup artificialSleep float64 `default:"0.7"` // artificial sleep on startup