From 25033569e7d8daca9627651030c122d1f033b17e Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 1 Feb 2024 09:24:07 -0600 Subject: rename files Signed-off-by: Jeff Carr --- digStatus.go | 357 ------------------------------------------- digStatusWindow.go | 357 +++++++++++++++++++++++++++++++++++++++++++ hostnameStatus.go | 397 ------------------------------------------------ hostnameStatusWindow.go | 397 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 754 insertions(+), 754 deletions(-) delete mode 100644 digStatus.go create mode 100644 digStatusWindow.go delete mode 100644 hostnameStatus.go create mode 100644 hostnameStatusWindow.go diff --git a/digStatus.go b/digStatus.go deleted file mode 100644 index 5722f47..0000000 --- a/digStatus.go +++ /dev/null @@ -1,357 +0,0 @@ -/* - 'dig' - - This is essentially doing what the command 'dig' does - It performing DNS queries on TCP and UDP - against localhost, cloudflare & google - - IPv4() and IPv6() return true if they are working - - with the 'gui' package, it can also display the results -*/ - -package main - -import ( - "errors" - "fmt" - "os" - "reflect" - "time" - - "go.wit.com/gui" - "go.wit.com/lib/gadgets" - "go.wit.com/lib/gui/shell" - "go.wit.com/log" -) - -type digStatus struct { - ready bool - hidden bool - statusIPv4 string - statusIPv6 string - - parent *gui.Node - window *gadgets.BasicWindow - group *gui.Node - grid *gui.Node - - summary *gui.Node - status *gadgets.OneLiner - statusAAAA *gadgets.OneLiner - speed *gadgets.OneLiner - speedActual *gadgets.OneLiner - - detailsGroup *gui.Node - details *gui.Node - dsLocalhost *resolverStatus - dsLocalNetwork *resolverStatus - dsCloudflare *resolverStatus - dsGoogle *resolverStatus - DnsDigUDP *gui.Node - DnsDigTCP *gui.Node - - httpGoWitCom *gadgets.OneLiner - statusHTTP *gadgets.OneLiner -} - -func NewDigStatusWindow(p *gui.Node) *digStatus { - var ds *digStatus - ds = new(digStatus) - - ds.ready = false - ds.hidden = true - - ds.window = gadgets.NewBasicWindow(p, "DNS Resolver Status") - ds.window.Make() - // ds.window.Draw() - // ds.window.Hide() - - // summary of the current state of things - ds.summary = ds.window.Box().NewGroup("Summary") - g := ds.summary.NewGrid("LookupStatus", 2, 2) - g.Pad() - - ds.status = gadgets.NewOneLiner(g, "status").SetText("unknown") - ds.statusAAAA = gadgets.NewOneLiner(g, "IPv6 status").SetText("unknown") - ds.statusHTTP = gadgets.NewOneLiner(g, "IPv6 via HTTP").SetText("unknown") - ds.speed = gadgets.NewOneLiner(g, "speed").SetText("unknown") - ds.speedActual = gadgets.NewOneLiner(g, "actual").SetText("unknown") - - // make the area to store the raw 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.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.dsGoogle = NewResolverStatus(ds.details, "(google)", "8.8.8.8:53", "go.wit.com") - ds.makeDnsStatusGrid() - ds.makeHttpStatusGrid() - - ds.hidden = false - ds.ready = true - return ds -} - -func (ds *digStatus) Update() { - log.Info("digStatus() Update() START") - if ds == nil { - log.Error(errors.New("digStatus() Update() ds == nil")) - return - } - duration := timeFunction(func() { - ds.updateDnsStatus() - }) - s := fmt.Sprint(duration) - // ds.speedActual.SetText(s) - me.digStatus.set(ds.speedActual, s) - - if duration > 500*time.Millisecond { - me.digStatus.set(ds.speed, "SLOW") - } else if duration > 100*time.Millisecond { - me.digStatus.set(ds.speed, "OK") - } else { - me.digStatus.set(ds.speed, "FAST") - } - log.Info("digStatus() Update() END") -} - -// Returns true if the status is valid -func (ds *digStatus) Ready() bool { - if ds == nil { - return false - } - return ds.ready -} - -// Returns true if IPv4 is working -func (ds *digStatus) IPv4() bool { - if !ds.Ready() { - return false - } - if ds.statusIPv4 == "OK" { - return true - } - if ds.statusIPv4 == "GOOD" { - return true - } - return false -} - -// Returns true if IPv6 is working -func (ds *digStatus) IPv6() bool { - if !ds.Ready() { - return false - } - if ds.statusIPv6 == "GOOD" { - return true - } - return false -} - -func (ds *digStatus) setIPv4status(s string) { - ds.statusIPv4 = s - if !ds.Ready() { - return - } - me.digStatus.set(ds.status, s) -} - -func (ds *digStatus) setIPv6status(s string) { - ds.statusIPv6 = s - if !ds.Ready() { - return - } - me.digStatus.set(ds.statusAAAA, s) -} - -/* -func (ds *digStatus) SetIPv6(s string) { - if ! ds.Ready() {return} - log.Warn("Should SetIPv6() here to", s) - log.Warn("Should SetIPv6() here to", s) - log.Warn("Should SetIPv6() here to", s) - log.Warn("Should SetIPv6() here to", s) - me.DnsAAAA.SetText(s) - // me.digStatus.set(ds.httpGoWitCom, addr) -} -*/ - -func (ds *digStatus) set(a any, s string) { - if !ds.Ready() { - return - } - if ds.hidden { - return - } - if a == nil { - return - } - var n *gui.Node - if reflect.TypeOf(a) == reflect.TypeOf(n) { - n = a.(*gui.Node) - n.SetText(s) - return - } - var ol *gadgets.OneLiner - if reflect.TypeOf(a) == reflect.TypeOf(ol) { - ol = a.(*gadgets.OneLiner) - ol.SetText(s) - return - } - log.Warn("unknown type TypeOf(a) =", reflect.TypeOf(a), "a =", a) - os.Exit(0) -} - -func (ds *digStatus) updateDnsStatus() { - var cmd, out string - var ipv4, ipv6 bool - - log.Info("updateDnsStatus() START") - if ds == nil { - log.Error(errors.New("updateDnsStatus() not initialized yet. ds == nil")) - return - } - - if !ds.ready { - log.Error(errors.New("updateDnsStatus() not ready yet")) - return - } - - ipv4, ipv6 = ds.dsLocalhost.update() - ipv4, ipv6 = ds.dsLocalNetwork.update() - ipv4, ipv6 = ds.dsCloudflare.update() - ipv4, ipv6 = ds.dsGoogle.update() - - if me.statusOS.ValidHostname() { - if ds.checkLookupDoH(me.statusOS.GetHostname()) { - log.Log(DNS, "updateDnsStatus() HTTP DNS lookups working") - me.digStatus.set(ds.statusHTTP, "WORKING") - } else { - log.Log(DNS, "updateDnsStatus() HTTP DNS lookups not working") - log.Log(DNS, "updateDnsStatus() It's really unlikely you are on the internet") - me.digStatus.set(ds.statusHTTP, "BROKEN") - } - } else { - me.digStatus.set(ds.statusHTTP, "INVALID HOSTNAME") - } - - if ipv4 { - log.Log(DNS, "updateDnsStatus() IPv4 A lookups working") - ds.setIPv4status("OK") - } else { - log.Log(DNS, "updateDnsStatus() IPv4 A lookups not working. No internet?") - ds.setIPv4status("No Internet?") - } - if ipv6 { - log.Log(DNS, "updateDnsStatus() IPv6 AAAA lookups working") - ds.setIPv4status("GOOD") - ds.setIPv6status("GOOD") - } else { - log.Log(DNS, "updateDnsStatus() IPv6 AAAA lookups are not working") - ds.setIPv6status("Need VPN") - } - - cmd = "dig +noall +answer www.wit.com A" - out = shell.Run(cmd) - log.Log(DNS, "makeDnsStatusGrid() dig", out) - me.digStatus.set(ds.DnsDigUDP, out) - - cmd = "dig +noall +answer www.wit.com AAAA" - out = shell.Run(cmd) - log.Log(DNS, "makeDnsStatusGrid() dig", out) - me.digStatus.set(ds.DnsDigTCP, out) - - /* - g2.NewButton("dig +trace", func () { - log.Log(NOW, "TODO: redo this") - // o := shell.Run("dig +trace +noadditional DS " + me.hostname + " @8.8.8.8") - // log.Println(o) - }) - */ -} - -func (ds *digStatus) makeHttpStatusGrid() { - group := ds.details.NewGroup("dns.google.com via HTTPS") - grid := group.NewGrid("LookupStatus", 2, 2) - - ds.httpGoWitCom = gadgets.NewOneLiner(grid, "go.wit.com") - me.digStatus.set(ds.httpGoWitCom, "unknown") - - group.Pad() - grid.Pad() -} - -func (ds *digStatus) makeDnsStatusGrid() { - var cmd, out string - group := ds.details.NewGroup("dig results") - grid := group.NewGrid("LookupStatus", 2, 2) - - cmd = "dig +noall +answer go.wit.com A" - grid.NewLabel(cmd) - ds.DnsDigUDP = grid.NewLabel("?") - out = shell.Run(cmd) - log.Log(DNS, "makeDnsStatusGrid() dig", out) - me.digStatus.set(ds.DnsDigUDP, out) - - cmd = "dig +noall +answer go.wit.com AAAA" - grid.NewLabel(cmd) - ds.DnsDigTCP = grid.NewLabel("?") - out = shell.Run(cmd) - log.Log(DNS, "makeDnsStatusGrid() dig", out) - me.digStatus.set(ds.DnsDigTCP, out) - - group.Pad() - grid.Pad() -} - -func (ds *digStatus) checkLookupDoH(hostname string) bool { - var status bool = false - - ipv6Addresses := lookupDoH(hostname, "AAAA") - - log.Log(DNS, "IPv6 Addresses for ", hostname) - var s []string - for _, addr := range ipv6Addresses { - log.Log(DNS, addr) - s = append(s, addr) - status = true - } - // me.digStatus.SetIPv6(strings.Join(s, "\n")) - return status -} - -func (ds *digStatus) Show() { - log.Info("digStatus.Show() window") - if me.digStatus.hidden { - me.digStatus.window.Show() - } - me.digStatus.hidden = false -} - -func (ds *digStatus) Hide() { - log.Info("digStatus.Hide() window") - if !me.digStatus.hidden { - me.digStatus.window.Hide() - } - me.digStatus.hidden = true -} - -func digLoop() { - me.digStatus.Update() - - if me.digStatus.Ready() { - current := me.statusIPv6.String() - if me.digStatus.IPv6() { - if current != "WORKING" { - log.Log(CHANGE, "IPv6 resolution is WORKING") - me.statusIPv6.SetText("WORKING") - } - } else { - if current != "Need VPN" { - log.Log(CHANGE, "IPv6 resolution seems to have broken") - me.statusIPv6.SetText("Need VPN") - } - } - } -} diff --git a/digStatusWindow.go b/digStatusWindow.go new file mode 100644 index 0000000..5722f47 --- /dev/null +++ b/digStatusWindow.go @@ -0,0 +1,357 @@ +/* + 'dig' + + This is essentially doing what the command 'dig' does + It performing DNS queries on TCP and UDP + against localhost, cloudflare & google + + IPv4() and IPv6() return true if they are working + + with the 'gui' package, it can also display the results +*/ + +package main + +import ( + "errors" + "fmt" + "os" + "reflect" + "time" + + "go.wit.com/gui" + "go.wit.com/lib/gadgets" + "go.wit.com/lib/gui/shell" + "go.wit.com/log" +) + +type digStatus struct { + ready bool + hidden bool + statusIPv4 string + statusIPv6 string + + parent *gui.Node + window *gadgets.BasicWindow + group *gui.Node + grid *gui.Node + + summary *gui.Node + status *gadgets.OneLiner + statusAAAA *gadgets.OneLiner + speed *gadgets.OneLiner + speedActual *gadgets.OneLiner + + detailsGroup *gui.Node + details *gui.Node + dsLocalhost *resolverStatus + dsLocalNetwork *resolverStatus + dsCloudflare *resolverStatus + dsGoogle *resolverStatus + DnsDigUDP *gui.Node + DnsDigTCP *gui.Node + + httpGoWitCom *gadgets.OneLiner + statusHTTP *gadgets.OneLiner +} + +func NewDigStatusWindow(p *gui.Node) *digStatus { + var ds *digStatus + ds = new(digStatus) + + ds.ready = false + ds.hidden = true + + ds.window = gadgets.NewBasicWindow(p, "DNS Resolver Status") + ds.window.Make() + // ds.window.Draw() + // ds.window.Hide() + + // summary of the current state of things + ds.summary = ds.window.Box().NewGroup("Summary") + g := ds.summary.NewGrid("LookupStatus", 2, 2) + g.Pad() + + ds.status = gadgets.NewOneLiner(g, "status").SetText("unknown") + ds.statusAAAA = gadgets.NewOneLiner(g, "IPv6 status").SetText("unknown") + ds.statusHTTP = gadgets.NewOneLiner(g, "IPv6 via HTTP").SetText("unknown") + ds.speed = gadgets.NewOneLiner(g, "speed").SetText("unknown") + ds.speedActual = gadgets.NewOneLiner(g, "actual").SetText("unknown") + + // make the area to store the raw 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.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.dsGoogle = NewResolverStatus(ds.details, "(google)", "8.8.8.8:53", "go.wit.com") + ds.makeDnsStatusGrid() + ds.makeHttpStatusGrid() + + ds.hidden = false + ds.ready = true + return ds +} + +func (ds *digStatus) Update() { + log.Info("digStatus() Update() START") + if ds == nil { + log.Error(errors.New("digStatus() Update() ds == nil")) + return + } + duration := timeFunction(func() { + ds.updateDnsStatus() + }) + s := fmt.Sprint(duration) + // ds.speedActual.SetText(s) + me.digStatus.set(ds.speedActual, s) + + if duration > 500*time.Millisecond { + me.digStatus.set(ds.speed, "SLOW") + } else if duration > 100*time.Millisecond { + me.digStatus.set(ds.speed, "OK") + } else { + me.digStatus.set(ds.speed, "FAST") + } + log.Info("digStatus() Update() END") +} + +// Returns true if the status is valid +func (ds *digStatus) Ready() bool { + if ds == nil { + return false + } + return ds.ready +} + +// Returns true if IPv4 is working +func (ds *digStatus) IPv4() bool { + if !ds.Ready() { + return false + } + if ds.statusIPv4 == "OK" { + return true + } + if ds.statusIPv4 == "GOOD" { + return true + } + return false +} + +// Returns true if IPv6 is working +func (ds *digStatus) IPv6() bool { + if !ds.Ready() { + return false + } + if ds.statusIPv6 == "GOOD" { + return true + } + return false +} + +func (ds *digStatus) setIPv4status(s string) { + ds.statusIPv4 = s + if !ds.Ready() { + return + } + me.digStatus.set(ds.status, s) +} + +func (ds *digStatus) setIPv6status(s string) { + ds.statusIPv6 = s + if !ds.Ready() { + return + } + me.digStatus.set(ds.statusAAAA, s) +} + +/* +func (ds *digStatus) SetIPv6(s string) { + if ! ds.Ready() {return} + log.Warn("Should SetIPv6() here to", s) + log.Warn("Should SetIPv6() here to", s) + log.Warn("Should SetIPv6() here to", s) + log.Warn("Should SetIPv6() here to", s) + me.DnsAAAA.SetText(s) + // me.digStatus.set(ds.httpGoWitCom, addr) +} +*/ + +func (ds *digStatus) set(a any, s string) { + if !ds.Ready() { + return + } + if ds.hidden { + return + } + if a == nil { + return + } + var n *gui.Node + if reflect.TypeOf(a) == reflect.TypeOf(n) { + n = a.(*gui.Node) + n.SetText(s) + return + } + var ol *gadgets.OneLiner + if reflect.TypeOf(a) == reflect.TypeOf(ol) { + ol = a.(*gadgets.OneLiner) + ol.SetText(s) + return + } + log.Warn("unknown type TypeOf(a) =", reflect.TypeOf(a), "a =", a) + os.Exit(0) +} + +func (ds *digStatus) updateDnsStatus() { + var cmd, out string + var ipv4, ipv6 bool + + log.Info("updateDnsStatus() START") + if ds == nil { + log.Error(errors.New("updateDnsStatus() not initialized yet. ds == nil")) + return + } + + if !ds.ready { + log.Error(errors.New("updateDnsStatus() not ready yet")) + return + } + + ipv4, ipv6 = ds.dsLocalhost.update() + ipv4, ipv6 = ds.dsLocalNetwork.update() + ipv4, ipv6 = ds.dsCloudflare.update() + ipv4, ipv6 = ds.dsGoogle.update() + + if me.statusOS.ValidHostname() { + if ds.checkLookupDoH(me.statusOS.GetHostname()) { + log.Log(DNS, "updateDnsStatus() HTTP DNS lookups working") + me.digStatus.set(ds.statusHTTP, "WORKING") + } else { + log.Log(DNS, "updateDnsStatus() HTTP DNS lookups not working") + log.Log(DNS, "updateDnsStatus() It's really unlikely you are on the internet") + me.digStatus.set(ds.statusHTTP, "BROKEN") + } + } else { + me.digStatus.set(ds.statusHTTP, "INVALID HOSTNAME") + } + + if ipv4 { + log.Log(DNS, "updateDnsStatus() IPv4 A lookups working") + ds.setIPv4status("OK") + } else { + log.Log(DNS, "updateDnsStatus() IPv4 A lookups not working. No internet?") + ds.setIPv4status("No Internet?") + } + if ipv6 { + log.Log(DNS, "updateDnsStatus() IPv6 AAAA lookups working") + ds.setIPv4status("GOOD") + ds.setIPv6status("GOOD") + } else { + log.Log(DNS, "updateDnsStatus() IPv6 AAAA lookups are not working") + ds.setIPv6status("Need VPN") + } + + cmd = "dig +noall +answer www.wit.com A" + out = shell.Run(cmd) + log.Log(DNS, "makeDnsStatusGrid() dig", out) + me.digStatus.set(ds.DnsDigUDP, out) + + cmd = "dig +noall +answer www.wit.com AAAA" + out = shell.Run(cmd) + log.Log(DNS, "makeDnsStatusGrid() dig", out) + me.digStatus.set(ds.DnsDigTCP, out) + + /* + g2.NewButton("dig +trace", func () { + log.Log(NOW, "TODO: redo this") + // o := shell.Run("dig +trace +noadditional DS " + me.hostname + " @8.8.8.8") + // log.Println(o) + }) + */ +} + +func (ds *digStatus) makeHttpStatusGrid() { + group := ds.details.NewGroup("dns.google.com via HTTPS") + grid := group.NewGrid("LookupStatus", 2, 2) + + ds.httpGoWitCom = gadgets.NewOneLiner(grid, "go.wit.com") + me.digStatus.set(ds.httpGoWitCom, "unknown") + + group.Pad() + grid.Pad() +} + +func (ds *digStatus) makeDnsStatusGrid() { + var cmd, out string + group := ds.details.NewGroup("dig results") + grid := group.NewGrid("LookupStatus", 2, 2) + + cmd = "dig +noall +answer go.wit.com A" + grid.NewLabel(cmd) + ds.DnsDigUDP = grid.NewLabel("?") + out = shell.Run(cmd) + log.Log(DNS, "makeDnsStatusGrid() dig", out) + me.digStatus.set(ds.DnsDigUDP, out) + + cmd = "dig +noall +answer go.wit.com AAAA" + grid.NewLabel(cmd) + ds.DnsDigTCP = grid.NewLabel("?") + out = shell.Run(cmd) + log.Log(DNS, "makeDnsStatusGrid() dig", out) + me.digStatus.set(ds.DnsDigTCP, out) + + group.Pad() + grid.Pad() +} + +func (ds *digStatus) checkLookupDoH(hostname string) bool { + var status bool = false + + ipv6Addresses := lookupDoH(hostname, "AAAA") + + log.Log(DNS, "IPv6 Addresses for ", hostname) + var s []string + for _, addr := range ipv6Addresses { + log.Log(DNS, addr) + s = append(s, addr) + status = true + } + // me.digStatus.SetIPv6(strings.Join(s, "\n")) + return status +} + +func (ds *digStatus) Show() { + log.Info("digStatus.Show() window") + if me.digStatus.hidden { + me.digStatus.window.Show() + } + me.digStatus.hidden = false +} + +func (ds *digStatus) Hide() { + log.Info("digStatus.Hide() window") + if !me.digStatus.hidden { + me.digStatus.window.Hide() + } + me.digStatus.hidden = true +} + +func digLoop() { + me.digStatus.Update() + + if me.digStatus.Ready() { + current := me.statusIPv6.String() + if me.digStatus.IPv6() { + if current != "WORKING" { + log.Log(CHANGE, "IPv6 resolution is WORKING") + me.statusIPv6.SetText("WORKING") + } + } else { + if current != "Need VPN" { + log.Log(CHANGE, "IPv6 resolution seems to have broken") + me.statusIPv6.SetText("Need VPN") + } + } + } +} diff --git a/hostnameStatus.go b/hostnameStatus.go deleted file mode 100644 index 04f75d4..0000000 --- a/hostnameStatus.go +++ /dev/null @@ -1,397 +0,0 @@ -/* - figures out if your hostname is valid - then checks if your DNS is setup correctly -*/ - -package main - -import ( - "errors" - "fmt" - "os" - "reflect" - "sort" - "strings" - "time" - - "go.wit.com/gui" - "go.wit.com/lib/gadgets" - "go.wit.com/log" -) - -type hostnameStatus struct { - ready bool - hidden bool - changed bool - - lastname string // used to watch for changes in the hostname - - window *gadgets.BasicWindow - - // Primary Directives - status *gadgets.OneLiner - summary *gadgets.OneLiner - statusIPv4 *gadgets.OneLiner - statusIPv6 *gadgets.OneLiner - - hostname *gadgets.OneLiner - domainname *gadgets.OneLiner - - // what the current IP addresses your network has given you - currentIPv4 *gadgets.OneLiner - currentIPv6 *gadgets.OneLiner - - // what the DNS servers have - NSrr *gadgets.OneLiner - dnsA *gadgets.OneLiner - dnsAAAA *gadgets.OneLiner - dnsAPI *gadgets.OneLiner - APIprovider string - - speed *gadgets.OneLiner - speedActual *gadgets.OneLiner - - // Actions - // dnsValue *gui.Node - // dnsAction *gui.Node -} - -func NewHostnameStatusWindow(p *gui.Node) *hostnameStatus { - var hs *hostnameStatus - hs = new(hostnameStatus) - - hs.ready = false - hs.hidden = true - // hs.hostname = me.hostname - - hs.window = gadgets.NewBasicWindow(p, "fix hostname here"+" Status") - hs.window.Make() - // hs.window.Draw() - // hs.window.Hide() - - group := hs.window.Box().NewGroup("Summary") - grid := group.NewGrid("LookupStatus", 2, 2) - - hs.status = gadgets.NewOneLiner(grid, "status").SetText("unknown") - hs.statusIPv4 = gadgets.NewOneLiner(grid, "IPv4").SetText("unknown") - hs.statusIPv6 = gadgets.NewOneLiner(grid, "IPv6").SetText("unknown") - - group.Pad() - grid.Pad() - - group = hs.window.Box().NewGroup("Details") - grid = group.NewGrid("LookupDetails", 2, 2) - - hs.hostname = gadgets.NewOneLiner(grid, "hostname") - hs.domainname = gadgets.NewOneLiner(grid, "domain name") - hs.currentIPv4 = gadgets.NewOneLiner(grid, "Current IPv4") - hs.currentIPv6 = gadgets.NewOneLiner(grid, "Current IPv6") - - hs.NSrr = gadgets.NewOneLiner(grid, "dns NS records").SetText("unknown") - hs.dnsAPI = gadgets.NewOneLiner(grid, "dns API provider").SetText("unknown") - hs.dnsA = gadgets.NewOneLiner(grid, "dns IPv4 resource records").SetText("unknown") - hs.dnsAAAA = gadgets.NewOneLiner(grid, "dns IPv6 resource records").SetText("unknown") - - hs.speed = gadgets.NewOneLiner(grid, "speed").SetText("unknown") - hs.speedActual = gadgets.NewOneLiner(grid, "actual").SetText("unknown") - - group.Pad() - grid.Pad() - - hs.hidden = false - hs.ready = true - return hs -} - -func (hs *hostnameStatus) Domain() string { - if !hs.Ready() { - return "" - } - return hs.domainname.String() -} - -func (hs *hostnameStatus) API() string { - if !hs.Ready() { - return "" - } - return hs.dnsAPI.String() -} - -func (hs *hostnameStatus) Update() { - log.Info("hostnameStatus() Update() START") - if hs == nil { - log.Error(errors.New("hostnameStatus() Update() hs == nil")) - return - } - duration := timeFunction(func() { - hs.updateStatus() - }) - s := fmt.Sprint(duration) - hs.set(hs.speedActual, s) - - if duration > 500*time.Millisecond { - hs.set(hs.speed, "SLOW") - } else if duration > 100*time.Millisecond { - hs.set(hs.speed, "OK") - } else { - hs.set(hs.speed, "FAST") - } - log.Info("hostnameStatus() Update() END") -} - -// Returns true if the status is valid -func (hs *hostnameStatus) Ready() bool { - if hs == nil { - return false - } - return hs.ready -} - -// Returns true if IPv4 is working -func (hs *hostnameStatus) IPv4() bool { - if !hs.Ready() { - return false - } - if hs.statusIPv4.String() == "OK" { - return true - } - if hs.statusIPv4.String() == "GOOD" { - return true - } - return false -} - -// Returns true if IPv6 is working -func (hs *hostnameStatus) IPv6() bool { - if !hs.Ready() { - return false - } - if hs.statusIPv6.String() == "GOOD" { - return true - } - return false -} - -func (hs *hostnameStatus) setIPv4(s string) { - if !hs.Ready() { - return - } - hs.statusIPv4.SetText(s) -} - -func (hs *hostnameStatus) setIPv6(s string) { - if !hs.Ready() { - return - } - hs.statusIPv6.SetText(s) -} - -func (hs *hostnameStatus) set(a any, s string) { - if !hs.Ready() { - return - } - if hs.hidden { - return - } - if a == nil { - return - } - var n *gui.Node - if reflect.TypeOf(a) == reflect.TypeOf(n) { - n = a.(*gui.Node) - n.SetText(s) - return - } - var ol *gadgets.OneLiner - if reflect.TypeOf(a) == reflect.TypeOf(ol) { - ol = a.(*gadgets.OneLiner) - if ol == nil { - // log.Println("ol = nil", reflect.TypeOf(a), "a =", a) - return - } - // log.Println("SETTING ol:", ol) - ol.SetText(s) - return - } - log.Warn("unknown type TypeOf(a) =", reflect.TypeOf(a), "a =", a) - os.Exit(0) -} - -// returns true if AAAA record already exists in DNS -func (hs *hostnameStatus) existsAAAA(s string) bool { - log.Log(NOW, "existsAAAA() try to see if AAAA is already set", s) - return false -} - -func (hs *hostnameStatus) GetIPv6() []string { - if !hs.Ready() { - return nil - } - return strings.Split(hs.dnsAAAA.String(), "\n") -} - -func (hs *hostnameStatus) updateStatus() { - if !hs.Ready() { - return - } - var s string - var vals []string - log.Log(STATUS, "updateStatus() START") - - // copy the OS status over - lasthostname := hs.hostname.String() - hostname := me.statusOS.GetHostname() - - // hostname changed or was setup for the first time. Set the window title, etc - if lasthostname != hostname { - me.changed = true - hs.hostname.SetText(hostname) - hs.window.SetLabel(hostname + " Status") - me.statusDNSbutton.SetLabel(hostname + " status") - } - hs.domainname.SetText(me.statusOS.GetDomainName()) - - var tmp []string - tmp = me.statusOS.GetIPv4() - sort.Strings(tmp) - s = strings.Join(tmp, "\n") - if s != hs.currentIPv4.String() { - log.Log(CHANGE, "DNS IPv4 Addresses changed", tmp) - hs.currentIPv4.SetText(s) - hs.changed = true - } - - tmp = me.statusOS.GetIPv6() - sort.Strings(tmp) - s = strings.Join(tmp, "\n") - if s != hs.currentIPv6.String() { - log.Log(CHANGE, "DNS IPv6 Addresses changed", tmp) - hs.currentIPv6.SetText(s) - hs.changed = true - } - - if me.statusOS.ValidHostname() { - vals = lookupDoH(me.statusOS.GetHostname(), "AAAA") - - log.Log(STATUS, "DNS IPv6 Addresses for ", me.statusOS.GetHostname(), "=", vals) - hs.dnsAAAA.SetText(strings.Join(vals, "\n")) - - vals = lookupDoH(me.statusOS.GetHostname(), "A") - log.Log(STATUS, "IPv4 Addresses for ", me.statusOS.GetHostname(), "=", vals) - s = strings.Join(vals, "\n") - if s == "" { - s = "(none)" - hs.setIPv4("NEEDS CNAME") - } - hs.set(hs.dnsA, s) - - vals = lookupDoH(me.statusOS.GetHostname(), "CNAME") - s = strings.Join(vals, "\n") - if s != "" { - hs.set(hs.dnsA, "CNAME "+s) - hs.setIPv4("GOOD") - } - if hs.changed { - log.Log(CHANGE, "stuff changed. trying fixIPv6dns()") - fixIPv6dns() - hs.changed = false - } - } - - if hs.IPv4() && hs.IPv6() { - hs.status.SetText("GOOD") - } else { - hs.status.SetText("BROKEN") - } - - last := hs.statusIPv6.String() - if hs.verifyIPv6() { - if last != "WORKING" { - log.Log(CHANGE, "Your DNS IPv6 has started working.", me.statusOS.GetHostname(), "should now work") - hs.changed = true - hs.statusIPv6.SetText("WORKING") - me.DnsStatus.SetText("WORKING") - } - } else { - if last != "BROKEN" { - log.Log(CHANGE, "Your DNS entries for IPv6 have BROKEN") - hs.changed = true - hs.statusIPv6.SetText("BROKEN") - me.DnsStatus.SetText("BROKEN") - } - } -} - -func (hs *hostnameStatus) verifyIPv6() bool { - var working bool = true - osAAAA := make(map[string]string) - dnsAAAA := make(map[string]string) - - log.Log(INFO, "What are the AAAA resource records in the OS?") - tmp := me.statusOS.GetIPv6() - if len(tmp) == 0 { - // you don't have any IPv6 addresses in your OS right now - return false - } - for _, aaaa := range me.statusOS.GetIPv6() { - log.Log(INFO, "FOUND OS AAAA ip", aaaa) - osAAAA[aaaa] = "os" - } - - log.Log(INFO, "What are the AAAA resource records in DNS?") - for _, aaaa := range me.statusDNS.GetIPv6() { - log.Log(INFO, "FOUND DNS AAAA ip", aaaa) - dnsAAAA[aaaa] = "dns" - } - - for aaaa, _ := range dnsAAAA { - if osAAAA[aaaa] == "os" { - log.Log(INFO, "DNS AAAA is in OS", aaaa) - } else { - working = false - log.Log(INFO, "DNS AAAA is not in OS", aaaa) - addToFixWindow("DELETE", aaaa) - } - } - - for aaaa, _ := range osAAAA { - if dnsAAAA[aaaa] == "dns" { - log.Log(INFO, "OS AAAA is in DNS", aaaa) - } else { - working = false - log.Log(INFO, "OS AAAA is not in DNS", aaaa) - addToFixWindow("CREATE", aaaa) - } - } - - return working -} - -func (hs *hostnameStatus) Show() { - log.Log(STATUS, "hostnameStatus.Show() window") - if hs.hidden { - hs.window.Show() - } - hs.hidden = false -} - -func (hs *hostnameStatus) Hide() { - log.Log(STATUS, "hostnameStatus.Hide() window") - if !hs.hidden { - hs.window.Hide() - } - hs.hidden = true -} - -func (hs *hostnameStatus) GetDNSapi() string { - return hs.APIprovider -} - -func (hs *hostnameStatus) SetDNSapi(api string) { - if api == hs.APIprovider { - return - } - hs.APIprovider = api - hs.dnsAPI.SetText(api) - hs.changed = true -} diff --git a/hostnameStatusWindow.go b/hostnameStatusWindow.go new file mode 100644 index 0000000..04f75d4 --- /dev/null +++ b/hostnameStatusWindow.go @@ -0,0 +1,397 @@ +/* + figures out if your hostname is valid + then checks if your DNS is setup correctly +*/ + +package main + +import ( + "errors" + "fmt" + "os" + "reflect" + "sort" + "strings" + "time" + + "go.wit.com/gui" + "go.wit.com/lib/gadgets" + "go.wit.com/log" +) + +type hostnameStatus struct { + ready bool + hidden bool + changed bool + + lastname string // used to watch for changes in the hostname + + window *gadgets.BasicWindow + + // Primary Directives + status *gadgets.OneLiner + summary *gadgets.OneLiner + statusIPv4 *gadgets.OneLiner + statusIPv6 *gadgets.OneLiner + + hostname *gadgets.OneLiner + domainname *gadgets.OneLiner + + // what the current IP addresses your network has given you + currentIPv4 *gadgets.OneLiner + currentIPv6 *gadgets.OneLiner + + // what the DNS servers have + NSrr *gadgets.OneLiner + dnsA *gadgets.OneLiner + dnsAAAA *gadgets.OneLiner + dnsAPI *gadgets.OneLiner + APIprovider string + + speed *gadgets.OneLiner + speedActual *gadgets.OneLiner + + // Actions + // dnsValue *gui.Node + // dnsAction *gui.Node +} + +func NewHostnameStatusWindow(p *gui.Node) *hostnameStatus { + var hs *hostnameStatus + hs = new(hostnameStatus) + + hs.ready = false + hs.hidden = true + // hs.hostname = me.hostname + + hs.window = gadgets.NewBasicWindow(p, "fix hostname here"+" Status") + hs.window.Make() + // hs.window.Draw() + // hs.window.Hide() + + group := hs.window.Box().NewGroup("Summary") + grid := group.NewGrid("LookupStatus", 2, 2) + + hs.status = gadgets.NewOneLiner(grid, "status").SetText("unknown") + hs.statusIPv4 = gadgets.NewOneLiner(grid, "IPv4").SetText("unknown") + hs.statusIPv6 = gadgets.NewOneLiner(grid, "IPv6").SetText("unknown") + + group.Pad() + grid.Pad() + + group = hs.window.Box().NewGroup("Details") + grid = group.NewGrid("LookupDetails", 2, 2) + + hs.hostname = gadgets.NewOneLiner(grid, "hostname") + hs.domainname = gadgets.NewOneLiner(grid, "domain name") + hs.currentIPv4 = gadgets.NewOneLiner(grid, "Current IPv4") + hs.currentIPv6 = gadgets.NewOneLiner(grid, "Current IPv6") + + hs.NSrr = gadgets.NewOneLiner(grid, "dns NS records").SetText("unknown") + hs.dnsAPI = gadgets.NewOneLiner(grid, "dns API provider").SetText("unknown") + hs.dnsA = gadgets.NewOneLiner(grid, "dns IPv4 resource records").SetText("unknown") + hs.dnsAAAA = gadgets.NewOneLiner(grid, "dns IPv6 resource records").SetText("unknown") + + hs.speed = gadgets.NewOneLiner(grid, "speed").SetText("unknown") + hs.speedActual = gadgets.NewOneLiner(grid, "actual").SetText("unknown") + + group.Pad() + grid.Pad() + + hs.hidden = false + hs.ready = true + return hs +} + +func (hs *hostnameStatus) Domain() string { + if !hs.Ready() { + return "" + } + return hs.domainname.String() +} + +func (hs *hostnameStatus) API() string { + if !hs.Ready() { + return "" + } + return hs.dnsAPI.String() +} + +func (hs *hostnameStatus) Update() { + log.Info("hostnameStatus() Update() START") + if hs == nil { + log.Error(errors.New("hostnameStatus() Update() hs == nil")) + return + } + duration := timeFunction(func() { + hs.updateStatus() + }) + s := fmt.Sprint(duration) + hs.set(hs.speedActual, s) + + if duration > 500*time.Millisecond { + hs.set(hs.speed, "SLOW") + } else if duration > 100*time.Millisecond { + hs.set(hs.speed, "OK") + } else { + hs.set(hs.speed, "FAST") + } + log.Info("hostnameStatus() Update() END") +} + +// Returns true if the status is valid +func (hs *hostnameStatus) Ready() bool { + if hs == nil { + return false + } + return hs.ready +} + +// Returns true if IPv4 is working +func (hs *hostnameStatus) IPv4() bool { + if !hs.Ready() { + return false + } + if hs.statusIPv4.String() == "OK" { + return true + } + if hs.statusIPv4.String() == "GOOD" { + return true + } + return false +} + +// Returns true if IPv6 is working +func (hs *hostnameStatus) IPv6() bool { + if !hs.Ready() { + return false + } + if hs.statusIPv6.String() == "GOOD" { + return true + } + return false +} + +func (hs *hostnameStatus) setIPv4(s string) { + if !hs.Ready() { + return + } + hs.statusIPv4.SetText(s) +} + +func (hs *hostnameStatus) setIPv6(s string) { + if !hs.Ready() { + return + } + hs.statusIPv6.SetText(s) +} + +func (hs *hostnameStatus) set(a any, s string) { + if !hs.Ready() { + return + } + if hs.hidden { + return + } + if a == nil { + return + } + var n *gui.Node + if reflect.TypeOf(a) == reflect.TypeOf(n) { + n = a.(*gui.Node) + n.SetText(s) + return + } + var ol *gadgets.OneLiner + if reflect.TypeOf(a) == reflect.TypeOf(ol) { + ol = a.(*gadgets.OneLiner) + if ol == nil { + // log.Println("ol = nil", reflect.TypeOf(a), "a =", a) + return + } + // log.Println("SETTING ol:", ol) + ol.SetText(s) + return + } + log.Warn("unknown type TypeOf(a) =", reflect.TypeOf(a), "a =", a) + os.Exit(0) +} + +// returns true if AAAA record already exists in DNS +func (hs *hostnameStatus) existsAAAA(s string) bool { + log.Log(NOW, "existsAAAA() try to see if AAAA is already set", s) + return false +} + +func (hs *hostnameStatus) GetIPv6() []string { + if !hs.Ready() { + return nil + } + return strings.Split(hs.dnsAAAA.String(), "\n") +} + +func (hs *hostnameStatus) updateStatus() { + if !hs.Ready() { + return + } + var s string + var vals []string + log.Log(STATUS, "updateStatus() START") + + // copy the OS status over + lasthostname := hs.hostname.String() + hostname := me.statusOS.GetHostname() + + // hostname changed or was setup for the first time. Set the window title, etc + if lasthostname != hostname { + me.changed = true + hs.hostname.SetText(hostname) + hs.window.SetLabel(hostname + " Status") + me.statusDNSbutton.SetLabel(hostname + " status") + } + hs.domainname.SetText(me.statusOS.GetDomainName()) + + var tmp []string + tmp = me.statusOS.GetIPv4() + sort.Strings(tmp) + s = strings.Join(tmp, "\n") + if s != hs.currentIPv4.String() { + log.Log(CHANGE, "DNS IPv4 Addresses changed", tmp) + hs.currentIPv4.SetText(s) + hs.changed = true + } + + tmp = me.statusOS.GetIPv6() + sort.Strings(tmp) + s = strings.Join(tmp, "\n") + if s != hs.currentIPv6.String() { + log.Log(CHANGE, "DNS IPv6 Addresses changed", tmp) + hs.currentIPv6.SetText(s) + hs.changed = true + } + + if me.statusOS.ValidHostname() { + vals = lookupDoH(me.statusOS.GetHostname(), "AAAA") + + log.Log(STATUS, "DNS IPv6 Addresses for ", me.statusOS.GetHostname(), "=", vals) + hs.dnsAAAA.SetText(strings.Join(vals, "\n")) + + vals = lookupDoH(me.statusOS.GetHostname(), "A") + log.Log(STATUS, "IPv4 Addresses for ", me.statusOS.GetHostname(), "=", vals) + s = strings.Join(vals, "\n") + if s == "" { + s = "(none)" + hs.setIPv4("NEEDS CNAME") + } + hs.set(hs.dnsA, s) + + vals = lookupDoH(me.statusOS.GetHostname(), "CNAME") + s = strings.Join(vals, "\n") + if s != "" { + hs.set(hs.dnsA, "CNAME "+s) + hs.setIPv4("GOOD") + } + if hs.changed { + log.Log(CHANGE, "stuff changed. trying fixIPv6dns()") + fixIPv6dns() + hs.changed = false + } + } + + if hs.IPv4() && hs.IPv6() { + hs.status.SetText("GOOD") + } else { + hs.status.SetText("BROKEN") + } + + last := hs.statusIPv6.String() + if hs.verifyIPv6() { + if last != "WORKING" { + log.Log(CHANGE, "Your DNS IPv6 has started working.", me.statusOS.GetHostname(), "should now work") + hs.changed = true + hs.statusIPv6.SetText("WORKING") + me.DnsStatus.SetText("WORKING") + } + } else { + if last != "BROKEN" { + log.Log(CHANGE, "Your DNS entries for IPv6 have BROKEN") + hs.changed = true + hs.statusIPv6.SetText("BROKEN") + me.DnsStatus.SetText("BROKEN") + } + } +} + +func (hs *hostnameStatus) verifyIPv6() bool { + var working bool = true + osAAAA := make(map[string]string) + dnsAAAA := make(map[string]string) + + log.Log(INFO, "What are the AAAA resource records in the OS?") + tmp := me.statusOS.GetIPv6() + if len(tmp) == 0 { + // you don't have any IPv6 addresses in your OS right now + return false + } + for _, aaaa := range me.statusOS.GetIPv6() { + log.Log(INFO, "FOUND OS AAAA ip", aaaa) + osAAAA[aaaa] = "os" + } + + log.Log(INFO, "What are the AAAA resource records in DNS?") + for _, aaaa := range me.statusDNS.GetIPv6() { + log.Log(INFO, "FOUND DNS AAAA ip", aaaa) + dnsAAAA[aaaa] = "dns" + } + + for aaaa, _ := range dnsAAAA { + if osAAAA[aaaa] == "os" { + log.Log(INFO, "DNS AAAA is in OS", aaaa) + } else { + working = false + log.Log(INFO, "DNS AAAA is not in OS", aaaa) + addToFixWindow("DELETE", aaaa) + } + } + + for aaaa, _ := range osAAAA { + if dnsAAAA[aaaa] == "dns" { + log.Log(INFO, "OS AAAA is in DNS", aaaa) + } else { + working = false + log.Log(INFO, "OS AAAA is not in DNS", aaaa) + addToFixWindow("CREATE", aaaa) + } + } + + return working +} + +func (hs *hostnameStatus) Show() { + log.Log(STATUS, "hostnameStatus.Show() window") + if hs.hidden { + hs.window.Show() + } + hs.hidden = false +} + +func (hs *hostnameStatus) Hide() { + log.Log(STATUS, "hostnameStatus.Hide() window") + if !hs.hidden { + hs.window.Hide() + } + hs.hidden = true +} + +func (hs *hostnameStatus) GetDNSapi() string { + return hs.APIprovider +} + +func (hs *hostnameStatus) SetDNSapi(api string) { + if api == hs.APIprovider { + return + } + hs.APIprovider = api + hs.dnsAPI.SetText(api) + hs.changed = true +} -- cgit v1.2.3