github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/listBroadcastInterfaces.go (about) 1 package net 2 3 import ( 4 "net" 5 "os" 6 "path/filepath" 7 "strings" 8 9 "github.com/Cloud-Foundations/Dominator/lib/log" 10 ) 11 12 const sysClassNet = "/sys/class/net" 13 14 func listBroadcastInterfaces(interfaceType uint, logger log.DebugLogger) ( 15 []net.Interface, map[string]net.Interface, error) { 16 interfaceList := make([]net.Interface, 0) 17 interfaceMap := make(map[string]net.Interface) 18 if allInterfaces, err := net.Interfaces(); err != nil { 19 return nil, nil, err 20 } else { 21 for _, iface := range allInterfaces { 22 if iface.Flags&net.FlagBroadcast == 0 { 23 logger.Debugf(2, "skipping non-broadcast interface: %s\n", 24 iface.Name) 25 } else if includeType(iface, interfaceType, logger) { 26 addrs, err := iface.Addrs() 27 if err != nil { 28 return nil, nil, err 29 } 30 var addrStrings []string 31 for _, addr := range addrs { 32 addrString := addr.String() 33 if ip, _, err := net.ParseCIDR(addrString); err != nil { 34 return nil, nil, err 35 } else if ip.To4() != nil { 36 addrStrings = append(addrStrings, addrString) 37 } 38 } 39 if len(addrStrings) < 1 { 40 logger.Debugf(1, "found broadcast interface: %s\n", 41 iface.Name) 42 } else { 43 logger.Debugf(1, 44 "found broadcast interface: %s, addrs: %s\n", 45 iface.Name, strings.Join(addrStrings, " ")) 46 } 47 interfaceList = append(interfaceList, iface) 48 interfaceMap[iface.Name] = iface 49 } 50 } 51 } 52 return interfaceList, interfaceMap, nil 53 } 54 55 func includeType(iface net.Interface, interfaceType uint, 56 logger log.DebugLogger) bool { 57 pathname := filepath.Join(sysClassNet, iface.Name, "bonding") 58 if _, err := os.Stat(pathname); err == nil { 59 if interfaceType&InterfaceTypeBonding == 0 { 60 logger.Debugf(2, "skipping bonding interface: %s\n", iface.Name) 61 return false 62 } else { 63 return true 64 } 65 } 66 pathname = filepath.Join(sysClassNet, iface.Name, "bridge") 67 if _, err := os.Stat(pathname); err == nil { 68 if interfaceType&InterfaceTypeBridge == 0 { 69 logger.Debugf(2, "skipping bridge interface: %s\n", iface.Name) 70 return false 71 } else { 72 return true 73 } 74 } 75 pathname = filepath.Join(sysClassNet, iface.Name, "device") 76 if _, err := os.Stat(pathname); err == nil { 77 if interfaceType&InterfaceTypeEtherNet == 0 { 78 logger.Debugf(2, "skipping EtherNet interface: %s\n", iface.Name) 79 return false 80 } else { 81 return true 82 } 83 } 84 pathname = filepath.Join(procNetVlan, iface.Name) 85 if _, err := os.Stat(pathname); err == nil { 86 if interfaceType&InterfaceTypeVlan == 0 { 87 logger.Debugf(2, "skipping Vlan interface: %s\n", iface.Name) 88 return false 89 } else { 90 return true 91 } 92 } 93 pathname = filepath.Join(sysClassNet, iface.Name, "tun_flags") 94 if _, err := os.Stat(pathname); err == nil { 95 if interfaceType&InterfaceTypeTunTap == 0 { 96 logger.Debugf(2, "skipping TUN/TAP interface: %s\n", iface.Name) 97 return false 98 } else { 99 return true 100 } 101 } 102 logger.Debugf(1, "skipping unknown interface: %s\n", iface.Name) 103 return false 104 }