summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2023-02-09 09:07:00 -0600
committerJeff Carr <[email protected]>2023-02-09 09:07:00 -0600
commitd00a8f5cd32147370f8318b1e469558f44b6c81e (patch)
treec45e8d0fd0f7da398bbe765a9fe10afc5f984372
parent00082af773b80948418bc9eb471ab22498e80c75 (diff)
a bunch more dns stuff
Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--Makefile3
-rw-r--r--gui.go31
-rw-r--r--main.go69
-rw-r--r--unix.go41
4 files changed, 144 insertions, 0 deletions
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(<raw ipv6>) == 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)
+ }
+}