84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
|
package host
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
sockaddr "github.com/hashicorp/go-sockaddr"
|
||
|
)
|
||
|
|
||
|
// network uses go-sockaddr to capture our view of the network
|
||
|
// on error, return the text of the error
|
||
|
func network() (output []map[string]string) {
|
||
|
ifaddrs, err := sockaddr.GetAllInterfaces()
|
||
|
if err != nil {
|
||
|
output = append(output, map[string]string{"error": err.Error()})
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
for _, inf := range ifaddrs {
|
||
|
output = append(output, dumpSockAddr(inf.SockAddr))
|
||
|
}
|
||
|
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
// dumpSockAddr is adapted from
|
||
|
// https://github.com/hashicorp/go-sockaddr/blob/c7188e74f6acae5a989bdc959aa779f8b9f42faf/cmd/sockaddr/command/dump.go#L144-L244
|
||
|
func dumpSockAddr(sa sockaddr.SockAddr) map[string]string {
|
||
|
output := make(map[string]string)
|
||
|
|
||
|
// Attributes for all SockAddr types
|
||
|
for _, attr := range sockaddr.SockAddrAttrs() {
|
||
|
output[string(attr)] = sockaddr.SockAddrAttr(sa, attr)
|
||
|
}
|
||
|
|
||
|
// Attributes for all IP types (both IPv4 and IPv6)
|
||
|
if sa.Type()&sockaddr.TypeIP != 0 {
|
||
|
ip := *sockaddr.ToIPAddr(sa)
|
||
|
for _, attr := range sockaddr.IPAttrs() {
|
||
|
output[string(attr)] = sockaddr.IPAddrAttr(ip, attr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if sa.Type() == sockaddr.TypeIPv4 {
|
||
|
ipv4 := *sockaddr.ToIPv4Addr(sa)
|
||
|
for _, attr := range sockaddr.IPv4Attrs() {
|
||
|
output[string(attr)] = sockaddr.IPv4AddrAttr(ipv4, attr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if sa.Type() == sockaddr.TypeIPv6 {
|
||
|
ipv6 := *sockaddr.ToIPv6Addr(sa)
|
||
|
for _, attr := range sockaddr.IPv6Attrs() {
|
||
|
output[string(attr)] = sockaddr.IPv6AddrAttr(ipv6, attr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if sa.Type() == sockaddr.TypeUnix {
|
||
|
us := *sockaddr.ToUnixSock(sa)
|
||
|
for _, attr := range sockaddr.UnixSockAttrs() {
|
||
|
output[string(attr)] = sockaddr.UnixSockAttr(us, attr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Developer-focused arguments
|
||
|
{
|
||
|
arg1, arg2 := sa.DialPacketArgs()
|
||
|
output["DialPacket"] = fmt.Sprintf("%+q %+q", arg1, arg2)
|
||
|
}
|
||
|
{
|
||
|
arg1, arg2 := sa.DialStreamArgs()
|
||
|
output["DialStream"] = fmt.Sprintf("%+q %+q", arg1, arg2)
|
||
|
}
|
||
|
{
|
||
|
arg1, arg2 := sa.ListenPacketArgs()
|
||
|
output["ListenPacket"] = fmt.Sprintf("%+q %+q", arg1, arg2)
|
||
|
}
|
||
|
{
|
||
|
arg1, arg2 := sa.ListenStreamArgs()
|
||
|
output["ListenStream"] = fmt.Sprintf("%+q %+q", arg1, arg2)
|
||
|
}
|
||
|
|
||
|
return output
|
||
|
}
|