123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- """
- Utility functions.
- """
- import subprocess
- import re
- import os
- import logging
- logger = logging.getLogger("pypacker")
- def switch_wlan_channel(iface, channel, shutdown_prior=False):
- """
- Switch wlan channel to channel.
- Requirements: ifconfig, iwconfig
- iface -- interface name
- channel -- channel numer to be set as number
- shutdown_prior -- shut down interface prior to setting channel
- """
- if shutdown_prior:
- cmd_call = ["ifconfig", iface, "down"]
- subprocess.check_call(cmd_call)
- cmd_call = ["iwconfig", iface, "channel", "%d" % channel]
- subprocess.check_call(cmd_call)
- if shutdown_prior:
- cmd_call = ["ifconfig", iface, "up"]
- subprocess.check_call(cmd_call)
- def set_wlan_monmode(iface, monitor_active=True, reactivate=True):
- """
- Activate/deacivate monitor mode.
- Requirements: ifconfig, iwconfig
- monitor_active -- activate/deactivate monitor mode
- reactivate -- set interface to active at the end, else leave deactivated
- """
- cmd_call = ["ifconfig", iface, "down"]
- subprocess.check_call(cmd_call)
- mode = "monitor" if monitor_active else "managed"
- cmd_call = ["iwconfig", iface, "mode", mode]
- subprocess.check_call(cmd_call)
- try:
- cmd_call = ["iwconfig", iface, "retry", "0"]
- subprocess.check_call(cmd_call)
- # we don't need retry but this can improve performance
- except:
- # not implemented: don't care
- pass
- if reactivate:
- cmd_call = ["ifconfig", iface, "up"]
- subprocess.check_call(cmd_call)
- PROG_CHANNEL = re.compile(b"Channel ([\d]+) :")
- def get_available_wlan_channels(iface):
- """
- Requirements: iwlist
- return -- channels as integer list
- """
- cmd_call = ["iwlist", iface, "channel"]
- output = subprocess.check_output(cmd_call)
- # logger.debug("iwlist output: %r" % output)
- return [int(ch) for ch in PROG_CHANNEL.findall(output)]
- def set_ethernet_address(iface, ethernet_addr):
- """
- iface -- interface name
- ethernet_addr -- Ethernet address like "AA:BB:CC:DD:EE:FF"
- """
- cmd_call = ["ifconfig", iface, "down"]
- subprocess.check_call(cmd_call)
- cmd_call = ["ifconfig", iface, "hw", "ether", ethernet_addr]
- subprocess.check_call(cmd_call)
- cmd_call = ["ifconfig", iface, "up"]
- subprocess.check_call(cmd_call)
- MAC_VENDOR = {}
- PROG_MACVENDOR = re.compile(" ([\w\-]{8,8}) \(hex\)\t\t(.+)")
- def load_mac_vendor():
- """
- Load out.txt containing mac->vendor mappings into MAC_VENDOR
- See http://standards.ieee.org/develop/regauth/oui/oui.txt
- """
- logger.debug("loading oui file")
- current_dir = os.path.dirname(os.path.realpath(__file__))
- try:
- fh = open(current_dir + "/oui.txt", "r")
- for line in fh:
- hex_vendor = PROG_MACVENDOR.findall(line)
- if len(hex_vendor) > 0:
- # print(hex_vendor)
- MAC_VENDOR[hex_vendor[0][0].replace("-", ":")] = hex_vendor[0][1]
- fh.close()
- except Exception as e:
- logger.warning("could not load out.txt, is it present here? %s" % current_dir)
- def get_vendor_for_mac(mac):
- """
- mac -- First bytes of mac address as "AA:BB:CC" (uppercase!)
- return -- found vendor string or empty string
- """
- if len(MAC_VENDOR) == 0:
- load_mac_vendor()
- try:
- return MAC_VENDOR[mac]
- except KeyError:
- return ""
- # print(get_vendor_for_mac("00:00:00"))
- # print(get_vendor_for_mac("00:00:01"))
- # print(get_vendor_for_mac("00:10:00"))
|