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  }