github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/utils/network.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package utils
     5  
     6  import (
     7  	"fmt"
     8  	"net"
     9  
    10  	"github.com/juju/loggo"
    11  )
    12  
    13  var logger = loggo.GetLogger("juju.utils")
    14  
    15  // GetIPv4Address iterates through the addresses expecting the format from
    16  // func (ifi *net.Interface) Addrs() ([]net.Addr, error)
    17  func GetIPv4Address(addresses []net.Addr) (string, error) {
    18  	for _, addr := range addresses {
    19  		ip, _, err := net.ParseCIDR(addr.String())
    20  		if err != nil {
    21  			return "", err
    22  		}
    23  		ipv4 := ip.To4()
    24  		if ipv4 == nil {
    25  			continue
    26  		}
    27  		return ipv4.String(), nil
    28  	}
    29  	return "", fmt.Errorf("no addresses match")
    30  }
    31  
    32  // GetAddressForInterface looks for the network interface
    33  // and returns the IPv4 address from the possible addresses.
    34  func GetAddressForInterface(interfaceName string) (string, error) {
    35  	iface, err := net.InterfaceByName(interfaceName)
    36  	if err != nil {
    37  		logger.Errorf("cannot find network interface %q: %v", interfaceName, err)
    38  		return "", err
    39  	}
    40  	addrs, err := iface.Addrs()
    41  	if err != nil {
    42  		logger.Errorf("cannot get addresses for network interface %q: %v", interfaceName, err)
    43  		return "", err
    44  	}
    45  	return GetIPv4Address(addrs)
    46  }