github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/command/agent/host/network.go (about)

     1  package host
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sockaddr "github.com/hashicorp/go-sockaddr"
     7  )
     8  
     9  // network uses go-sockaddr to capture our view of the network
    10  // on error, return the text of the error
    11  func network() (output []map[string]string) {
    12  	ifaddrs, err := sockaddr.GetAllInterfaces()
    13  	if err != nil {
    14  		output = append(output, map[string]string{"error": err.Error()})
    15  		return output
    16  	}
    17  
    18  	for _, inf := range ifaddrs {
    19  		output = append(output, dumpSockAddr(inf.SockAddr))
    20  	}
    21  
    22  	return output
    23  }
    24  
    25  // dumpSockAddr is adapted from
    26  // https://github.com/hashicorp/go-sockaddr/blob/c7188e74f6acae5a989bdc959aa779f8b9f42faf/cmd/sockaddr/command/dump.go#L144-L244
    27  func dumpSockAddr(sa sockaddr.SockAddr) map[string]string {
    28  	output := make(map[string]string)
    29  
    30  	// Attributes for all SockAddr types
    31  	for _, attr := range sockaddr.SockAddrAttrs() {
    32  		output[string(attr)] = sockaddr.SockAddrAttr(sa, attr)
    33  	}
    34  
    35  	// Attributes for all IP types (both IPv4 and IPv6)
    36  	if sa.Type()&sockaddr.TypeIP != 0 {
    37  		ip := *sockaddr.ToIPAddr(sa)
    38  		for _, attr := range sockaddr.IPAttrs() {
    39  			output[string(attr)] = sockaddr.IPAddrAttr(ip, attr)
    40  		}
    41  	}
    42  
    43  	if sa.Type() == sockaddr.TypeIPv4 {
    44  		ipv4 := *sockaddr.ToIPv4Addr(sa)
    45  		for _, attr := range sockaddr.IPv4Attrs() {
    46  			output[string(attr)] = sockaddr.IPv4AddrAttr(ipv4, attr)
    47  		}
    48  	}
    49  
    50  	if sa.Type() == sockaddr.TypeIPv6 {
    51  		ipv6 := *sockaddr.ToIPv6Addr(sa)
    52  		for _, attr := range sockaddr.IPv6Attrs() {
    53  			output[string(attr)] = sockaddr.IPv6AddrAttr(ipv6, attr)
    54  		}
    55  	}
    56  
    57  	if sa.Type() == sockaddr.TypeUnix {
    58  		us := *sockaddr.ToUnixSock(sa)
    59  		for _, attr := range sockaddr.UnixSockAttrs() {
    60  			output[string(attr)] = sockaddr.UnixSockAttr(us, attr)
    61  		}
    62  	}
    63  
    64  	// Developer-focused arguments
    65  	{
    66  		arg1, arg2 := sa.DialPacketArgs()
    67  		output["DialPacket"] = fmt.Sprintf("%+q %+q", arg1, arg2)
    68  	}
    69  	{
    70  		arg1, arg2 := sa.DialStreamArgs()
    71  		output["DialStream"] = fmt.Sprintf("%+q %+q", arg1, arg2)
    72  	}
    73  	{
    74  		arg1, arg2 := sa.ListenPacketArgs()
    75  		output["ListenPacket"] = fmt.Sprintf("%+q %+q", arg1, arg2)
    76  	}
    77  	{
    78  		arg1, arg2 := sa.ListenStreamArgs()
    79  		output["ListenStream"] = fmt.Sprintf("%+q %+q", arg1, arg2)
    80  	}
    81  
    82  	return output
    83  }