diff options
| author | Jeff Carr <[email protected]> | 2024-02-01 09:24:07 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2024-02-01 09:24:07 -0600 |
| commit | 25033569e7d8daca9627651030c122d1f033b17e (patch) | |
| tree | 1463e92eb3c98436c4cca27061887d5b7bd6d159 /hostnameStatusWindow.go | |
| parent | 4672399fae8aebd66916a9c61a84fa3d10650491 (diff) | |
rename filesv0.20.1
Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'hostnameStatusWindow.go')
| -rw-r--r-- | hostnameStatusWindow.go | 397 |
1 files changed, 397 insertions, 0 deletions
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 +} |
