package network import ( "fmt" "net" "regexp" "strconv" "github.com/bettercap/bettercap/core" "github.com/evilsocket/islazy/str" ) const airPortPath = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" var WiFiChannelParser = regexp.MustCompile(`(?m)^.*Supported Channels: (.*)$`) // see Windows version to understand why .... func getInterfaceName(iface net.Interface) string { return iface.Name } func SetInterfaceChannel(iface string, channel int) error { curr := GetInterfaceChannel(iface) // the interface is already on this channel if curr == channel { return nil } _, err := core.Exec(airPortPath, []string{iface, fmt.Sprintf("-c%d", channel)}) if err != nil { return err } SetInterfaceCurrentChannel(iface, channel) return nil } func getFrequenciesFromChannels(output string) ([]int, error) { freqs := make([]int, 0) if output != "" { if matches := WiFiChannelParser.FindStringSubmatch(output); len(matches) == 2 { for _, channel := range str.Comma(matches[1]) { if channel, err := strconv.Atoi(channel); err == nil { freqs = append(freqs, Dot11Chan2Freq(channel)) } } } } return freqs, nil } func GetSupportedFrequencies(iface string) ([]int, error) { out, err := core.Exec("system_profiler", []string{"SPAirPortDataType"}) if err != nil { return nil, err } return getFrequenciesFromChannels(out) }