dotfiles/.local/bin/new_mac

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())