Ocean/Tools/IPAddresses.go

60 lines
1.3 KiB
Go
Raw Permalink Normal View History

package Tools
import (
"net"
"strings"
)
2015-06-17 15:44:52 +00:00
// Provides all IP addresses for this server.
func ReadAllIPAddresses4ThisHost() (addresses4Host []string) {
addresses4Host = ipAddresses
return
}
2015-06-17 15:44:52 +00:00
// Read all IP addreses once.
func initIPAddresses4ThisHost() {
2015-06-17 15:44:52 +00:00
// Get any IP addresses:
addresses, err := net.InterfaceAddrs()
if err != nil {
2015-06-17 15:44:52 +00:00
// Case: Error! Use localhost.
ipAddresses = make([]string, 1)
ipAddresses[0] = `127.0.0.1`
return
}
counter := 0
ipAddresses = make([]string, len(addresses))
2015-06-17 15:44:52 +00:00
// Loop over all addresses:
for _, address := range addresses {
addressText := address.String()
2015-06-17 15:44:52 +00:00
// Case: CIDR notation?
if strings.Contains(addressText, `/`) {
2015-06-17 15:44:52 +00:00
// Convert the address:
addressText = addressText[:strings.Index(addressText, `/`)]
}
2015-06-17 15:44:52 +00:00
// Parse the address to determine some meta data:
ip := net.ParseIP(addressText)
2015-06-17 15:44:52 +00:00
// Filter out any loopback and local entries:
if !ip.IsLoopback() && !ip.IsUnspecified() && strings.ToLower(ip.String()) != `fe80::1` {
ipAddresses[counter] = ip.String()
counter++
}
}
if counter == 0 {
2015-06-17 15:44:52 +00:00
// Case: No public facing address found.
// Use localhost instead.
ipAddresses = make([]string, 1)
ipAddresses[0] = `127.0.0.1`
} else {
ipAddresses = ipAddresses[:counter]
}
return
}