Ocean/Tools/IPAddresses.go
2015-06-17 17:44:52 +02:00

60 lines
1.3 KiB
Go

package Tools
import (
"net"
"strings"
)
// Provides all IP addresses for this server.
func ReadAllIPAddresses4ThisHost() (addresses4Host []string) {
addresses4Host = ipAddresses
return
}
// Read all IP addreses once.
func initIPAddresses4ThisHost() {
// Get any IP addresses:
addresses, err := net.InterfaceAddrs()
if err != nil {
// Case: Error! Use localhost.
ipAddresses = make([]string, 1)
ipAddresses[0] = `127.0.0.1`
return
}
counter := 0
ipAddresses = make([]string, len(addresses))
// Loop over all addresses:
for _, address := range addresses {
addressText := address.String()
// Case: CIDR notation?
if strings.Contains(addressText, `/`) {
// Convert the address:
addressText = addressText[:strings.Index(addressText, `/`)]
}
// Parse the address to determine some meta data:
ip := net.ParseIP(addressText)
// 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 {
// Case: No public facing address found.
// Use localhost instead.
ipAddresses = make([]string, 1)
ipAddresses[0] = `127.0.0.1`
} else {
ipAddresses = ipAddresses[:counter]
}
return
}