79 lines
2.6 KiB
Python
Executable File
79 lines
2.6 KiB
Python
Executable File
#! /usr/bin/python3 --
|
|
|
|
import re
|
|
import sys
|
|
from subprocess import Popen, PIPE
|
|
|
|
def decode(bytes_):
|
|
return bytes_.decode('utf-8').strip()
|
|
|
|
def debug(msg, color='red'):
|
|
reset = '\033[m'
|
|
if color == 'red':
|
|
ansi_code = '\033[31m'
|
|
elif color == 'green':
|
|
ansi_code = '\033[32m'
|
|
elif color == 'yellow':
|
|
ansi_code = '\033[33m'
|
|
else:
|
|
print(f"Unknown color: '{color}'", file=sys.stderr, flush=True)
|
|
ansi_code = reset
|
|
print(ansi_code + msg + reset, file=sys.stderr, flush=True)
|
|
|
|
def run_bash(cmd):
|
|
process = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True)
|
|
outb, errb = process.communicate()
|
|
errcode = process.returncode
|
|
if errcode != 0:
|
|
debug("There was an error getting the MAC address")
|
|
sys.exit(1)
|
|
out = decode(outb).strip()
|
|
return out
|
|
|
|
def get_permaddr():
|
|
permaddr = run_bash("ip link show wlan0 | grep permaddr | awk '{ print $6 }'")
|
|
return permaddr
|
|
|
|
def main():
|
|
mac_address = run_bash("ip link show wlan0 | grep link/ether | awk '{ print $2 }'")
|
|
as_int = int(mac_address.replace(':', ''), 16)
|
|
set_directly = False
|
|
if len(sys.argv) == 2:
|
|
if sys.argv[1] == 'inc':
|
|
debug("Incrementing MAC address by 1", 'green')
|
|
as_int += 1
|
|
elif sys.argv[1] == 'dec':
|
|
debug("Decrementing MAC address by 1", 'green')
|
|
as_int -= 1
|
|
elif sys.argv[1] == 'reset':
|
|
permaddr = get_permaddr()
|
|
if not permaddr:
|
|
debug("MAC address already matches real MAC address, nothing to change", 'yellow')
|
|
return 0
|
|
new_mac = permaddr
|
|
debug(f"Resetting MAC address to {new_mac}", 'green')
|
|
set_directly = True
|
|
else:
|
|
debug(f"Unknown argument: '{sys.argv[1]}'", 'red')
|
|
debug(f"Must be one of: inc, dec, reset", 'red')
|
|
sys.exit(2)
|
|
else:
|
|
debug("No argument provided. Doing default action", 'yellow')
|
|
debug("Incrementing MAC address by 1", 'green')
|
|
as_int += 1
|
|
if not set_directly:
|
|
as_hex = hex(as_int)[2:]
|
|
split_as_hex = []
|
|
for match in list(re.finditer('..', as_hex[::-1])):
|
|
split_as_hex.insert(0, match.group()[::-1])
|
|
new_mac = ':'.join(split_as_hex)
|
|
commands = f'''
|
|
sudo sh -c 'ip link set dev wlan0 down ; ip link set dev wlan0 address {new_mac} ; ip link set dev wlan0 up'
|
|
'''.strip()
|
|
commands = re.sub('\n\s*', '\n', commands)
|
|
print(commands)
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|