package nic import ( "log" "net" "strconv" "strings" omm "git.loafle.net/overflow/model/meta" omn "git.loafle.net/overflow/model/net" oun "git.loafle.net/overflow/util-go/net" "github.com/google/gopacket/pcap" ) func DiscoverInterfaces() ([]*omn.Interface, error) { gwIP, gwIface, err := DiscoverGateway() if nil != err { return nil, err } netIfaces, err := net.Interfaces() if err != nil { return nil, err } ifaces := make([]*omn.Interface, 0) for _, netIface := range netIfaces { if netIface.Flags&net.FlagLoopback != 0 || netIface.Flags&net.FlagUp == 0 { continue } iface := &omn.Interface{} ifaces = append(ifaces, iface) iface.FriendlyName = netIface.Name iface.Mac = netIface.HardwareAddr.String() iface.Addresses = make([]*omn.InterfaceAddress, 0) log.Print(strconv.ParseInt(string(netIface.HardwareAddr), 10, 64)) netAddrs, err := netIface.Addrs() if nil != err { continue } LOOP_ADDR: for _, netAddr := range netAddrs { _, ipNet, err := oun.ParseCIDR(netAddr.String()) if nil != err { continue } var ip net.IP switch v := netAddr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP default: log.Print("Addr is not *net.IPNet or *net.IPAddr", netAddr) } addr := &omn.InterfaceAddress{} iface.Addresses = append(iface.Addresses, addr) addr.Address = ip.String() addr.Netmask = ipNet.Mask.String() addr.Network = ipNet.Network().String() if gwIface == ip.String() { addr.Gateway = gwIP.String() } switch ipNet.Version() { case 4: addr.MetaIPType = omm.ToMetaIPType(omm.MetaIPTypeEnumV4) case 6: addr.MetaIPType = omm.ToMetaIPType(omm.MetaIPTypeEnumV6) default: continue LOOP_ADDR } iface.Iface = ifaceName(ip.String()) } } return ifaces, nil } func ifaceName(ip string) string { devices, err := pcap.FindAllDevs() if err != nil { return "" } for _, d := range devices { for _, address := range d.Addresses { if strings.Compare(address.IP.String(), ip) == 0 { return d.Name } } } return "" }