133 lines
3.2 KiB
Go
133 lines
3.2 KiB
Go
// This creates a simple hello world window
|
|
package main
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
// "git.wit.org/wit/gui"
|
|
)
|
|
|
|
var DEBUGNET bool = false
|
|
|
|
// 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(DEBUGNET, "watchNet()")
|
|
// Start goroutine to watch for changes
|
|
go func() {
|
|
log(DEBUGNET, "watchNet() func")
|
|
for {
|
|
log(DEBUGNET, "forever loop start")
|
|
// Check for changes in each interface
|
|
for _, i := range interfaces {
|
|
log(DEBUGNET, "something on i =", i)
|
|
if status := i.Flags & net.FlagUp; status != 0 {
|
|
notification <- i
|
|
log(DEBUGNET, "something on i =", i)
|
|
}
|
|
}
|
|
log(DEBUGNET, "forever loop end")
|
|
}
|
|
}()
|
|
}
|
|
*/
|
|
|
|
func IsIPv6(address string) bool {
|
|
return strings.Count(address, ":") >= 2
|
|
}
|
|
|
|
func IsReal(ip *net.IP) bool {
|
|
if (ip.IsPrivate() || ip.IsLoopback() || ip.IsLinkLocalUnicast()) {
|
|
log(DEBUGNET, "\t\tIP is Real = false")
|
|
return false
|
|
} else {
|
|
log(DEBUGNET, "\t\tIP is Real = true")
|
|
return true
|
|
}
|
|
}
|
|
|
|
func checkInterface(i *net.Interface) {
|
|
val, ok := me.ifmap[i.Index]
|
|
if ! ok {
|
|
log(i.Name, "is a new network interface. The linux kernel index =", i.Index)
|
|
me.ifmap[i.Index] = i
|
|
me.ipchange = true
|
|
return
|
|
}
|
|
log(args.VerboseNet, "me.ifmap[i] does exist. Need to compare everything.", me.ifmap[i.Index].Name)
|
|
if (me.ifmap[i.Index].Name != val.Name) {
|
|
log(val.Name, "has changed to it's name to", i.Name)
|
|
me.ifmap[i.Index] = i
|
|
me.ipchange = true
|
|
return
|
|
}
|
|
}
|
|
|
|
func isNewIPNet(ip *net.IPNet, i *net.Interface) bool {
|
|
log(args.VerboseNet, "\t\taddr.(type) = *net.IPNet")
|
|
log(args.VerboseNet, "\t\taddr.(type) =", ip)
|
|
var realip string
|
|
realip = ip.IP.String()
|
|
|
|
val, ok := me.ip[realip]
|
|
if ok {
|
|
log(args.VerboseNet, val.IPNet.IP, "is already a defined IP address")
|
|
return false
|
|
}
|
|
|
|
me.ip[realip] = new(IPtype)
|
|
me.ip[realip].IPNet = ip
|
|
t := "IPv4"
|
|
if (IsIPv6(ip.String())) {
|
|
me.ip[realip].IPv6 = true
|
|
me.ip[realip].IPv4 = false
|
|
t = "IPv6"
|
|
} else {
|
|
me.ip[realip].IPv6 = false
|
|
me.ip[realip].IPv4 = true
|
|
}
|
|
if (IsReal(&ip.IP)) {
|
|
log("\tIP is Real ", t, i.Index, i.Name, realip)
|
|
} else {
|
|
log("\tIP is not Real", t, i.Index, i.Name, realip)
|
|
}
|
|
log(args.VerboseNet, "\t\tIP is IsPrivate() =", ip.IP.IsPrivate())
|
|
log(args.VerboseNet, "\t\tIP is IsLoopback() =", ip.IP.IsLoopback())
|
|
log(args.VerboseNet, "\t\tIP is IsLinkLocalUnicast() =", ip.IP.IsLinkLocalUnicast())
|
|
return true
|
|
}
|
|
|
|
func scanInterfaces() {
|
|
me.ipchange = false
|
|
ifaces, _ := net.Interfaces()
|
|
// me.ifnew = ifaces
|
|
log(DEBUGNET, SPEW, ifaces)
|
|
for _, i := range ifaces {
|
|
addrs, _ := i.Addrs()
|
|
// log("range ifaces = ", i)
|
|
checkInterface(&i)
|
|
log(args.VerboseNet, "*net.Interface.Name = ", i.Name, i.Index)
|
|
log(args.VerboseNet, SPEW, i)
|
|
log(DEBUGNET, SPEW, addrs)
|
|
for _, addr := range addrs {
|
|
log(DEBUGNET, "\taddr =", addr)
|
|
log(DEBUGNET, SPEW, addrs)
|
|
ips, _ := net.LookupIP(addr.String())
|
|
log(DEBUGNET, "\tLookupIP(addr) =", ips)
|
|
switch v := addr.(type) {
|
|
case *net.IPNet:
|
|
isNewIPNet(v, &i)
|
|
// log("\t\tIP is () =", ip.())
|
|
default:
|
|
log(DEBUGNET, "\t\taddr.(type) = NO IDEA WHAT TO DO HERE v =", v)
|
|
}
|
|
}
|
|
}
|
|
}
|