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 }