github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/util/getMyIP.go (about) 1 package util 2 3 import ( 4 "errors" 5 "net" 6 "os" 7 "path/filepath" 8 ) 9 10 const procNetVlan = "/proc/net/vlan" 11 12 func getMyIP() (net.IP, error) { 13 var myIP net.IP 14 mostOnesInMask := 0 15 interfaces, err := net.Interfaces() 16 if err != nil { 17 return nil, err 18 } 19 for _, iface := range interfaces { 20 if iface.Flags&net.FlagUp == 0 { 21 continue 22 } 23 if iface.Flags&net.FlagBroadcast == 0 { 24 continue 25 } 26 if _, e := os.Stat(filepath.Join(procNetVlan, iface.Name)); e == nil { 27 continue 28 } 29 interfaceAddrs, err := iface.Addrs() 30 if err != nil { 31 return nil, err 32 } 33 for _, addr := range interfaceAddrs { 34 IP, IPNet, err := net.ParseCIDR(addr.String()) 35 if err != nil { 36 return nil, err 37 } 38 if IP = IP.To4(); IP == nil { 39 continue 40 } 41 if onesInMask, _ := IPNet.Mask.Size(); onesInMask > mostOnesInMask { 42 myIP = IP 43 mostOnesInMask = onesInMask 44 } 45 } 46 } 47 if myIP == nil { 48 return nil, errors.New("no IP address found") 49 } 50 return myIP, nil 51 }