diff --git a/digStatus.go b/digStatus.go index af72227..fd775af 100644 --- a/digStatus.go +++ b/digStatus.go @@ -16,7 +16,6 @@ import ( "os" "fmt" "time" - "strings" "reflect" "errors" @@ -153,6 +152,7 @@ func (ds *digStatus) setIPv6status(s string) { me.digStatus.set(ds.statusAAAA, s) } +/* func (ds *digStatus) SetIPv6(s string) { if ! ds.Ready() {return} log.Warn("Should SetIPv6() here to", s) @@ -162,6 +162,7 @@ func (ds *digStatus) SetIPv6(s string) { me.DnsAAAA.Set(s) // me.digStatus.set(ds.httpGoWitCom, addr) } +*/ func (ds *digStatus) set(a any, s string) { if ! ds.Ready() {return} @@ -301,7 +302,7 @@ func (ds *digStatus) checkLookupDoH(hostname string) bool { s = append(s, addr) status = true } - me.digStatus.SetIPv6(strings.Join(s, "\n")) + // me.digStatus.SetIPv6(strings.Join(s, "\n")) return status } diff --git a/errorBox.go b/errorBox.go index ea31f6a..0353393 100644 --- a/errorBox.go +++ b/errorBox.go @@ -20,25 +20,65 @@ type errorBox struct { l *gui.Node b *gui.Node + fixes map[string]*anError + something *gadgets.OneLiner } -func NewErrorBox(p *gui.Node, name string) *errorBox { +type anError struct { + kind string // what kind of error is it? + ip string + status string + + kindLabel *gui.Node + ipLabel *gui.Node + statusLabel *gui.Node + button *gui.Node +} + +func NewErrorBox(p *gui.Node, name string, ip string) *errorBox { var eb *errorBox eb = new(errorBox) eb.parent = p - // eb.group = p.NewGroup("eg") - // eb.grid = eb.group.NewGrid("labels", 2, 1) + eb.group = p.NewGroup(name) + eb.grid = eb.group.NewGrid("stuff", 4, 1) - eb.l = p.NewLabel("click to fix") - eb.b = p.NewButton("fix", func() { - log.Log(WARN, "should try to fix here") - }) - eb.something = gadgets.NewOneLiner(eb.grid, "something") + eb.grid.NewLabel("Type") + eb.grid.NewLabel("IP") + eb.grid.NewLabel("Status") + eb.grid.NewLabel("") + eb.fixes = make(map[string]*anError) return eb } + +func (eb *errorBox) add(kind string, ip string) bool { + tmp := kind + " " + ip + if eb.fixes[tmp] != nil { + log.Log(WARN, "Error is already here", kind, ip) + return false + } + + anErr := new(anError) + anErr.kind = kind + + anErr.kindLabel = eb.grid.NewLabel(kind) + anErr.ipLabel = eb.grid.NewLabel(ip) + anErr.statusLabel = eb.grid.NewLabel("") + anErr.button = eb.grid.NewButton(kind, func() { + log.Log(WARN, "got", kind, "here. IP =", ip) + eb.fix(kind, ip) + }) + eb.fixes[tmp] = anErr + return false +} + +func (eb *errorBox) fix(name string, ip string) bool { + log.Log(WARN, "should try to fix", name, "here. IP =", ip) + return false +} + func (eb *errorBox) update() bool { return false } diff --git a/fix.go b/fix.go index dc50f65..599a6d8 100644 --- a/fix.go +++ b/fix.go @@ -9,6 +9,22 @@ import ( func fix() bool { log.Log(CHANGE, "") + + // make and toggle the fixWindow display + if me.fixWindow == nil { + me.fixWindow = smartwindow.New() + me.fixWindow.SetParent(me.myGui) + me.fixWindow.Title("fix window") + me.fixWindow.SetDraw(drawFixWindow) + me.fixWindow.Vertical() + me.fixWindow.Make() + me.fixWindow.Draw() + me.fixWindow.Hide() + // me.fixWindow.Draw2() + return false + } + me.fixWindow.Toggle() + if ! me.statusDNS.Ready() { log.Log(CHANGE, "The IPv6 Control Panel is not Ready() yet") return false @@ -65,7 +81,9 @@ func fixIPv6dns() bool { // remove old DNS entries first for aaaa, _ := range dnsAAAA { - if osAAAA[aaaa] == "dns" { + if osAAAA[aaaa] == "os" { + log.Log(INFO, "DNS AAAA is in OS", aaaa) + } else { broken = true log.Log(INFO, "DNS AAAA is not in OS", aaaa) addToFixWindow("DELETE", aaaa) @@ -76,8 +94,6 @@ func fixIPv6dns() bool { log.Log(INFO, "Delete AAAA", aaaa, "Failed") } */ - } else { - log.Log(INFO, "DNS AAAA is in OS", aaaa) } } @@ -127,17 +143,24 @@ func exists(m map[string]bool, s string) bool { return false } +var myErrorBox *errorBox + func addToFixWindow(t string, ip string) { + log.Log(INFO, "addToFixWindow() START") if me.fixWindow == nil { - me.fixWindow = smartwindow.New() - me.fixWindow.SetParent(me.myGui) - me.fixWindow.InitWindow() - me.fixWindow.Title("fix window") - me.fixWindow.SetDraw(drawFixWindow) - me.fixWindow.Make() + log.Log(WARN, "addToFixWindow() fixWindow == nil. Can't add the error", t, ip) + return } + if myErrorBox == nil { + box := me.fixWindow.Box() + myErrorBox = NewErrorBox(box, t, ip) + } + myErrorBox.add(t, ip) + log.Log(INFO, "addToFixWindow() END") } func drawFixWindow(sw *smartwindow.SmartWindow) { log.Log(WARN, "drawFixWindow() START") + box := sw.Box() + box.NewLabel("test") } diff --git a/gui.go b/gui.go index 8e5b639..4746f20 100644 --- a/gui.go +++ b/gui.go @@ -4,8 +4,6 @@ package main import ( "time" "os" - "strings" - "sort" "go.wit.com/log" @@ -60,42 +58,6 @@ func debugTab(title string) { me.debug.Hide() } -// doesn't actually do any network traffic -// it just updates the GUI -func displayDNS() string { - var aaaa []string - aaaa = append(aaaa, "blah", "more") - // h := me.hostname - var all string - var broken string = "unknown" - for _, s := range aaaa { - log.Log(STATUS, "host", "fixme", "DNS AAAA =", s, "ipmap[s] =", me.ipmap[s]) - all += s + "\n" - if ( me.ipmap[s] == nil) { - log.Warn("THIS IS THE WRONG AAAA DNS ENTRY: host", "fixme", "DNS AAAA =", s) - broken = "wrong AAAA entry" - } else { - if (broken == "unknown") { - broken = "needs update" - } - } - } - - var a []string - a = append(a, "fixme") - sort.Strings(a) - all = strings.Join(a, "\n") - if (all == "") { - log.Log(NOW, "THERE IS NOT a real A DNS ENTRY") - all = "CNAME ipv6.wit.com" - } - if (me.DnsA.S != all) { - log.Log(NOW, "DnsA.SetText() to:", all) - me.DnsA.SetText(all) - } - return broken -} - func myDefaultExit(n *gui.Node) { log.Println("You can Do exit() things here") os.Exit(0) @@ -105,15 +67,6 @@ func mainWindow(title string) { me.window = gadgets.NewBasicWindow(me.myGui, title) gr := me.window.Box().NewGroup("dns update") - grid := gr.NewGrid("gridnuts", 2, 2) - - grid.SetNext(1,1) - - me.hostname = gadgets.NewOneLiner(grid, "hostname =").Set("unknown") - me.DnsAAAA = gadgets.NewOneLiner(grid, "DNS AAAA =").Set("unknown") - - grid.NewLabel("DNS A =") - me.DnsA = grid.NewLabel("?") // This is where you figure out what to do next to fix the problems me.fixButton = gr.NewButton("fix", func () { @@ -123,16 +76,13 @@ func mainWindow(title string) { } log.Log(CHANGE, "IPv6 WORKED") // update everything here visually for the user - hostname := me.statusOS.GetHostname() - me.hostname.Set(hostname) + // hostname := me.statusOS.GetHostname() + // me.hostname.Set(hostname) me.hostnameStatus.Set("WORKING") me.DnsStatus.Set("WORKING") - me.fixButton.Disable() + // me.fixButton.Disable() }) - grid.Margin() - grid.Pad() - statusGrid(me.window.Box()) gr = me.window.Box().NewGroup("debugging") @@ -207,6 +157,7 @@ func updateDNS() { // log.Println("digAAAA()") + /* if me.statusOS.ValidHostname() { var aaaa []string h := me.statusOS.GetHostname() @@ -216,7 +167,7 @@ func updateDNS() { // log.Println(SPEW, me) if (aaaa == nil) { log.Warn("There are no DNS AAAA records for hostname: ", h) - me.DnsAAAA.Set("(none)") + // me.DnsAAAA.Set("(none)") if (cloudflare.CFdialog.TypeNode != nil) { cloudflare.CFdialog.TypeNode.SetText("AAAA new") } @@ -225,34 +176,11 @@ func updateDNS() { cloudflare.CFdialog.NameNode.SetText(h) } - /* - d := deleteAAA() - if (d != "") { - if (cloudflare.CFdialog.ValueNode != nil) { - cloudflare.CFdialog.ValueNode.SetText(d) - } - } - */ -// m := missingAAAA() -// if (m != "") { -// if (cloudflare.CFdialog.ValueNode != nil) { -// cloudflare.CFdialog.ValueNode.SetText(m) -// } -// /* -// rr := &cloudflare.RRT{ -// Type: "AAAA", -// Name: me.hostname, -// Ttl: "Auto", -// Proxied: false, -// Content: m, -// } -// cloudflare.Update(rr) -// */ -// } } } - status := displayDNS() // update the GUI based on dig results - me.DnsStatus.SetText(status) + */ + // status := displayDNS() // update the GUI based on dig results + // me.DnsStatus.SetText(status) if me.digStatus.Ready() { if me.digStatus.IPv6() { diff --git a/linuxstatus/update.go b/linuxstatus/update.go index 686d799..b304370 100644 --- a/linuxstatus/update.go +++ b/linuxstatus/update.go @@ -18,11 +18,11 @@ func (ls *LinuxStatus) Update() { duration := timeFunction(func () { linuxLoop() }) - ls.SetSpeed(duration) + ls.setSpeed(duration) log.Log(INFO, "Update() END") } -func (ls *LinuxStatus) SetSpeed(duration time.Duration) { +func (ls *LinuxStatus) setSpeed(duration time.Duration) { s := fmt.Sprint(duration) if ls.speedActual == nil { log.Log(WARN, "can't actually warn") diff --git a/main.go b/main.go index 5988392..e57b4ef 100644 --- a/main.go +++ b/main.go @@ -157,9 +157,17 @@ func dnsTTL() { } // run update on the LinuxStatus() window +// also update a few things on the main window func linuxLoop() { me.statusOS.Update() + if me.statusOS.ValidHostname() { + if me.hostnameStatus.GetText() != "VALID" { + me.hostnameStatus.Set("VALID") + me.changed = true + } + } + if (me.statusOS.Changed()) { stamp := time.Now().Format("2006/01/02 15:04:05") log.Log(CHANGE, "Network things changed on", stamp) diff --git a/smartwindow/common.go b/smartwindow/common.go index 772a790..5c55c34 100644 --- a/smartwindow/common.go +++ b/smartwindow/common.go @@ -8,17 +8,15 @@ import ( ) func (sw *SmartWindow) Ready() bool { - log.Log(WARN, "Ready() maybe not ready? sw =", sw) - if sw == nil {return false} + log.Log(INFO, "Ready() START") if sw == nil {return false} if sw.window == nil {return false} + log.Log(INFO, "Ready() END sw.ready =", sw.ready) return sw.ready } func (sw *SmartWindow) Initialized() bool { - log.Log(WARN, "checking Initialized()") + log.Log(INFO, "checking Initialized()") if sw == nil {return false} - if sw == nil {return false} - if sw.parent == nil {return false} return true } diff --git a/smartwindow/new.go b/smartwindow/new.go index 016d10b..35e9df5 100644 --- a/smartwindow/new.go +++ b/smartwindow/new.go @@ -2,8 +2,6 @@ package smartwindow import ( "go.wit.com/log" - - "go.wit.com/gui/gadgets" ) func New() *SmartWindow { @@ -25,8 +23,4 @@ func (sw *SmartWindow) InitWindow() { sw.ready = true return } - - log.Log(WARN, "Creating the Window") - sw.window = gadgets.NewBasicWindow(sw.parent, sw.title) - sw.ready = true } diff --git a/smartwindow/postReady.go b/smartwindow/postReady.go index bb3eab8..99349ff 100644 --- a/smartwindow/postReady.go +++ b/smartwindow/postReady.go @@ -55,5 +55,24 @@ func (sw *SmartWindow) Toggle() { func (sw *SmartWindow) Box() *gui.Node { if ! sw.Ready() {return nil} - return sw.window.Box() + return sw.box +} + +func (sw *SmartWindow) Draw() { + if ! sw.Ready() {return} + + log.Log(WARN, "Draw() window ready") + sw.window.Draw() + + if sw.vertical { + sw.box = sw.window.NewBox("bw vbox", false) + log.Log(WARN, "BasicWindow.Custom() made vbox") + } else { + sw.box = sw.window.NewBox("bw hbox", true) + log.Log(WARN, "BasicWindow.Custom() made hbox") + } + if (sw.populate != nil) { + log.Log(WARN, "Make() trying to run Custom sw.populate() here") + sw.populate(sw) + } } diff --git a/smartwindow/preReady.go b/smartwindow/preReady.go index 5009d54..0fe23fd 100644 --- a/smartwindow/preReady.go +++ b/smartwindow/preReady.go @@ -36,49 +36,37 @@ func (sw *SmartWindow) SetParent(p *gui.Node) { } func (sw *SmartWindow) SetDraw(f func(*SmartWindow)) { - if ! sw.Initialized() {return} - if sw.Ready() {return} + log.Log(WARN, "SetDraw() START") + if ! sw.Initialized() { + log.Log(WARN, "SetDraw() Failed. sw.Initialized == false") + return + } + if sw.Ready() { + log.Log(WARN, "SetDraw() Failed. sw.Ready() == true") + return + } sw.populate = f + log.Log(WARN, "SetDraw() END sw.populate is set") } func (sw *SmartWindow) Make() { if ! sw.Initialized() {return} if sw.Ready() {return} + log.Log(WARN, "Make() START") - log.Log(WARN, "Make() window ready =", sw.ready) - sw.window.Make() - if (sw.populate != nil) { - log.Log(WARN, "Make() trying to run Custom sw.populate() here") - sw.populate(sw) + sw.window = sw.parent.RawWindow(sw.title) + sw.window.Custom = func() { + log.Warn("BasicWindow.Custom() closed. TODO: handle this", sw.title) } + log.Log(WARN, "Make() END sw.window = RawWindow() (not sent to toolkits)") sw.ready = true } -func (sw *SmartWindow) Draw() { - if ! sw.Initialized() {return} - if sw.Ready() {return} - - log.Log(WARN, "Draw() window ready =", sw.ready) - sw.window.Draw() - if (sw.populate != nil) { - log.Log(WARN, "Make() trying to run Custom sw.populate() here") - sw.populate(sw) - } - sw.ready = true -} - - func (sw *SmartWindow) Vertical() { if ! sw.Initialized() {return} if sw.Ready() {return} - log.Log(WARN, "Draw() window ready =", sw.ready) - sw.window.Draw() - if (sw.populate != nil) { - log.Log(WARN, "Make() trying to run Custom sw.populate() here") - sw.populate(sw) - } - sw.ready = true + log.Log(WARN, "Vertical() setting vertical = true") + sw.vertical = true } - diff --git a/smartwindow/structs.go b/smartwindow/structs.go index d70ea3c..ac0bea7 100644 --- a/smartwindow/structs.go +++ b/smartwindow/structs.go @@ -2,19 +2,19 @@ package smartwindow import ( "go.wit.com/gui/gui" - "go.wit.com/gui/gadgets" ) type SmartWindow struct { ready bool // track if the window is ready hidden bool // track if the window is hidden from the toolkits changed bool // track if something changed in the window + vertical bool title string // what the user sees as the name name string // the programatic name aka: "CALANDAR" parent *gui.Node // where to place the window if you try to draw it - window *gadgets.BasicWindow // the underlying BasicWindow + window *gui.Node // the underlying window box *gui.Node // the box inside the window // get this from BasicWindow() ? populate func(*SmartWindow) // the function to generate the widgets diff --git a/structs.go b/structs.go index f7f6411..2408dbb 100644 --- a/structs.go +++ b/structs.go @@ -27,7 +27,7 @@ type Host struct { digStatus *digStatus // window of the results of DNS lookups hostnameStatus *gui.Node // a summary for the user of where things are - hostname *gadgets.OneLiner // the hostname grabbed from gadget.linuxStatus + // hostname *gadgets.OneLiner // the hostname grabbed from gadget.linuxStatus artificialSleep float64 `default:"0.7"` // artificial sleep on startup artificialS string `default:"abc"` // artificial sleep on startup @@ -50,8 +50,6 @@ type Host struct { // DNS stuff DnsAPI *gui.Node // what DNS API to use? - DnsAAAA *gadgets.OneLiner // the actual DNS AAAA results - DnsA *gui.Node // the actual DNS A results (ignore for status since mostly never happens?) DnsStatus *gui.Node // the current state of DNS DnsSpeed *gui.Node // 'FAST', 'OK', 'SLOW', etc DnsSpeedActual *gui.Node // the last actual duration