Macchanger - Python

import argparse
import re
from termcolor import colored
import subprocess
import sys
import signal
import socket


def def_handler(sig,frame): 
  print(colored(f"\n[!] Saliendo del programa...\n","red"))
  sys.exit(1)

signal.signal(signal.SIGINT, def_handler) 

def get_arguments(): 

  parser= argparse.ArgumentParser(description="Herramienta para cambiar la dirección MAC de una interfaz de red")
  parser.add_argument("-i","--interface", dest="interface", help="Nombre de la interfaz de red", required=True) 
  parser.add_argument("-m","--mac",dest="mac_address", help="Nueva dirección MAC para la interfaz de red")
  parser.add_argument("-l","--list",dest="list_mac",action="store_true",help="Listar la dirección MAC actual") 
  
  return parser.parse_args() 


def is_valid_input(interface,mac_address): 
  is_valid_interface= re.match(r'^[e][n|t][s|h]\d{1,2}$', interface) 
  is_valid_mac_address = re.match(r'^([A-Fa-f0-9]{2}[:]){5}[A-Fa-f0-9]{2}$', mac_address) 

  return is_valid_interface and is_valid_mac_address 


def check_interface(interface):

  list_interfaces=socket.if_nameindex()
  for i in list_interfaces: 
    if interface in i: 
      return interface 


def list_mac(interface):
  print(colored("\n[+] Mostrando la direción MAC actual: \n", 'yellow'))
  subprocess.run(["macchanger", "-s", interface])


def change_mac_address(interface,mac_address):

  if is_valid_input(interface,mac_address) and check_interface(interface):
    subprocess.run(["ifconfig", interface, "down"])
    subprocess.run(["ifconfig",interface,"hw","ether", mac_address]) 
    subprocess.run(["ifconfig", interface, "up"])

    print(colored(f"\n[+] La MAC ha sido cambiada exitosamente\n",'green'))
    print(colored(f"\n[+] Mostrando nueva dirección MAC:\n",'yellow'))
    subprocess.run(["macchanger","-s", interface])
  else:
    print(colored("\n[!] Los datos introducidos son incorrectos", 'red'))



def main():

  if subprocess.check_output(["whoami"]).decode().strip() == 'root': 
    args= get_arguments() 
    if "-m" in sys.argv: 
      change_mac_address(args.interface,args.mac_address)
    elif "-l" in sys.argv: 
      list_mac(args.interface)
    elif len(sys.argv)== 3 :
      print(colored("\n[!] Es necesario especificar el parámetro -m o -l",'red'))

  else:
    print(colored(f"\n[!] Para ejecutar este script es necesario ser root.","red"))
    sys.exit(1)


if __name__ == '__main__':
  main()