From d00a8f5cd32147370f8318b1e469558f44b6c81e Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 9 Feb 2023 09:07:00 -0600 Subject: [PATCH] a bunch more dns stuff Signed-off-by: Jeff Carr --- Makefile | 3 +++ gui.go | 31 +++++++++++++++++++++++++ main.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ unix.go | 41 +++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 unix.go diff --git a/Makefile b/Makefile index 926ed4e..db0acb2 100644 --- a/Makefile +++ b/Makefile @@ -11,3 +11,6 @@ build: update: GO111MODULE="off" go get -v -u -x . + +clean: + rm control-panel-dns diff --git a/gui.go b/gui.go index 6f1a7f3..3b6270c 100644 --- a/gui.go +++ b/gui.go @@ -3,8 +3,11 @@ package main import ( "os" + "os/user" "log" + "net" "git.wit.org/wit/gui" + "github.com/davecgh/go-spew/spew" ) // This initializes the first window @@ -31,6 +34,8 @@ func initGUI() { func addDemoTab(window *gui.Node, title string) { var newNode, g, g2, tb *gui.Node + var err error + var name string newNode = window.NewTab(title) log.Println("addDemoTab() newNode.Dump") @@ -53,6 +58,32 @@ func addDemoTab(window *gui.Node, title string) { s := tb.GetText() log.Println("text =", s) } + g2.NewButton("hello", func () { + log.Println("world") + scanInterfaces() + }) + g2.NewButton("os.Hostname()", func () { + name, err = os.Hostname() + log.Println("name =", name, err) + }) + g2.NewButton("os.User()", func () { + user, _ := user.Current() + spew.Dump(user) + log.Println("os.Getuid =", os.Getuid()) + }) + g2.NewButton("Escalate()", func () { + Escalate() + }) + g2.NewButton("LookupAddr() == fire from /etc/hosts", func () { + host, err := net.LookupAddr("2600:1700:afd5:6000:b26e:bfff:fe80:3c52") + if err != nil { + return + } + log.Println("host =", host) + }) + g2.NewButton("DumpPublicDNSZone(apple.com)", func () { + DumpPublicDNSZone("apple.com") + }) } func myDefaultExit(n *gui.Node) { diff --git a/main.go b/main.go index c248501..29c8829 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,8 @@ package main import ( "log" + "net" + "github.com/fsnotify/fsnotify" "git.wit.org/wit/gui" arg "github.com/alexflint/go-arg" ) @@ -13,5 +15,72 @@ func main() { log.Println("Toolkit = ", args.Toolkit) // gui.InitPlugins([]string{"andlabs"}) + + scanInterfaces() + watchNetworkInterfaces() + go inotifyNetworkInterfaceChanges() gui.Main(initGUI) } + +func watchNetworkInterfaces() { + // Get list of network interfaces + interfaces, _ := net.Interfaces() + + // Set up a notification channel + notification := make(chan net.Interface) + + // Start goroutine to watch for changes + go func() { + for { + // Check for changes in each interface + for _, i := range interfaces { + if status := i.Flags & net.FlagUp; status != 0 { + notification <- i + log.Println("something on i =", i) + } + } + } + }() +} + +func inotifyNetworkInterfaceChanges() error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + return err + } + defer watcher.Close() + + // Watch for network interface changes + err = watcher.Add("/sys/class/net") + if err != nil { + return err + } + for { + select { + case event := <-watcher.Events: + log.Println("inotifyNetworkInterfaceChanges() event =", event) + if event.Op&fsnotify.Create == fsnotify.Create { + // Do something on network interface creation + } + case err := <-watcher.Errors: + return err + } + } +} + +func scanInterfaces() { + ifaces, _ := net.Interfaces() + for _, i := range ifaces { + log.Println(i) + addrs, _ := i.Addrs() + for _, addr := range addrs { + log.Println("\taddr =", addr) + switch v := addr.(type) { + case *net.IPNet: + log.Println("\t\taddr.(type) = *net.IPNet") + default: + log.Println("\t\taddr.(type) =", v) + } + } + } +} diff --git a/unix.go b/unix.go new file mode 100644 index 0000000..b953c60 --- /dev/null +++ b/unix.go @@ -0,0 +1,41 @@ +// This creates a simple hello world window +package main + +import ( + "os" + "os/exec" + "log" + "net" +// "git.wit.org/wit/gui" +// "github.com/davecgh/go-spew/spew" +) + +func CheckSuperuser() bool { + return os.Getuid() == 0 +} + +func Escalate() { + if os.Getuid() != 0 { + cmd := exec.Command("sudo", "./control-panel-dns") + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + if err != nil { + log.Fatal(err) + } + } +} + +// You need permission to do a zone transfer. Otherwise: +// dig +noall +answer +multiline lab.wit.org any +// dig +all +multiline fire.lab.wit.org # gives the zonefile header (ttl vals) +func DumpPublicDNSZone(zone string) { + entries, err := net.LookupHost(zone) + if err != nil { + panic(err) + } + for _, entry := range entries { + log.Println(entry) + } +}