from random import getrandbits class MacAddressGenerator: def __init__(self, include_broadcast_macs = False, include_virtual_macs = False) -> "MacAddressGenerator": self.broadcast = include_broadcast_macs self.virtual = include_virtual_macs self.generated = set() def random_mac(self) -> str: while True: mac = self._random_mac() if mac not in self.generated: self.generated.add(mac) return mac def clear(self): self.generated.clear() def generates_broadcast_macs(self) -> bool: return self.broadcast def generates_virtual_macs(self) -> bool: return self.virtual def set_broadcast_generation(self, broadcast: bool): self.broadcast = broadcast def set_virtual_generation(self, virtual: bool): self.virtual = virtual def _random_mac(self) -> str: mac_bytes = bytearray(getrandbits(8) for i in range(6)) if not self.broadcast: mac_bytes[0] &= ~1 # clear the first bytes' first bit if not self.virtual: mac_bytes[0] &= ~2 # clear the first bytes' second bit return ":".join("%02X" % b for b in mac_bytes)