fuck this shit about logging. I hate log.whatthefuck*(){}

Do you know what I fucking don't care about? log()

You don't fucking care either. Fucking ignore it until you need it
that is what fucking logging is for. building something that works.

So, here you go. a fucking log() function.

Also, because I'm annoyed today sleep() and exit()

Because, when I want you to fucking sleep or fucking exit, I don't
want to go to the top of a file and declare stupid shit related
to nanoseconds or add "import os.Exit" or whatever the fuck. fucking
exit or fucking sleep. god damn it, you know what I fucking wanted.

stop wasting my time. life is short.

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2023-02-17 00:43:24 -06:00
parent c228c00d98
commit 6c5413a71f
10 changed files with 273 additions and 92 deletions

20
dns.go
View File

@ -7,27 +7,11 @@ package main
import ( import (
// "os" // "os"
// "os/exec" // "os/exec"
"log"
"net" "net"
// "git.wit.org/wit/gui" // "git.wit.org/wit/gui"
// "github.com/davecgh/go-spew/spew" // "github.com/davecgh/go-spew/spew"
) )
type IPtype struct {
// IP string
IPv4 bool
IPv6 bool
LinkLocal bool
}
type Host struct {
Name string
domainname string
hostname string
fqdn string
ips map[string]*IPtype
}
/* /*
Check a bunch of things. If they don't work right, then things are not correctly configured Check a bunch of things. If they don't work right, then things are not correctly configured
They are things like: They are things like:
@ -43,9 +27,9 @@ func (h *Host) verifyETC() bool {
func (h *Host) updateIPs(host string) { func (h *Host) updateIPs(host string) {
ips, err := net.LookupIP(host) ips, err := net.LookupIP(host)
if err != nil { if err != nil {
log.Fatal(err) exit(err)
} }
for _, ip := range ips { for _, ip := range ips {
log.Println(host, ip) log(host, ip)
} }
} }

76
fsnotify.go Normal file
View File

@ -0,0 +1,76 @@
package main
// Watches for changes to a directory. Works cross-platform
import (
"github.com/fsnotify/fsnotify"
)
// This would be a really dumb way to watch for new network interfaces
// since it then watches a linux only directory /sys/class/net for changes
func watchSysClassNet() {
// Create new watcher.
watcher, err := fsnotify.NewWatcher()
if err != nil {
exit(err)
}
defer watcher.Close()
// Start listening for events.
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
log("event:", event)
if event.Has(fsnotify.Write) {
log("modified file:", event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log("error:", err)
}
}
}()
// Add a path.
err = watcher.Add("/tmp")
if err != nil {
exit(err)
}
// Block main goroutine forever.
<-make(chan struct{})
}
func fsnotifyNetworkInterfaceChanges() 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("fsnotifyNetworkInterfaceChanges() event =", event)
if event.Op&fsnotify.Create == fsnotify.Create {
// Do something on network interface creation
}
case err := <-watcher.Errors:
log("fsnotifyNetworkInterfaceChanges() event err =", err)
return err
}
}
}

19
gui.go
View File

@ -4,7 +4,6 @@ package main
import ( import (
"os" "os"
"os/user" "os/user"
"log"
"net" "net"
"git.wit.org/wit/gui" "git.wit.org/wit/gui"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
@ -38,7 +37,7 @@ func addDNSTab(window *gui.Node, title string) {
var name string var name string
newNode = window.NewTab(title) newNode = window.NewTab(title)
log.Println("addDemoTab() newNode.Dump") log("addDemoTab() newNode.Dump")
newNode.Dump() newNode.Dump()
g = newNode.NewGroup("group 1") g = newNode.NewGroup("group 1")
@ -49,32 +48,32 @@ func addDNSTab(window *gui.Node, title string) {
dd.OnChanged = func(*gui.Node) { dd.OnChanged = func(*gui.Node) {
s := dd.GetText() s := dd.GetText()
tb.SetText("hello world " + args.User + "\n" + s) tb.SetText("hello world " + args.User + "\n" + s)
log.Println("text =", s) log("text =", s)
} }
g.NewLabel("UID =") g.NewLabel("UID =")
g2 = newNode.NewGroup("group 2") g2 = newNode.NewGroup("group 2")
tb = g2.NewTextbox("tb") tb = g2.NewTextbox("tb")
log.Println("tb =", tb.GetText()) log("tb =", tb.GetText())
tb.OnChanged = func(*gui.Node) { tb.OnChanged = func(*gui.Node) {
s := tb.GetText() s := tb.GetText()
log.Println("text =", s) log("text =", s)
} }
g2.NewButton("hello", func () { g2.NewButton("hello", func () {
log.Println("world") log("world")
}) })
g2.NewButton("scanInterfaces()", func () { g2.NewButton("scanInterfaces()", func () {
scanInterfaces() scanInterfaces()
}) })
g2.NewButton("os.Hostname()", func () { g2.NewButton("os.Hostname()", func () {
name, err = os.Hostname() name, err = os.Hostname()
log.Println("name =", name, err) log("name =", name, err)
}) })
g2.NewButton("os.User()", func () { g2.NewButton("os.User()", func () {
user, _ := user.Current() user, _ := user.Current()
spew.Dump(user) spew.Dump(user)
log.Println("os.Getuid =", os.Getuid()) log("os.Getuid =", os.Getuid())
}) })
g2.NewButton("Escalate()", func () { g2.NewButton("Escalate()", func () {
Escalate() Escalate()
@ -84,7 +83,7 @@ func addDNSTab(window *gui.Node, title string) {
if err != nil { if err != nil {
return return
} }
log.Println("host =", host) log("host =", host)
}) })
g2.NewButton("DumpPublicDNSZone(apple.com)", func () { g2.NewButton("DumpPublicDNSZone(apple.com)", func () {
DumpPublicDNSZone("apple.com") DumpPublicDNSZone("apple.com")
@ -93,6 +92,6 @@ func addDNSTab(window *gui.Node, title string) {
} }
func myDefaultExit(n *gui.Node) { func myDefaultExit(n *gui.Node) {
log.Println("You can Do exit() things here") log("You can Do exit() things here")
os.Exit(0) os.Exit(0)
} }

View File

@ -34,9 +34,24 @@ if [ "$1" = "down" ]; then
exit exit
fi fi
if [ "$1" = "ping" ]; then
ping -c 3 2001:470:1f10:13d::1
exit
fi
modprobe ipv6 modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 184.105.253.14 local 74.87.91.117 ttl 255 ip tunnel add he-ipv6 mode sit remote 184.105.253.14 local 40.132.180.131 ttl 255
ip link set he-ipv6 up ip link set he-ipv6 up
ip addr add 2001:470:1f10:2a::2/64 dev he-ipv6 ip addr add 2001:470:1f10:13d::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6 ip route add ::/0 dev he-ipv6
ip -f inet6 addr ip -f inet6 addr
ifconfig he-ipv6 mtu 1460
# old attempt from the something or pabtz hotel
# modprobe ipv6
# ip tunnel add he-ipv6 mode sit remote 184.105.253.14 local 74.87.91.117 ttl 255
# ip link set he-ipv6 up
# ip addr add 2001:470:1f10:2a::2/64 dev he-ipv6
# ip route add ::/0 dev he-ipv6
# ip -f inet6 addr

86
log.go Normal file
View File

@ -0,0 +1,86 @@
// I like things to be easy. Why can't the standard language be like this?
package main
import (
"os"
golog "log"
"reflect"
"github.com/davecgh/go-spew/spew"
// "net"
)
/*
sleep() # you know what this does? sleeps for 1 second. yep. dump. easy.
sleep(.1) # you know what this does? yes, it sleeps for 1/10th of a second
*/
func sleep(a ...any) {
log("sleep", a)
}
/*
exit() # yep. exits. I guess everything must be fine
exit(3) # I guess 3 it is then
exit("dont like apples") # ok. I'll make a note of that
*/
func exit(a ...any) {
log("exit", a)
//if (a) {
// os.Exit(a)
//}
os.Exit(0)
}
/*
I've spent, am spending, too much time thinking about 'logging'. 'log', 'logrus', 'zap', whatever.
I'm not twitter. i don't give a fuck about how many nanoseconds it takes to log. Anyway, this
implementation is probably faster than all of those because you just set one bool to FALSE
and it all stops.
Sometimes I need to capture to stdout, sometimes stdout can't
work because it doesn't exist for the user. This whole thing is a PITA. Then it's spread over 8 million references in every .go file. I'm tapping out and putting
it in one place. here it is. Also, this makes having debug levels really fucking easy. You can define whatever level of logging you want from anywhere (command line)
etc.
log() # doesn't do anything
log(stuff) # sends it to whatever log you define in a single place. here is the place
*/
var LOGOFF bool // turn this off, all logging stops
var WARN bool
var INFO bool
type spewt struct {
a bool
}
var SPEW spewt
func log(a ...any) {
if (LOGOFF) {
return
}
if (a == nil) {
return
}
var blah bool
if (reflect.TypeOf(a[0]) == reflect.TypeOf(blah)) {
// golog.Println("\t a[0] = bool")
if (a[0] == false) {
return
}
a = a[1:]
}
if (reflect.TypeOf(a[0]) == reflect.TypeOf(SPEW)) {
a = a[1:]
spew.Dump(a)
return
}
golog.Println(a...)
// golog.Println("\t a[0] =", a[0])
// for argNum, arg := range a {
// golog.Println("\t", argNum, arg)
// }
}

View File

@ -2,19 +2,16 @@
package main package main
import ( import (
"log"
// "net" // "net"
// "github.com/fsnotify/fsnotify" // "github.com/fsnotify/fsnotify"
"git.wit.org/wit/gui" "git.wit.org/wit/gui"
arg "github.com/alexflint/go-arg" arg "github.com/alexflint/go-arg"
) )
var me Host
func main() { func main() {
arg.MustParse(&args) arg.MustParse(&args)
// fmt.Println(args.Foo, args.Bar, args.User) // fmt.Println(args.Foo, args.Bar, args.User)
log.Println("Toolkit = ", args.Toolkit) log("Toolkit = ", args.Toolkit)
me.ips = make(map[string]*IPtype) me.ips = make(map[string]*IPtype)
@ -22,6 +19,5 @@ func main() {
scanInterfaces() scanInterfaces()
watchNetworkInterfaces() watchNetworkInterfaces()
go inotifyNetworkInterfaceChanges()
gui.Main(initGUI) gui.Main(initGUI)
} }

88
net.go
View File

@ -2,14 +2,14 @@
package main package main
import ( import (
"log"
"net" "net"
"strings" "strings"
"github.com/fsnotify/fsnotify"
// "git.wit.org/wit/gui" // "git.wit.org/wit/gui"
"github.com/davecgh/go-spew/spew"
) )
var DEBUGNET bool = false
// this doesn't work
func watchNetworkInterfaces() { func watchNetworkInterfaces() {
// Get list of network interfaces // Get list of network interfaces
interfaces, _ := net.Interfaces() interfaces, _ := net.Interfaces()
@ -17,45 +17,28 @@ func watchNetworkInterfaces() {
// Set up a notification channel // Set up a notification channel
notification := make(chan net.Interface) notification := make(chan net.Interface)
log(DEBUGNET, "watchNet()")
// Start goroutine to watch for changes // Start goroutine to watch for changes
go func() { go func() {
log(DEBUGNET, "watchNet() func")
for { for {
log(DEBUGNET, "forever loop start")
// Check for changes in each interface // Check for changes in each interface
for _, i := range interfaces { for _, i := range interfaces {
log(DEBUGNET, "something on i =", i)
if status := i.Flags & net.FlagUp; status != 0 { if status := i.Flags & net.FlagUp; status != 0 {
notification <- i notification <- i
log.Println("something on i =", i) log(DEBUGNET, "something on i =", i)
} }
} }
log.Println("forever loop") log(DEBUGNET, "forever loop end")
} }
}() }()
} log()
log(true, "this is true")
func inotifyNetworkInterfaceChanges() error { log(false, "this is false")
watcher, err := fsnotify.NewWatcher() sleep(10.3)
if err != nil { exit(0)
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:
log.Println("inotifyNetworkInterfaceChanges() event err =", err)
return err
}
}
} }
func IsIPv6(address string) bool { func IsIPv6(address string) bool {
@ -64,49 +47,50 @@ func IsIPv6(address string) bool {
func IsReal(ip *net.IP) bool { func IsReal(ip *net.IP) bool {
if (ip.IsPrivate() || ip.IsLoopback() || ip.IsLinkLocalUnicast()) { if (ip.IsPrivate() || ip.IsLoopback() || ip.IsLinkLocalUnicast()) {
log.Println("\t\tIP is Real = false") log(DEBUGNET, "\t\tIP is Real = false")
return false return false
} else { } else {
log.Println("\t\tIP is Real = true") log(DEBUGNET, "\t\tIP is Real = true")
return true return true
} }
} }
func scanInterfaces() { func scanInterfaces() {
ifaces, _ := net.Interfaces() ifaces, _ := net.Interfaces()
spew.Dump(ifaces) log(DEBUGNET, SPEW, ifaces)
for _, i := range ifaces { for _, i := range ifaces {
addrs, _ := i.Addrs() addrs, _ := i.Addrs()
log.Println("addrs = ", i) // log("range ifaces = ", i)
spew.Dump(addrs) log("*net.Interface.Name = ", i.Name)
log(SPEW, i)
log(DEBUGNET, SPEW, addrs)
for _, addr := range addrs { for _, addr := range addrs {
log.Println("\taddr =", addr) log(DEBUGNET, "\taddr =", addr)
spew.Dump(addr) log(DEBUGNET, SPEW, addrs)
ips, _ := net.LookupIP(addr.String()) ips, _ := net.LookupIP(addr.String())
log.Println("\tLookupIP(addr) =", ips) log(DEBUGNET, "\tLookupIP(addr) =", ips)
switch v := addr.(type) { switch v := addr.(type) {
case *net.IPNet: case *net.IPNet:
log.Println("\t\taddr.(type) = *net.IPNet") log(DEBUGNET, "\t\taddr.(type) = *net.IPNet")
log.Println("\t\taddr.(type) =", v) log(DEBUGNET, "\t\taddr.(type) =", v)
ip := v.IP ip := v.IP
// spew.Dump(ip) log(DEBUGNET, "\t\taddr.IP =", ip)
log.Println("\t\taddr.IP =", ip)
if (IsIPv6(ip.String())) { if (IsIPv6(ip.String())) {
log.Println("\t\tIP is IPv6") log(DEBUGNET, "\t\tIP is IPv6")
} else { } else {
log.Println("\t\tIP is IPv4") log(DEBUGNET, "\t\tIP is IPv4")
} }
if (IsReal(&ip)) { if (IsReal(&ip)) {
log.Println("\t\tIP is Real = true") log("\tIP is Real ", addr)
} else { } else {
log.Println("\t\tIP is Real = false") log("\tIP is not Real", addr)
} }
log.Println("\t\tIP is IsPrivate() =", ip.IsPrivate()) log(DEBUGNET, "\t\tIP is IsPrivate() =", ip.IsPrivate())
log.Println("\t\tIP is IsLoopback() =", ip.IsLoopback()) log(DEBUGNET, "\t\tIP is IsLoopback() =", ip.IsLoopback())
log.Println("\t\tIP is IsLinkLocalUnicast() =", ip.IsLinkLocalUnicast()) log(DEBUGNET, "\t\tIP is IsLinkLocalUnicast() =", ip.IsLinkLocalUnicast())
// log.Println("\t\tIP is () =", ip.()) // log("\t\tIP is () =", ip.())
default: default:
log.Println("\t\taddr.(type) = NO IDEA WHAT TO DO HERE v =", v) log(DEBUGNET, "\t\taddr.(type) = NO IDEA WHAT TO DO HERE v =", v)
} }
} }
} }

View File

@ -1,5 +1,21 @@
package main package main
// examples of what ifconfig does
// example of AF_NETLINK change:
// https://stackoverflow.com/questions/579783/how-to-detect-ip-address-change-programmatically-in-linux/2353441#2353441
// from that page, a link to watch for any ip event:
// https://github.com/angt/ipevent/blob/master/ipevent.c
/*
c example from ipevent.c :
int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
struct sockaddr_nl snl = {
.nl_family = AF_NETLINK,
.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR,
};
*/
/* /*
import ( import (
// "os" // "os"

26
structs.go Normal file
View File

@ -0,0 +1,26 @@
// This creates a simple hello world window
package main
import (
// "net"
// "github.com/fsnotify/fsnotify"
// "git.wit.org/wit/gui"
// arg "github.com/alexflint/go-arg"
)
var me Host
type IPtype struct {
// IP string
IPv4 bool
IPv6 bool
LinkLocal bool
}
type Host struct {
Name string
domainname string
hostname string
fqdn string
ips map[string]*IPtype
}

View File

@ -7,7 +7,6 @@ package main
import ( import (
"os" "os"
"os/exec" "os/exec"
"log"
"net" "net"
// "git.wit.org/wit/gui" // "git.wit.org/wit/gui"
// "github.com/davecgh/go-spew/spew" // "github.com/davecgh/go-spew/spew"
@ -25,7 +24,7 @@ func Escalate() {
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
log.Fatal(err) exit(err)
} }
} }
} }
@ -39,16 +38,16 @@ func DumpPublicDNSZone(zone string) {
panic(err) panic(err)
} }
for _, entry := range entries { for _, entry := range entries {
log.Println(entry) log(entry)
} }
} }
func dumpIPs(host string) { func dumpIPs(host string) {
ips, err := net.LookupIP(host) ips, err := net.LookupIP(host)
if err != nil { if err != nil {
log.Fatal(err) exit(err)
} }
for _, ip := range ips { for _, ip := range ips {
log.Println(host, ip) log(host, ip)
} }
} }