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  }