Compare commits
No commits in common. "15d9f9769360b1cb8c748de8ee995030ade5eb35" and "8b59a3141a6bd70eb8b434edbe347c3a22bfb3d6" have entirely different histories.
15d9f97693
...
8b59a3141a
9
args.go
9
args.go
|
@ -19,7 +19,6 @@ var args struct {
|
|||
}
|
||||
|
||||
var NOW log.LogFlag
|
||||
var INFO log.LogFlag
|
||||
var NET log.LogFlag
|
||||
var DNS log.LogFlag
|
||||
var PROC log.LogFlag
|
||||
|
@ -37,12 +36,6 @@ func init() {
|
|||
NOW.Desc = "temp debugging stuff"
|
||||
NOW.Register()
|
||||
|
||||
INFO.B = false
|
||||
INFO.Name = "INFO"
|
||||
INFO.Subsystem = "cpdns"
|
||||
INFO.Desc = "normal debugging stuff"
|
||||
INFO.Register()
|
||||
|
||||
NET.B = false
|
||||
NET.Name = "NET"
|
||||
NET.Subsystem = "cpdns"
|
||||
|
@ -67,7 +60,7 @@ func init() {
|
|||
SPEW.Desc = "spew logging"
|
||||
SPEW.Register()
|
||||
|
||||
CHANGE.B = true
|
||||
CHANGE.B = false
|
||||
CHANGE.Name = "CHANGE"
|
||||
CHANGE.Subsystem = "cpdns"
|
||||
CHANGE.Desc = "show droplet state changes"
|
||||
|
|
|
@ -207,8 +207,8 @@ func (ds *digStatus) updateDnsStatus() {
|
|||
ipv4, ipv6 = ds.dsCloudflare.update()
|
||||
ipv4, ipv6 = ds.dsGoogle.update()
|
||||
|
||||
if me.statusOS.ValidHostname() {
|
||||
if ds.checkLookupDoH(me.statusOS.GetHostname()) {
|
||||
if me.status.ValidHostname() {
|
||||
if ds.checkLookupDoH(me.status.GetHostname()) {
|
||||
log.Log(DNS, "updateDnsStatus() HTTP DNS lookups working")
|
||||
me.digStatus.set(ds.statusHTTP, "WORKING")
|
||||
} else {
|
||||
|
|
30
dns-https.go
30
dns-https.go
|
@ -2,13 +2,10 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"go.wit.com/log"
|
||||
"io/ioutil"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"go.wit.com/log"
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
// dnsLookupDoH performs a DNS lookup for AAAA records over HTTPS.
|
||||
|
@ -57,28 +54,3 @@ func lookupDoH(hostname string, rrType string) []string {
|
|||
|
||||
return values
|
||||
}
|
||||
|
||||
func digAAAA(hostname string) []string {
|
||||
var blah, ipv6Addresses []string
|
||||
// domain := hostname
|
||||
recordType := dns.TypeAAAA // dns.TypeTXT
|
||||
|
||||
// Cloudflare's DNS server
|
||||
blah, _ = dnsUdpLookup("1.1.1.1:53", hostname, recordType)
|
||||
log.Println("digAAAA() has BLAH =", blah)
|
||||
|
||||
if (len(blah) == 0) {
|
||||
log.Println("digAAAA() RUNNING dnsAAAAlookupDoH(domain)")
|
||||
ipv6Addresses = lookupDoH(hostname, "AAAA")
|
||||
log.Println("digAAAA() has ipv6Addresses =", strings.Join(ipv6Addresses, " "))
|
||||
for _, addr := range ipv6Addresses {
|
||||
log.Println(addr)
|
||||
}
|
||||
return ipv6Addresses
|
||||
}
|
||||
|
||||
// TODO: check digDoH vs blah, if so, then port 53 TCP and/or UDP is broken or blocked
|
||||
log.Println("digAAAA() has BLAH =", blah)
|
||||
|
||||
return blah
|
||||
}
|
||||
|
|
4
dns.go
4
dns.go
|
@ -111,10 +111,10 @@ func lookupNS(domain string) {
|
|||
}
|
||||
tmp = shell.Chomp(tmp)
|
||||
|
||||
if (tmp != me.status.NSrr.Get()) {
|
||||
if (tmp != me.NSrr.S) {
|
||||
me.changed = true
|
||||
log.Log(CHANGE, "lookupNS() setting me.NSrr =", tmp)
|
||||
me.status.NSrr.Set(tmp)
|
||||
me.NSrr.SetText(tmp)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
6
fix.go
6
fix.go
|
@ -11,10 +11,10 @@ func fix() bool {
|
|||
log.Warn("The IPv6 Control Panel is not Ready() yet")
|
||||
return false
|
||||
}
|
||||
if me.statusOS.ValidHostname() {
|
||||
log.Warn("Your hostname is VALID:", me.statusOS.GetHostname())
|
||||
if me.status.ValidHostname() {
|
||||
log.Warn("Your hostname is VALID:", me.status.GetHostname())
|
||||
} else {
|
||||
log.Warn("You must first fix your hostname:", me.statusOS.GetHostname())
|
||||
log.Warn("You must first fix your hostname:", me.status.GetHostname())
|
||||
return false
|
||||
}
|
||||
if me.digStatus.IPv4() {
|
||||
|
|
83
gui.go
83
gui.go
|
@ -22,9 +22,57 @@ func setupControlPanelWindow() {
|
|||
|
||||
// setup the main tab
|
||||
mainWindow("DNS and IPv6 Control Panel")
|
||||
detailsTab("OS Details")
|
||||
debugTab("Debug")
|
||||
}
|
||||
|
||||
func detailsTab(title string) {
|
||||
var g2 *gui.Node
|
||||
|
||||
me.details = gadgets.NewBasicWindow(me.myGui, title)
|
||||
me.details.Draw()
|
||||
me.details.Hide()
|
||||
|
||||
g2 = me.details.Box().NewGroup("Real Stuff")
|
||||
|
||||
grid := g2.NewGrid("gridnuts", 2, 2)
|
||||
|
||||
grid.SetNext(1,1)
|
||||
|
||||
grid.NewLabel("domainname =")
|
||||
grid.NewLabel("DEPRECATED")
|
||||
// me.domainname = grid.NewLabel("domainname")
|
||||
|
||||
grid.NewLabel("hostname -s =")
|
||||
me.hostshort = grid.NewLabel("hostname -s")
|
||||
|
||||
grid.NewLabel("NS records =")
|
||||
me.NSrr = grid.NewLabel("NS RR's")
|
||||
|
||||
grid.NewLabel("UID =")
|
||||
grid.NewLabel("DEPRECATED")
|
||||
|
||||
grid.NewLabel("Current IPv4 =")
|
||||
me.IPv4 = grid.NewLabel("?")
|
||||
|
||||
grid.NewLabel("Current IPv6 =")
|
||||
me.IPv6 = grid.NewLabel("?")
|
||||
|
||||
grid.NewLabel("Working Real IPv6 =")
|
||||
me.workingIPv6 = grid.NewLabel("?")
|
||||
|
||||
grid.NewLabel("interfaces =")
|
||||
me.Interfaces = grid.NewCombobox("Interfaces")
|
||||
|
||||
grid.NewLabel("refresh speed")
|
||||
me.LocalSpeedActual = grid.NewLabel("unknown")
|
||||
|
||||
grid.Margin()
|
||||
grid.Pad()
|
||||
|
||||
me.details.Hide()
|
||||
}
|
||||
|
||||
func debugTab(title string) {
|
||||
var g2 *gui.Node
|
||||
|
||||
|
@ -38,6 +86,10 @@ func debugTab(title string) {
|
|||
debugger.DebugWindow(me.myGui)
|
||||
})
|
||||
|
||||
g2.NewButton("getHostname() looks at the OS settings", func () {
|
||||
getHostname()
|
||||
})
|
||||
|
||||
g2.NewButton("dig A & AAAA DNS records", func () {
|
||||
log.Println("updateDNS()")
|
||||
updateDNS()
|
||||
|
@ -98,7 +150,7 @@ func missingAAAA() string {
|
|||
// it just updates the GUI
|
||||
func displayDNS() string {
|
||||
var aaaa []string
|
||||
aaaa = append(aaaa, "blah", "more")
|
||||
aaaa = dhcpAAAA() // your AAAA records right now
|
||||
// h := me.hostname
|
||||
var all string
|
||||
var broken string = "unknown"
|
||||
|
@ -114,6 +166,11 @@ func displayDNS() string {
|
|||
}
|
||||
}
|
||||
}
|
||||
all = sortLines(all)
|
||||
if (me.workingIPv6.S != all) {
|
||||
log.Log(NOW, "workingIPv6.SetText() to:", all)
|
||||
me.workingIPv6.SetText(all)
|
||||
}
|
||||
|
||||
var a []string
|
||||
a = realA()
|
||||
|
@ -142,7 +199,9 @@ func mainWindow(title string) {
|
|||
|
||||
grid.SetNext(1,1)
|
||||
|
||||
me.hostname = gadgets.NewOneLiner(grid, "hostname =").Set("unknown")
|
||||
grid.NewLabel("hostname =")
|
||||
me.fqdn = grid.NewLabel("?")
|
||||
|
||||
me.DnsAAAA = gadgets.NewOneLiner(grid, "DNS AAAA =").Set("unknown")
|
||||
|
||||
grid.NewLabel("DNS A =")
|
||||
|
@ -164,26 +223,22 @@ func mainWindow(title string) {
|
|||
me.status.window.Toggle()
|
||||
})
|
||||
|
||||
gr.NewButton("OS details", func () {
|
||||
me.details.Toggle()
|
||||
})
|
||||
gr.NewButton("linuxstatus.New()", func () {
|
||||
if (me.statusOS == nil) {
|
||||
me.statusOS = linuxstatus.New()
|
||||
}
|
||||
me.statusOS.SetParent(me.myGui)
|
||||
me.statusOS.InitWindow()
|
||||
me.statusOS.Make()
|
||||
me.statusOS.Draw2()
|
||||
me.statusOS = linuxstatus.New()
|
||||
})
|
||||
gr.NewButton("statusOS.Ready()", func () {
|
||||
me.statusOS.Ready()
|
||||
})
|
||||
gr.NewButton("statusOS.Draw()", func () {
|
||||
me.statusOS.Draw()
|
||||
me.statusOS.Draw2()
|
||||
me.statusOS.Ready()
|
||||
})
|
||||
gr.NewButton("statusOS.Update()", func () {
|
||||
me.statusOS.Update()
|
||||
})
|
||||
gr.NewButton("Linux Status", func () {
|
||||
gr.NewButton("Linux details", func () {
|
||||
me.statusOS.Toggle()
|
||||
})
|
||||
gr.NewButton("resolver status", func () {
|
||||
|
@ -247,9 +302,9 @@ func updateDNS() {
|
|||
|
||||
// log.Println("digAAAA()")
|
||||
|
||||
if me.statusOS.ValidHostname() {
|
||||
if me.status.ValidHostname() {
|
||||
var aaaa []string
|
||||
h := me.statusOS.GetHostname()
|
||||
h := me.status.GetHostname()
|
||||
aaaa = digAAAA(h)
|
||||
log.Log(NOW, "digAAAA() for", h, "=", aaaa)
|
||||
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
// figures out if your hostname is valid
|
||||
// then checks if your DNS is setup correctly
|
||||
package main
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/shell"
|
||||
// "go.wit.com/gui/cloudflare"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
// will try to get this hosts FQDN
|
||||
"github.com/Showmax/go-fqdn"
|
||||
)
|
||||
|
||||
func getHostname() {
|
||||
var err error
|
||||
var s string = "gui.Label == nil"
|
||||
s, err = fqdn.FqdnHostname()
|
||||
if (err != nil) {
|
||||
log.Error(err, "FQDN hostname error")
|
||||
return
|
||||
}
|
||||
me.status.SetHostname(s)
|
||||
|
||||
dn := run("domainname")
|
||||
hshort := run("hostname -s")
|
||||
|
||||
var test string
|
||||
test = hshort + "." + dn
|
||||
if (me.status.GetHostname() != test) {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "does not equal", test)
|
||||
if (me.hostnameStatus.S != "BROKEN") {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "does not equal", test)
|
||||
me.changed = true
|
||||
me.hostnameStatus.SetText("BROKEN")
|
||||
}
|
||||
} else {
|
||||
if (me.hostnameStatus.S != "VALID") {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "is valid")
|
||||
me.hostnameStatus.SetText("VALID")
|
||||
me.changed = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// returns true if the hostname is good
|
||||
// check that all the OS settings are correct here
|
||||
// On Linux, /etc/hosts, /etc/hostname
|
||||
// and domainname and hostname
|
||||
func goodHostname() bool {
|
||||
hostname := shell.Chomp(shell.Cat("/etc/hostname"))
|
||||
log.Log(NOW, "hostname =", hostname)
|
||||
|
||||
hs := run("hostname -s")
|
||||
dn := run("domainname")
|
||||
log.Log(NOW, "hostname short =", hs, "domainname =", dn)
|
||||
|
||||
tmp := hs + "." + dn
|
||||
if (hostname == tmp) {
|
||||
log.Log(NOW, "hostname seems to be good", hostname)
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func digAAAA(hostname string) []string {
|
||||
var blah, ipv6Addresses []string
|
||||
// domain := hostname
|
||||
recordType := dns.TypeAAAA // dns.TypeTXT
|
||||
|
||||
// Cloudflare's DNS server
|
||||
blah, _ = dnsUdpLookup("1.1.1.1:53", hostname, recordType)
|
||||
log.Println("digAAAA() has BLAH =", blah)
|
||||
|
||||
if (len(blah) == 0) {
|
||||
log.Println("digAAAA() RUNNING dnsAAAAlookupDoH(domain)")
|
||||
ipv6Addresses = lookupDoH(hostname, "AAAA")
|
||||
log.Println("digAAAA() has ipv6Addresses =", strings.Join(ipv6Addresses, " "))
|
||||
for _, addr := range ipv6Addresses {
|
||||
log.Println(addr)
|
||||
}
|
||||
return ipv6Addresses
|
||||
}
|
||||
|
||||
// TODO: check digDoH vs blah, if so, then port 53 TCP and/or UDP is broken or blocked
|
||||
log.Println("digAAAA() has BLAH =", blah)
|
||||
|
||||
return blah
|
||||
}
|
|
@ -42,7 +42,6 @@ type hostnameStatus struct {
|
|||
currentIPv6 *gadgets.OneLiner
|
||||
|
||||
// what the DNS servers have
|
||||
NSrr *gadgets.OneLiner
|
||||
dnsA *gadgets.OneLiner
|
||||
dnsAAAA *gadgets.OneLiner
|
||||
dnsAPI *gadgets.OneLiner
|
||||
|
@ -85,7 +84,6 @@ func NewHostnameStatusWindow(p *gui.Node) *hostnameStatus {
|
|||
hs.currentIPv4 = gadgets.NewOneLiner(grid, "Current IPv4")
|
||||
hs.currentIPv6 = gadgets.NewOneLiner(grid, "Current IPv6")
|
||||
|
||||
hs.NSrr = gadgets.NewOneLiner(grid, "dns NS records").Set("unknown")
|
||||
hs.dnsAPI = gadgets.NewOneLiner(grid, "dns API provider").Set("unknown")
|
||||
hs.dnsA = gadgets.NewOneLiner(grid, "dns IPv4 resource records").Set("unknown")
|
||||
hs.dnsAAAA = gadgets.NewOneLiner(grid, "dns IPv6 resource records").Set("unknown")
|
||||
|
@ -120,11 +118,24 @@ func NewHostnameStatusWindow(p *gui.Node) *hostnameStatus {
|
|||
return hs
|
||||
}
|
||||
|
||||
/*
|
||||
func (hs *hostnameStatus) ValidHostname() bool {
|
||||
return goodHostname()
|
||||
}
|
||||
*/
|
||||
|
||||
func (hs *hostnameStatus) GetHostname() string {
|
||||
return hs.lastname
|
||||
}
|
||||
|
||||
func (hs *hostnameStatus) SetHostname(hostname string) {
|
||||
if hostname == hs.lastname {return}
|
||||
log.Log(CHANGE, "the hostname is changing from", hs.lastname, "to", hostname)
|
||||
hs.lastname = hostname
|
||||
me.changed = true
|
||||
|
||||
if (me.fqdn != nil) {
|
||||
me.fqdn.SetText(hostname)
|
||||
}
|
||||
}
|
||||
|
||||
func (hs *hostnameStatus) Domain() string {
|
||||
if ! hs.Ready() {return ""}
|
||||
|
@ -285,13 +296,13 @@ func (hs *hostnameStatus) updateStatus() {
|
|||
var vals []string
|
||||
log.Log(STATUS, "updateStatus() START")
|
||||
|
||||
hs.hostShort.Set(me.statusOS.GetHostShort())
|
||||
hs.hostShort.Set(me.hostshort.S)
|
||||
hs.domainname.Set(me.statusOS.GetDomainName())
|
||||
|
||||
if me.statusOS.ValidHostname() {
|
||||
vals = lookupDoH(me.statusOS.GetHostname(), "AAAA")
|
||||
if hs.ValidHostname() {
|
||||
vals = lookupDoH(hs.GetHostname(), "AAAA")
|
||||
|
||||
log.Log(STATUS, "DNS IPv6 Addresses for ", me.statusOS.GetHostname(), "=", vals)
|
||||
log.Log(STATUS, "DNS IPv6 Addresses for ", hs.GetHostname(), "=", vals)
|
||||
if len(vals) == 0 {
|
||||
s = "(none)"
|
||||
} else {
|
||||
|
@ -311,8 +322,8 @@ func (hs *hostnameStatus) updateStatus() {
|
|||
}
|
||||
hs.set(hs.dnsAAAA, s)
|
||||
|
||||
vals = lookupDoH(me.statusOS.GetHostname(), "A")
|
||||
log.Log(STATUS, "IPv4 Addresses for ", me.statusOS.GetHostname(), "=", vals)
|
||||
vals = lookupDoH(hs.GetHostname(), "A")
|
||||
log.Log(STATUS, "IPv4 Addresses for ", hs.GetHostname(), "=", vals)
|
||||
s = strings.Join(vals, "\n")
|
||||
if (s == "") {
|
||||
s = "(none)"
|
||||
|
@ -320,7 +331,7 @@ func (hs *hostnameStatus) updateStatus() {
|
|||
}
|
||||
hs.set(hs.dnsA, s)
|
||||
|
||||
vals = lookupDoH(me.statusOS.GetHostname(), "CNAME")
|
||||
vals = lookupDoH(hs.GetHostname(), "CNAME")
|
||||
s = strings.Join(vals, "\n")
|
||||
if (s != "") {
|
||||
hs.set(hs.dnsA, "CNAME " + s)
|
||||
|
@ -328,10 +339,8 @@ func (hs *hostnameStatus) updateStatus() {
|
|||
}
|
||||
}
|
||||
|
||||
// hs.currentIPv4.Set(me.IPv4.S)
|
||||
// hs.currentIPv6.Set(me.IPv6.S)
|
||||
hs.currentIPv4.Set("get this from linuxStatus")
|
||||
hs.currentIPv6.Set("get this from linuxStatus")
|
||||
hs.currentIPv4.Set(me.IPv4.S)
|
||||
hs.currentIPv6.Set(me.IPv6.S)
|
||||
|
||||
if hs.IPv4() && hs.IPv6() {
|
||||
hs.status.Set("GOOD")
|
||||
|
|
|
@ -9,31 +9,53 @@ import (
|
|||
)
|
||||
|
||||
var NOW log.LogFlag
|
||||
var INFO log.LogFlag
|
||||
var NET log.LogFlag
|
||||
var DNS log.LogFlag
|
||||
var PROC log.LogFlag
|
||||
var SPEW log.LogFlag
|
||||
var WARN log.LogFlag
|
||||
var CHANGE log.LogFlag
|
||||
var STATUS log.LogFlag
|
||||
|
||||
func myreg(f *log.LogFlag, b bool, name string, desc string) {
|
||||
f.B = b
|
||||
f.Subsystem = "go.wit.com/control-panels/dns/linuxstatus"
|
||||
f.Short = "linux"
|
||||
f.Desc = desc
|
||||
f.Name = name
|
||||
f.Register()
|
||||
}
|
||||
|
||||
func init() {
|
||||
myreg(&NOW, true, "NOW", "temp debugging stuff")
|
||||
myreg(&NET, false, "NET", "Network Logging")
|
||||
myreg(&DNS, false, "DNS", "dnsStatus.update()")
|
||||
myreg(&PROC, false, "PROC", "/proc logging")
|
||||
myreg(&SPEW, false, "SPEW", "spew stuff")
|
||||
myreg(&WARN, true, "WARN", "bad things")
|
||||
myreg(&CHANGE, true, "CHANGE", "show droplet state changes")
|
||||
myreg(&STATUS, false, "STATUS", "Update() details")
|
||||
NOW.B = false
|
||||
NOW.Name = "NOW"
|
||||
NOW.Subsystem = "cpdns"
|
||||
NOW.Desc = "temp debugging stuff"
|
||||
NOW.Register()
|
||||
|
||||
NET.B = false
|
||||
NET.Name = "NET"
|
||||
NET.Subsystem = "cpdns"
|
||||
NET.Desc = "Network logging"
|
||||
NET.Register()
|
||||
|
||||
DNS.B = false
|
||||
DNS.Name = "DNS"
|
||||
DNS.Subsystem = "cpdns"
|
||||
DNS.Desc = "dnsStatus.update()"
|
||||
DNS.Register()
|
||||
|
||||
PROC.B = false
|
||||
PROC.Name = "PROC"
|
||||
PROC.Subsystem = "cpdns"
|
||||
PROC.Desc = "/proc logging"
|
||||
PROC.Register()
|
||||
|
||||
SPEW.B = false
|
||||
SPEW.Name = "SPEW"
|
||||
SPEW.Subsystem = "cpdns"
|
||||
SPEW.Desc = "spew logging"
|
||||
SPEW.Register()
|
||||
|
||||
CHANGE.B = false
|
||||
CHANGE.Name = "CHANGE"
|
||||
CHANGE.Subsystem = "cpdns"
|
||||
CHANGE.Desc = "show droplet state changes"
|
||||
CHANGE.Register()
|
||||
|
||||
STATUS.B = false
|
||||
STATUS.Name = "STATUS"
|
||||
STATUS.Subsystem = "cpdns"
|
||||
STATUS.Desc = "updateStatus()"
|
||||
STATUS.Register()
|
||||
}
|
||||
|
|
|
@ -3,87 +3,32 @@ package linuxstatus
|
|||
|
||||
import (
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/gui/gui"
|
||||
)
|
||||
|
||||
// reports externally if something has changed
|
||||
// since the last time it was asked about it
|
||||
func (ls *LinuxStatus) Changed() bool {
|
||||
if ! ls.Ready() {return false}
|
||||
if ls.changed {
|
||||
ls.changed = false
|
||||
return true
|
||||
}
|
||||
return false
|
||||
func (hs *LinuxStatus) Show() {
|
||||
log.Log(CHANGE, "linuxStatus.Show() window")
|
||||
hs.window.Show()
|
||||
hs.hidden = false
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Make() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "Make() window ready =", ls.ready)
|
||||
ls.window.Make()
|
||||
ls.ready = true
|
||||
}
|
||||
func (ls *LinuxStatus) Draw() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "Draw() window ready =", ls.ready)
|
||||
ls.window.Draw()
|
||||
ls.ready = true
|
||||
}
|
||||
func (ls *LinuxStatus) Draw2() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "draw(ls) ready =", ls.ready)
|
||||
draw(ls)
|
||||
func (hs *LinuxStatus) Hide() {
|
||||
log.Log(CHANGE, "linuxStatus.Hide() window")
|
||||
hs.window.Hide()
|
||||
hs.hidden = true
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Show() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "Show() window ready =", ls.ready)
|
||||
ls.window.Show()
|
||||
ls.hidden = false
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Hide() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "Hide() window ready =", ls.ready)
|
||||
ls.window.Hide()
|
||||
ls.hidden = true
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Toggle() {
|
||||
if ! ls.Ready() {return}
|
||||
log.Log(CHANGE, "Toggle() window ready =", ls.ready)
|
||||
if ls.hidden {
|
||||
ls.Show()
|
||||
func (hs *LinuxStatus) Toggle() {
|
||||
log.Log(CHANGE, "linuxStatus.Toggle() window")
|
||||
if hs.hidden {
|
||||
hs.window.Show()
|
||||
} else {
|
||||
ls.Hide()
|
||||
hs.window.Hide()
|
||||
}
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Ready() bool {
|
||||
log.Log(SPEW, "Ready() maybe not ready? ls =", ls)
|
||||
func (hs *LinuxStatus) Ready() bool {
|
||||
if me == nil {return false}
|
||||
if ls == nil {return false}
|
||||
if ls.window == nil {return false}
|
||||
if hs == nil {return false}
|
||||
if hs.window == nil {return false}
|
||||
return me.ready
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) Initialized() bool {
|
||||
log.Log(CHANGE, "checking Initialized()")
|
||||
if me == nil {return false}
|
||||
if ls == nil {return false}
|
||||
if ls.parent == nil {return false}
|
||||
return true
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) SetParent(p *gui.Node) {
|
||||
log.Log(CHANGE, "Attempting SetParent")
|
||||
if me == nil {return}
|
||||
if ls == nil {return}
|
||||
if ls.parent == nil {
|
||||
log.Log(CHANGE, "SetParent =", p)
|
||||
ls.parent = p
|
||||
return
|
||||
} else {
|
||||
log.Log(CHANGE, "SetParent was already set to =", ls.parent)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,18 +9,15 @@ import (
|
|||
// it's assumed you are always passing in a box
|
||||
func draw(ls *LinuxStatus) {
|
||||
if ! ls.Ready() {return}
|
||||
ls.group = ls.window.Box().NewGroup("What Linux Knows It Is")
|
||||
ls.group = ls.window.Box().NewGroup("Real Stuff")
|
||||
|
||||
ls.grid = ls.group.NewGrid("gridnuts", 2, 2)
|
||||
|
||||
ls.grid.SetNext(1,1)
|
||||
|
||||
ls.hostnameStatus = gadgets.NewOneLiner(ls.grid, "status")
|
||||
ls.hostname = gadgets.NewOneLiner(ls.grid, "hostname -f")
|
||||
ls.hostshort = gadgets.NewOneLiner(ls.grid, "hostname -s")
|
||||
ls.domainname = gadgets.NewOneLiner(ls.grid, "domain name")
|
||||
ls.resolver = gadgets.NewOneLiner(ls.grid, "nameservers =")
|
||||
ls.resolver.Set("TODO")
|
||||
ls.NSrr = gadgets.NewOneLiner(ls.grid, "NS records =")
|
||||
ls.uid = gadgets.NewOneLiner(ls.grid, "UID =")
|
||||
ls.IPv4 = gadgets.NewOneLiner(ls.grid, "Current IPv4 =")
|
||||
ls.IPv6 = gadgets.NewOneLiner(ls.grid, "Current IPv6 =")
|
||||
|
@ -30,7 +27,6 @@ func draw(ls *LinuxStatus) {
|
|||
ls.grid.NewLabel("interfaces =")
|
||||
ls.Interfaces = ls.grid.NewCombobox("Interfaces")
|
||||
|
||||
ls.speed = gadgets.NewOneLiner(ls.grid, "refresh speed =")
|
||||
ls.speedActual = gadgets.NewOneLiner(ls.grid, "refresh speed =")
|
||||
|
||||
ls.grid.Margin()
|
||||
|
|
|
@ -15,101 +15,53 @@ func (ls *LinuxStatus) GetDomainName() string {
|
|||
return me.domainname.Get()
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) setDomainName() {
|
||||
func (ls *LinuxStatus) setDomainName(dn string) {
|
||||
if ! me.Ready() {return}
|
||||
me.domainname.Set(dn)
|
||||
}
|
||||
|
||||
func getHostname() {
|
||||
var err error
|
||||
var s string = "gui.Label == nil"
|
||||
s, err = fqdn.FqdnHostname()
|
||||
if (err != nil) {
|
||||
log.Error(err, "FQDN hostname error")
|
||||
return
|
||||
}
|
||||
log.Warn("full hostname should be:", s)
|
||||
|
||||
dn := run("domainname")
|
||||
if (me.domainname.Get() != dn) {
|
||||
log.Log(CHANGE, "domainname has changed from", me.GetDomainName(), "to", dn)
|
||||
me.domainname.Set(dn)
|
||||
me.setDomainName(dn)
|
||||
me.changed = true
|
||||
}
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) GetHostname() string {
|
||||
if ! me.Ready() {return ""}
|
||||
return me.hostname.Get()
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) ValidHostname() bool {
|
||||
if ! me.Ready() {return false}
|
||||
if me.hostnameStatus.Get() == "VALID" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) setHostname(newname string) {
|
||||
if ! me.Ready() {return}
|
||||
if newname == me.hostname.Get() {
|
||||
return
|
||||
}
|
||||
log.Log(CHANGE, "hostname has changed from", me.GetHostname(), "to", newname)
|
||||
me.hostname.Set(newname)
|
||||
me.changed = true
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) GetHostShort() string {
|
||||
if ! me.Ready() {return ""}
|
||||
return me.hostshort.Get()
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) setHostShort() {
|
||||
if ! me.Ready() {return}
|
||||
hshort := run("hostname -s")
|
||||
if (me.hostshort.Get() != hshort) {
|
||||
log.Log(CHANGE, "hostname -s has changed from", me.hostshort.Get(), "to", hshort)
|
||||
me.hostshort.Set(hshort)
|
||||
me.changed = true
|
||||
}
|
||||
}
|
||||
|
||||
func lookupHostname() {
|
||||
if ! me.Ready() {return}
|
||||
var err error
|
||||
var hostfqdn string = "broken"
|
||||
hostfqdn, err = fqdn.FqdnHostname()
|
||||
if (err != nil) {
|
||||
log.Error(err, "FQDN hostname error")
|
||||
return
|
||||
}
|
||||
log.Log(NET, "full hostname should be: ", hostfqdn)
|
||||
|
||||
me.setDomainName()
|
||||
me.setHostShort()
|
||||
|
||||
// these are authoritative
|
||||
// if they work wrong, your linux configuration is wrong.
|
||||
// Do not complain.
|
||||
// Fix your distro if your box is otherwise not working this way
|
||||
hshort := me.GetHostShort() // from `hostname -s`
|
||||
dn := me.GetDomainName() // from `domanname`
|
||||
hostname := me.GetHostname() // from `hostname -f`
|
||||
|
||||
if hostfqdn != hostname {
|
||||
log.Log(WARN, "hostname", hostname, "does not equal fqdn.FqdnHostname()", hostfqdn)
|
||||
// TODO: figure out what is wrong
|
||||
}
|
||||
|
||||
/*
|
||||
var test string
|
||||
test = hshort + "." + dn
|
||||
|
||||
me.setHostname(test)
|
||||
|
||||
if (hostname != test) {
|
||||
log.Log(CHANGE, "hostname", hostname, "does not equal", test)
|
||||
if (me.hostnameStatus.Get() != "BROKEN") {
|
||||
log.Log(CHANGE, "hostname", hostname, "does not equal", test)
|
||||
if (me.status.GetHostname() != test) {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "does not equal", test)
|
||||
if (me.hostnameStatus.S != "BROKEN") {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "does not equal", test)
|
||||
me.changed = true
|
||||
me.hostnameStatus.Set("BROKEN")
|
||||
me.hostnameStatus.SetText("BROKEN")
|
||||
}
|
||||
} else {
|
||||
if (me.hostnameStatus.Get() != "VALID") {
|
||||
log.Log(CHANGE, "hostname", hostname, "is valid")
|
||||
me.hostnameStatus.Set("VALID")
|
||||
if (me.hostnameStatus.S != "VALID") {
|
||||
log.Log(CHANGE, "me.hostname", me.status.GetHostname(), "is valid")
|
||||
me.hostnameStatus.SetText("VALID")
|
||||
me.changed = true
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// returns true if the hostname is good
|
||||
|
|
|
@ -8,15 +8,14 @@ import (
|
|||
"os"
|
||||
"os/user"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"go.wit.com/log"
|
||||
)
|
||||
|
||||
func linuxLoop() {
|
||||
me.changed = false
|
||||
duration := timeFunction(lookupHostname)
|
||||
log.Log(INFO, "getHostname() execution Time: ", duration, "me.changed =", me.changed)
|
||||
duration := timeFunction(getHostname)
|
||||
log.Info("getHostname() execution Time: ", duration, "me.changed =", me.changed)
|
||||
|
||||
duration = timeFunction(scanInterfaces)
|
||||
log.Log(NET, "scanInterfaces() execution Time: ", duration)
|
||||
|
@ -24,13 +23,17 @@ func linuxLoop() {
|
|||
log.Log(NET, strconv.Itoa(i) + " iface = " + t.iface.Name)
|
||||
}
|
||||
|
||||
// get all the real AAAA records from all the network interfaces linux can see
|
||||
tmp := strings.Join(realAAAA(), "\n")
|
||||
tmp = sortLines(tmp)
|
||||
me.workingIPv6.Set(tmp)
|
||||
var aaaa []string
|
||||
aaaa = dhcpAAAA()
|
||||
var all string
|
||||
for _, s := range aaaa {
|
||||
log.Log(NET, "my actual AAAA = ",s)
|
||||
all += s + "\n"
|
||||
}
|
||||
// me.IPv6.SetText(all)
|
||||
|
||||
user, _ := user.Current()
|
||||
log.Log(INFO, "os.Getuid =", user.Username, os.Getuid())
|
||||
log.Println("os.Getuid =", user.Username, os.Getuid())
|
||||
if (me.uid != nil) {
|
||||
me.uid.Set(user.Username + " (" + strconv.Itoa(os.Getuid()) + ")")
|
||||
}
|
||||
|
|
|
@ -4,12 +4,40 @@ package linuxstatus
|
|||
import (
|
||||
// "log"
|
||||
"net"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.wit.com/log"
|
||||
)
|
||||
|
||||
// this doesn't work
|
||||
/*
|
||||
func watchNetworkInterfaces() {
|
||||
// Get list of network interfaces
|
||||
interfaces, _ := net.Interfaces()
|
||||
|
||||
// Set up a notification channel
|
||||
notification := make(chan net.Interface)
|
||||
|
||||
log.Log(NET, "watchNet()")
|
||||
// Start goroutine to watch for changes
|
||||
go func() {
|
||||
log.Log(NET, "watchNet() func")
|
||||
for {
|
||||
log.Log(NET, "forever loop start")
|
||||
// Check for changes in each interface
|
||||
for _, i := range interfaces {
|
||||
log.Log(NET, "something on i =", i)
|
||||
if status := i.Flags & net.FlagUp; status != 0 {
|
||||
notification <- i
|
||||
log.Log(NET, "something on i =", i)
|
||||
}
|
||||
}
|
||||
log.Log(NET, "forever loop end")
|
||||
}
|
||||
}()
|
||||
}
|
||||
*/
|
||||
|
||||
func IsIPv6(address string) bool {
|
||||
return strings.Count(address, ":") >= 2
|
||||
}
|
||||
|
@ -46,7 +74,7 @@ func renameInterface(i *net.Interface) {
|
|||
func checkInterface(i net.Interface) {
|
||||
val, ok := me.ifmap[i.Index]
|
||||
if ! ok {
|
||||
log.Log(INFO, i.Name, "is a new network interface. The linux kernel index =", i.Index)
|
||||
log.Info(i.Name, "is a new network interface. The linux kernel index =", i.Index)
|
||||
me.ifmap[i.Index] = new(IFtype)
|
||||
me.ifmap[i.Index].gone = false
|
||||
me.ifmap[i.Index].iface = &i
|
||||
|
@ -60,7 +88,7 @@ func checkInterface(i net.Interface) {
|
|||
me.ifmap[i.Index].gone = false
|
||||
log.Log(NET, "me.ifmap[i] does exist. Need to compare everything.", i.Index, i.Name, val.iface.Index, val.iface.Name)
|
||||
if (val.iface.Name != i.Name) {
|
||||
log.Log(INFO, val.iface.Name, "has changed to it's name to", i.Name)
|
||||
log.Info(val.iface.Name, "has changed to it's name to", i.Name)
|
||||
me.ifmap[i.Index].iface = &i
|
||||
me.changed = true
|
||||
if (me.Interfaces != nil) {
|
||||
|
@ -75,7 +103,7 @@ func checkInterface(i net.Interface) {
|
|||
These are the real IP address you have been
|
||||
given from DHCP
|
||||
*/
|
||||
func realAAAA() []string {
|
||||
func dhcpAAAA() []string {
|
||||
var aaaa []string
|
||||
|
||||
for s, t := range me.ipmap {
|
||||
|
@ -115,14 +143,14 @@ func checkDNS() (map[string]*IPtype, map[string]*IPtype) {
|
|||
ipt = "IPv6"
|
||||
}
|
||||
if (t.IsReal()) {
|
||||
log.Log(INFO, "\tIP is Real ", ipt, i.Index, i.Name, s)
|
||||
log.Info("\tIP is Real ", ipt, i.Index, i.Name, s)
|
||||
if (t.ipv6) {
|
||||
ipv6s[s] = t
|
||||
} else {
|
||||
ipv4s[s] = t
|
||||
}
|
||||
} else {
|
||||
log.Log(INFO, "\tIP is not Real", ipt, i.Index, i.Name, s)
|
||||
log.Info("\tIP is not Real", ipt, i.Index, i.Name, s)
|
||||
}
|
||||
}
|
||||
return ipv6s, ipv4s
|
||||
|
@ -164,14 +192,14 @@ func checkIP(ip *net.IPNet, i net.Interface) bool {
|
|||
}
|
||||
}
|
||||
if (IsReal(&ip.IP)) {
|
||||
log.Log(INFO, "\tIP is Real ", t, i.Index, i.Name, realip)
|
||||
log.Info("\tIP is Real ", t, i.Index, i.Name, realip)
|
||||
} else {
|
||||
log.Log(INFO, "\tIP is not Real", t, i.Index, i.Name, realip)
|
||||
log.Info("\tIP is not Real", t, i.Index, i.Name, realip)
|
||||
}
|
||||
log.Log(NET, "\t\tIP is IsPrivate() =", ip.IP.IsPrivate())
|
||||
log.Log(NET, "\t\tIP is IsLoopback() =", ip.IP.IsLoopback())
|
||||
log.Log(NET, "\t\tIP is IsLinkLocalUnicast() =", ip.IP.IsLinkLocalUnicast())
|
||||
// log.Log(INFO, "HERE HERE", "realip =", realip, "me.ip[realip]=", me.ipmap[realip])
|
||||
// log.Info("HERE HERE", "realip =", realip, "me.ip[realip]=", me.ipmap[realip])
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -182,7 +210,7 @@ func scanInterfaces() {
|
|||
log.Log(NET, SPEW, ifaces)
|
||||
for _, i := range ifaces {
|
||||
addrs, _ := i.Addrs()
|
||||
// log.Log(INFO, "range ifaces = ", i)
|
||||
// log.Info("range ifaces = ", i)
|
||||
checkInterface(i)
|
||||
log.Log(NET, "*net.Interface.Name = ", i.Name, i.Index)
|
||||
log.Log(NET, SPEW, i)
|
||||
|
@ -212,35 +240,28 @@ func scanInterfaces() {
|
|||
|
||||
// displays the IP address found on your network interfaces
|
||||
func updateRealAAAA() {
|
||||
var all4 []string
|
||||
var all6 []string
|
||||
var all4 string
|
||||
var all6 string
|
||||
for s, t := range me.ipmap {
|
||||
if (t.ipv4) {
|
||||
all4 = append(all4, s)
|
||||
all4 += s + "\n"
|
||||
log.Log(NET, "IPv4 =", s)
|
||||
} else if (t.ipv6) {
|
||||
all6 = append(all6, s)
|
||||
all6 += s + "\n"
|
||||
log.Log(NET, "IPv6 =", s)
|
||||
} else {
|
||||
log.Log(NET, "???? =", s)
|
||||
}
|
||||
}
|
||||
|
||||
// sort and create text
|
||||
sort.Strings(all4)
|
||||
sort.Strings(all6)
|
||||
s4 := strings.Join(all4, "\n")
|
||||
s6 := strings.Join(all6, "\n")
|
||||
|
||||
if (me.IPv4.Get() != s4) {
|
||||
log.Log(CHANGE, "IPv4 addresses have changed", s4)
|
||||
me.IPv4.Set(s4)
|
||||
me.changed = true
|
||||
all4 = sortLines(all4)
|
||||
all6 = sortLines(all6)
|
||||
if (me.IPv4.Get() != all4) {
|
||||
log.Log(NET, "IPv4 addresses have changed", all4)
|
||||
me.IPv4.Set(all4)
|
||||
}
|
||||
if (me.IPv6.Get() != s6) {
|
||||
log.Log(CHANGE, "IPv6 addresses have changed", s6)
|
||||
me.IPv6.Set(s6)
|
||||
me.changed = true
|
||||
if (me.IPv6.Get() != all6) {
|
||||
log.Log(NET, "IPv6 addresses have changed", all6)
|
||||
me.IPv6.Set(all6)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,38 +2,16 @@
|
|||
package linuxstatus
|
||||
|
||||
import (
|
||||
"go.wit.com/log"
|
||||
|
||||
"go.wit.com/gui/gadgets"
|
||||
)
|
||||
|
||||
func New() *LinuxStatus {
|
||||
if me != nil {
|
||||
log.Log(WARN, "You have done New() twice. You can only do this once")
|
||||
return me
|
||||
}
|
||||
me = &LinuxStatus {
|
||||
hidden: true,
|
||||
ready: false,
|
||||
}
|
||||
me.ifmap = make(map[int]*IFtype)
|
||||
me.ipmap = make(map[string]*IPtype)
|
||||
|
||||
me.init = true
|
||||
return me
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) InitWindow() {
|
||||
if ! ls.Initialized() {
|
||||
log.Log(WARN, "not initalized yet (no parent for the window?)")
|
||||
return
|
||||
}
|
||||
if ls.window != nil {
|
||||
log.Log(WARN, "You already have a window")
|
||||
ls.ready = true
|
||||
return
|
||||
}
|
||||
|
||||
log.Log(WARN, "Creating the Window")
|
||||
ls.window = gadgets.NewBasicWindow(ls.parent, "Linux OS Details")
|
||||
ls.ready = true
|
||||
// me.window = gadgets.NewBasicWindow(me.myGui, "Linux OS Details")
|
||||
}
|
||||
|
|
|
@ -14,30 +14,27 @@ import (
|
|||
var me *LinuxStatus
|
||||
|
||||
type LinuxStatus struct {
|
||||
ready bool
|
||||
hidden bool
|
||||
changed bool
|
||||
init bool
|
||||
ready bool
|
||||
hidden bool
|
||||
changed bool
|
||||
|
||||
parent *gui.Node
|
||||
|
||||
ifmap map[int]*IFtype // the current interfaces
|
||||
ipmap map[string]*IPtype // the current ip addresses
|
||||
ifmap map[int]*IFtype // the current interfaces
|
||||
ipmap map[string]*IPtype // the current ip addresses
|
||||
|
||||
window *gadgets.BasicWindow
|
||||
group *gui.Node
|
||||
grid *gui.Node
|
||||
|
||||
hostnameStatus *gadgets.OneLiner
|
||||
hostname *gadgets.OneLiner
|
||||
hostshort *gadgets.OneLiner
|
||||
domainname *gadgets.OneLiner
|
||||
resolver *gadgets.OneLiner
|
||||
fqdn *gadgets.OneLiner
|
||||
NSrr *gadgets.OneLiner
|
||||
uid *gadgets.OneLiner
|
||||
IPv4 *gadgets.OneLiner
|
||||
IPv6 *gadgets.OneLiner
|
||||
workingIPv6 *gadgets.OneLiner
|
||||
Interfaces *gui.Node
|
||||
speed *gadgets.OneLiner
|
||||
speedActual *gadgets.OneLiner
|
||||
|
||||
}
|
||||
|
|
|
@ -29,8 +29,3 @@ func sortLines(input string) string {
|
|||
tmp = strings.TrimRight(tmp, "\n")
|
||||
return tmp
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) SetSpeedActual(s string) {
|
||||
if ! ls.Ready() {return}
|
||||
ls.speedActual.Set(s)
|
||||
}
|
||||
|
|
|
@ -1,40 +1,31 @@
|
|||
package linuxstatus
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
"errors"
|
||||
|
||||
"go.wit.com/log"
|
||||
)
|
||||
|
||||
func (ls *LinuxStatus) Update() {
|
||||
if ! ls.Ready() {
|
||||
log.Log(WARN, "can't update yet. ready is false")
|
||||
log.Error(errors.New("Update() is not ready yet"))
|
||||
log.Info("linuxStatus() Update() START")
|
||||
if ls == nil {
|
||||
log.Error(errors.New("linuxStatus() Update() ls == nil"))
|
||||
return
|
||||
}
|
||||
log.Log(INFO, "Update() START")
|
||||
duration := timeFunction(func () {
|
||||
linuxLoop()
|
||||
})
|
||||
ls.SetSpeed(duration)
|
||||
log.Log(INFO, "Update() END")
|
||||
}
|
||||
|
||||
func (ls *LinuxStatus) SetSpeed(duration time.Duration) {
|
||||
s := fmt.Sprint(duration)
|
||||
if ls.speedActual == nil {
|
||||
log.Log(WARN, "can't actually warn")
|
||||
return
|
||||
}
|
||||
ls.speedActual.Set(s)
|
||||
|
||||
if (duration > 500 * time.Millisecond ) {
|
||||
ls.speed.Set("SLOW")
|
||||
// ls.speed, "SLOW")
|
||||
} else if (duration > 100 * time.Millisecond ) {
|
||||
ls.speed.Set("OK")
|
||||
// ls.speed, "OK")
|
||||
} else {
|
||||
ls.speed.Set("FAST")
|
||||
// ls.speed, "FAST")
|
||||
}
|
||||
log.Info("linuxStatus() Update() END")
|
||||
}
|
||||
|
|
38
main.go
38
main.go
|
@ -8,6 +8,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
"sort"
|
||||
"strconv"
|
||||
"runtime"
|
||||
"time"
|
||||
"embed"
|
||||
|
@ -100,7 +101,7 @@ func checkNetworkChanges() {
|
|||
if (runtime.GOOS == "linux") {
|
||||
duration := timeFunction(linuxLoop)
|
||||
s := fmt.Sprint(duration)
|
||||
me.statusOS.SetSpeedActual(s)
|
||||
me.LocalSpeedActual.SetText(s)
|
||||
} else {
|
||||
// TODO: make windows and macos diagnostics
|
||||
log.Warn("Windows and MacOS don't work yet")
|
||||
|
@ -153,16 +154,45 @@ func dnsTTL() {
|
|||
updateDNS()
|
||||
}
|
||||
|
||||
// run update on the LinuxStatus() window
|
||||
func linuxLoop() {
|
||||
me.statusOS.Update()
|
||||
me.changed = false
|
||||
log.Log(NET, "FQDN =", me.fqdn.GetText())
|
||||
duration := timeFunction(getHostname)
|
||||
log.Info("getHostname() execution Time: ", duration, "me.changed =", me.changed)
|
||||
|
||||
if (me.statusOS.Changed()) {
|
||||
duration = timeFunction(scanInterfaces)
|
||||
log.Log(NET, "scanInterfaces() execution Time: ", duration)
|
||||
for i, t := range me.ifmap {
|
||||
log.Log(NET, strconv.Itoa(i) + " iface = " + t.iface.Name)
|
||||
}
|
||||
|
||||
var aaaa []string
|
||||
aaaa = dhcpAAAA()
|
||||
var all string
|
||||
for _, s := range aaaa {
|
||||
log.Log(NET, "my actual AAAA = ",s)
|
||||
all += s + "\n"
|
||||
}
|
||||
// me.IPv6.SetText(all)
|
||||
|
||||
if (me.changed) {
|
||||
stamp := time.Now().Format("2006/01/02 15:04:05")
|
||||
log.Log(CHANGE, "Network things changed on", stamp)
|
||||
duration := timeFunction(updateDNS)
|
||||
log.Log(CHANGE, "updateDNS() execution Time: ", duration)
|
||||
}
|
||||
|
||||
/*
|
||||
processName := getProcessNameByPort(53)
|
||||
fmt.Println("Process with port 53:", processName)
|
||||
|
||||
commPath := filepath.Join("/proc", proc.Name(), "comm")
|
||||
comm, err := ioutil.ReadFile(commPath)
|
||||
if err != nil {
|
||||
return "", err // Error reading the process name
|
||||
}
|
||||
return strings.TrimSpace(string(comm)), nil
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
201
net.go
201
net.go
|
@ -9,6 +9,35 @@ import (
|
|||
"go.wit.com/log"
|
||||
)
|
||||
|
||||
// this doesn't work
|
||||
/*
|
||||
func watchNetworkInterfaces() {
|
||||
// Get list of network interfaces
|
||||
interfaces, _ := net.Interfaces()
|
||||
|
||||
// Set up a notification channel
|
||||
notification := make(chan net.Interface)
|
||||
|
||||
log.Log(NET, "watchNet()")
|
||||
// Start goroutine to watch for changes
|
||||
go func() {
|
||||
log.Log(NET, "watchNet() func")
|
||||
for {
|
||||
log.Log(NET, "forever loop start")
|
||||
// Check for changes in each interface
|
||||
for _, i := range interfaces {
|
||||
log.Log(NET, "something on i =", i)
|
||||
if status := i.Flags & net.FlagUp; status != 0 {
|
||||
notification <- i
|
||||
log.Log(NET, "something on i =", i)
|
||||
}
|
||||
}
|
||||
log.Log(NET, "forever loop end")
|
||||
}
|
||||
}()
|
||||
}
|
||||
*/
|
||||
|
||||
func IsIPv6(address string) bool {
|
||||
return strings.Count(address, ":") >= 2
|
||||
}
|
||||
|
@ -33,6 +62,43 @@ func IsReal(ip *net.IP) bool {
|
|||
}
|
||||
}
|
||||
|
||||
func renameInterface(i *net.Interface) {
|
||||
/*
|
||||
/sbin/ip link set eth1 down
|
||||
/sbin/ip link set eth1 name eth123
|
||||
/sbin/ip link set eth123 up
|
||||
*/
|
||||
}
|
||||
|
||||
// Will figure out if an interface was just added
|
||||
func checkInterface(i net.Interface) {
|
||||
val, ok := me.ifmap[i.Index]
|
||||
if ! ok {
|
||||
log.Info(i.Name, "is a new network interface. The linux kernel index =", i.Index)
|
||||
me.ifmap[i.Index] = new(IFtype)
|
||||
me.ifmap[i.Index].gone = false
|
||||
me.ifmap[i.Index].iface = &i
|
||||
me.changed = true
|
||||
if (me.Interfaces != nil) {
|
||||
me.Interfaces.AddText(i.Name)
|
||||
me.Interfaces.SetText(i.Name)
|
||||
}
|
||||
return
|
||||
}
|
||||
me.ifmap[i.Index].gone = false
|
||||
log.Log(NET, "me.ifmap[i] does exist. Need to compare everything.", i.Index, i.Name, val.iface.Index, val.iface.Name)
|
||||
if (val.iface.Name != i.Name) {
|
||||
log.Info(val.iface.Name, "has changed to it's name to", i.Name)
|
||||
me.ifmap[i.Index].iface = &i
|
||||
me.changed = true
|
||||
if (me.Interfaces != nil) {
|
||||
me.Interfaces.AddText(i.Name)
|
||||
me.Interfaces.SetText(i.Name)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
These are the real IP address you have been
|
||||
given from DHCP
|
||||
|
@ -89,3 +155,138 @@ func checkDNS() (map[string]*IPtype, map[string]*IPtype) {
|
|||
}
|
||||
return ipv6s, ipv4s
|
||||
}
|
||||
|
||||
// Will figure out if an IP address is new
|
||||
func checkIP(ip *net.IPNet, i net.Interface) bool {
|
||||
log.Log(NET, "\t\taddr.(type) = *net.IPNet")
|
||||
log.Log(NET, "\t\taddr.(type) =", ip)
|
||||
var realip string
|
||||
realip = ip.IP.String()
|
||||
|
||||
val, ok := me.ipmap[realip]
|
||||
if ok {
|
||||
log.Log(NET, val.ipnet.IP.String(), "is already a defined IP address")
|
||||
me.ipmap[realip].gone = false
|
||||
return false
|
||||
}
|
||||
|
||||
me.ipmap[realip] = new(IPtype)
|
||||
me.ipmap[realip].gone = false
|
||||
me.ipmap[realip].ipv4 = true
|
||||
me.ipmap[realip].ipnet = ip
|
||||
me.ipmap[realip].ip = ip.IP
|
||||
me.ipmap[realip].iface = &i
|
||||
t := "IPv4"
|
||||
if (IsIPv6(ip.String())) {
|
||||
me.ipmap[realip].ipv6 = true
|
||||
me.ipmap[realip].ipv4 = false
|
||||
t = "IPv6"
|
||||
if (me.IPv6 != nil) {
|
||||
me.IPv6.SetText(realip)
|
||||
}
|
||||
} else {
|
||||
me.ipmap[realip].ipv6 = false
|
||||
me.ipmap[realip].ipv4 = true
|
||||
if (me.IPv4 != nil) {
|
||||
me.IPv4.SetText(realip)
|
||||
}
|
||||
}
|
||||
if (IsReal(&ip.IP)) {
|
||||
log.Info("\tIP is Real ", t, i.Index, i.Name, realip)
|
||||
} else {
|
||||
log.Info("\tIP is not Real", t, i.Index, i.Name, realip)
|
||||
}
|
||||
log.Log(NET, "\t\tIP is IsPrivate() =", ip.IP.IsPrivate())
|
||||
log.Log(NET, "\t\tIP is IsLoopback() =", ip.IP.IsLoopback())
|
||||
log.Log(NET, "\t\tIP is IsLinkLocalUnicast() =", ip.IP.IsLinkLocalUnicast())
|
||||
// log.Info("HERE HERE", "realip =", realip, "me.ip[realip]=", me.ipmap[realip])
|
||||
return true
|
||||
}
|
||||
|
||||
func scanInterfaces() {
|
||||
log.Log(NET, "scanInterfaces() START")
|
||||
ifaces, _ := net.Interfaces()
|
||||
// me.ifnew = ifaces
|
||||
log.Log(NET, SPEW, ifaces)
|
||||
for _, i := range ifaces {
|
||||
addrs, _ := i.Addrs()
|
||||
// log.Info("range ifaces = ", i)
|
||||
checkInterface(i)
|
||||
log.Log(NET, "*net.Interface.Name = ", i.Name, i.Index)
|
||||
log.Log(NET, SPEW, i)
|
||||
log.Log(NET, SPEW, addrs)
|
||||
for _, addr := range addrs {
|
||||
log.Log(NET, "\taddr =", addr)
|
||||
log.Log(NET, SPEW, addrs)
|
||||
ips, _ := net.LookupIP(addr.String())
|
||||
log.Log(NET, "\tLookupIP(addr) =", ips)
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
if checkIP(v, i) {
|
||||
log.Log(true, "scanInterfaces() IP is new () i =", v.IP.String())
|
||||
}
|
||||
default:
|
||||
log.Log(NET, "\t\taddr.(type) = NO IDEA WHAT TO DO HERE v =", v)
|
||||
}
|
||||
}
|
||||
}
|
||||
if deleteChanges() {
|
||||
me.changed = true
|
||||
log.Log(NET, "deleteChanges() detected network changes")
|
||||
}
|
||||
updateRealAAAA()
|
||||
log.Log(NET, "scanInterfaces() END")
|
||||
}
|
||||
|
||||
// displays the IP address found on your network interfaces
|
||||
func updateRealAAAA() {
|
||||
var all4 string
|
||||
var all6 string
|
||||
for s, t := range me.ipmap {
|
||||
if (t.ipv4) {
|
||||
all4 += s + "\n"
|
||||
log.Log(NET, "IPv4 =", s)
|
||||
} else if (t.ipv6) {
|
||||
all6 += s + "\n"
|
||||
log.Log(NET, "IPv6 =", s)
|
||||
} else {
|
||||
log.Log(NET, "???? =", s)
|
||||
}
|
||||
}
|
||||
all4 = sortLines(all4)
|
||||
all6 = sortLines(all6)
|
||||
if (me.IPv4.S != all4) {
|
||||
log.Log(NET, "IPv4 addresses have changed", all4)
|
||||
me.IPv4.SetText(all4)
|
||||
}
|
||||
if (me.IPv6.S != all6) {
|
||||
log.Log(NET, "IPv6 addresses have changed", all6)
|
||||
me.IPv6.SetText(all6)
|
||||
}
|
||||
}
|
||||
|
||||
// delete network interfaces and ip addresses from the gui
|
||||
func deleteChanges() bool {
|
||||
var changed bool = false
|
||||
for i, t := range me.ifmap {
|
||||
if (t.gone) {
|
||||
log.Log(CHANGE, "DELETE int =", i, "name =", t.name, t.iface)
|
||||
delete(me.ifmap, i)
|
||||
changed = true
|
||||
}
|
||||
t.gone = true
|
||||
}
|
||||
for s, t := range me.ipmap {
|
||||
if (t.gone) {
|
||||
log.Log(CHANGE, "DELETE name =", s, "IPv4 =", t.ipv4)
|
||||
log.Log(CHANGE, "DELETE name =", s, "IPv6 =", t.ipv6)
|
||||
log.Log(CHANGE, "DELETE name =", s, "iface =", t.iface)
|
||||
log.Log(CHANGE, "DELETE name =", s, "ip =", t.ip)
|
||||
delete(me.ipmap, s)
|
||||
changed = true
|
||||
}
|
||||
t.gone = true
|
||||
}
|
||||
|
||||
return changed
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ func nsupdate() {
|
|||
cmd := "go-nsupdate --tsig-algorithm=hmac-sha512"
|
||||
tsigSecret = os.Getenv("TIG_SECRET")
|
||||
cmd += " --tig-secret=\"" + tsigSecret + "\""
|
||||
cmd += " -i wlo1 " + me.statusOS.GetHostname()
|
||||
cmd += " -i wlo1 " + me.status.GetHostname()
|
||||
log.Log(NET, "nsupdate() RUN:", cmd)
|
||||
|
||||
for s, t := range me.ipmap {
|
||||
|
|
16
structs.go
16
structs.go
|
@ -19,7 +19,9 @@ type Host struct {
|
|||
statusOS *linuxstatus.LinuxStatus // what the Linux OS sees
|
||||
|
||||
hostnameStatus *gui.Node // a summary for the user of where things are
|
||||
hostname *gadgets.OneLiner // the hostname grabbed from gadget.linuxStatus
|
||||
|
||||
// domainname *gui.Node // kernel.org
|
||||
hostshort *gui.Node // hostname -s
|
||||
|
||||
artificialSleep float64 `default:"0.7"` // artificial sleep on startup
|
||||
artificialS string `default:"abc"` // artificial sleep on startup
|
||||
|
@ -42,19 +44,25 @@ type Host struct {
|
|||
ipv6s map[string]dns.RR
|
||||
|
||||
window *gadgets.BasicWindow // the main window
|
||||
details *gadgets.BasicWindow // more details of the DNS state
|
||||
debug *gadgets.BasicWindow // more attempts to debug the DNS state
|
||||
|
||||
tab *gui.Node // the main dns tab
|
||||
notes *gui.Node // using this to put notes here
|
||||
|
||||
// local OS settings, network interfaces, etc
|
||||
// fqdn *gui.Node // display the full hostname
|
||||
// Interfaces *gui.Node // Interfaces
|
||||
// LocalSpeedActual *gui.Node // the time it takes to check each network interface
|
||||
// uid *gui.Node // user
|
||||
fqdn *gui.Node // display the full hostname
|
||||
IPv4 *gui.Node // show valid IPv4 addresses
|
||||
IPv6 *gui.Node // show valid IPv6 addresses
|
||||
Interfaces *gui.Node // Interfaces
|
||||
LocalSpeedActual *gui.Node // the time it takes to check each network interface
|
||||
|
||||
// DNS stuff
|
||||
NSrr *gui.Node // NS resource records for the domain name
|
||||
DnsAPI *gui.Node // what DNS API to use?
|
||||
DnsAAAA *gadgets.OneLiner // the actual DNS AAAA results
|
||||
workingIPv6 *gui.Node // currently working AAAA
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue