| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | import ipaddressimport socketimport subprocessimport typingimport getmac__all__ = (    'LocalNetwork',    'is_valid_ipv4',    'enforce_mac',    'enforce_mac',    'parse_ip',)OUR_MAC = NoneOUR_IP = NoneOUR_INTERFACE = Noneclass LocalNetwork:    # def get_mac(self, interface: typing.Optional[str]) -> str:    #     if interface is None:    #         interface = self.    def get_mac(self, interface: typing.Optional[str] = None) -> str:        if interface is None:            interface = self.get_default_interface()        global OUR_MAC        if OUR_MAC:            return OUR_MAC        OUR_MAC = getmac.get_mac_address(interface)        return typing.cast(str, OUR_MAC)    def get_ip(self) -> str:        global OUR_IP        if OUR_IP:            return OUR_IP        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:            s.connect(("1.1.1.1", 80))            ip = typing.cast(str, s.getsockname()[0])            OUR_IP = ip            return OUR_IP    def get_default_interface(self) -> str:        global OUR_INTERFACE        if OUR_INTERFACE:            return OUR_INTERFACE        output = subprocess.check_output(['ip', 'route', 'list']).decode().split()        for ind, word in enumerate(output):            if word == 'dev':                OUR_INTERFACE = output[ind + 1]                return OUR_INTERFACE        raise RuntimeError('Could not find default interface')def is_valid_ipv4(ip: str) -> bool:    try:        ipaddress.IPv4Address(ip)        return True    except ipaddress.AddressValueError:        return Falsedef enforce_mac(mac: str) -> bytes:    mac_bytes = []    for b in mac.split(':'):        mac_bytes.append(int(b, 16))    return bytes(mac_bytes)def enforce_ip(ip: str) -> bytes:    ip_bytes = []    for b in ip.split('.'):        ip_bytes.append(int(b))    return bytes(ip_bytes)def parse_mac(mac: bytes) -> str:    mac_parts = []    for b in mac:        hex = f'{b:x}'        if len(hex) == 1:            hex = '0' + hex        mac_parts.append(hex)    return ':'.join(mac_parts)def parse_ip(ip: bytes) -> str:    ip_parts = []    for b in ip:        ip_parts.append(str(b))    return '.'.join(ip_parts)if __name__ == '__main__':    foo = LocalNetwork()    print(foo.get_default_interface())    print(foo.get_mac())    print(foo.get_ip())    # print(is_valid_ipv4('1.1.1.1'))
 |