def __init__(self, iab, strict=False): """ Constructor :param iab: an IAB string ``00-50-C2-XX-X0-00`` or an unsigned \ integer. This address looks like an EUI-48 but it should not \ have any non-zero bits in the last 3 bytes. :param strict: If True, raises a ValueError if the last 12 bits \ of IAB MAC/EUI-48 address are non-zero, ignores them otherwise. \ (Default: False) """ super(IAB, self).__init__() # Lazy loading of IEEE data structures. from netaddr.eui import ieee self.record = { 'idx': 0, 'iab': '', 'org': '', 'address' : [], 'offset': 0, 'size': 0, } if isinstance(iab, str): #TODO: Improve string parsing here. #TODO: '00-50-C2' is actually invalid. #TODO: Should be '00-50-C2-00-00-00' (i.e. a full MAC/EUI-48) int_val = int(iab.replace('-', ''), 16) iab_int, user_int = self.split_iab_mac(int_val, strict=strict) self._value = iab_int elif _is_int(iab): iab_int, user_int = self.split_iab_mac(iab, strict=strict) self._value = iab_int else: raise TypeError('unexpected IAB format: %r!' % iab) # Discover offsets. if self._value in ieee.IAB_INDEX: fh = open(ieee.IAB_REGISTRY) (offset, size) = ieee.IAB_INDEX[self._value][0] self.record['offset'] = offset self.record['size'] = size fh.seek(offset) data = fh.read(size) self._parse_data(data, offset, size) fh.close() else: raise NotRegisteredError('IAB %r not unregistered!' % iab)
def __init__(self, oui, oui_index=None, oui_registry=None): """ Constructor :param oui: an OUI string ``XX-XX-XX`` or an unsigned integer. \ Also accepts and parses full MAC/EUI-48 address strings (but not \ MAC/EUI-48 integers)! :param oui_index: An index generated by `netaddr.eui.ieee`. """ super(OUI, self).__init__() self.records = [] ieee = _maybe_import_netaddr_eui_ieee() if oui_index is None: oui_index = ieee.OUI_INDEX if oui_registry is None: oui_registry = ieee.OUI_REGISTRY if isinstance(oui, str): #TODO: Improve string parsing here. #TODO: Accept full MAC/EUI-48 addressses as well as XX-XX-XX #TODO: and just take /16 (see IAB for details) self._value = int(oui.replace('-', ''), 16) elif _is_int(oui): if 0 <= oui <= 0xffffff: self._value = oui else: raise ValueError('OUI int outside expected range: %r' % oui) else: raise TypeError('unexpected OUI format: %r' % oui) # Discover offsets. if self._value in oui_index: fh = open(oui_registry) for (offset, size) in oui_index[self._value]: fh.seek(offset) data = fh.read(size) self._parse_data(data, offset, size) fh.close() else: raise NotRegisteredError('OUI %r not registered!' % oui)
def __init__(self, oui): """ Constructor :param oui: an OUI string ``XX-XX-XX`` or an unsigned integer. \ Also accepts and parses full MAC/EUI-48 address strings (but not \ MAC/EUI-48 integers)! """ super(OUI, self).__init__() # Lazy loading of IEEE data structures. from netaddr.eui import ieee self.records = [] if isinstance(oui, str): #TODO: Improve string parsing here. #TODO: Accept full MAC/EUI-48 addressses as well as XX-XX-XX #TODO: and just take /16 (see IAB for details) self._value = int(oui.replace('-', ''), 16) elif _is_int(oui): if 0 <= oui <= 0xffffff: self._value = oui else: raise ValueError('OUI int outside expected range: %r' % (oui, )) else: raise TypeError('unexpected OUI format: %r' % (oui, )) # Discover offsets. if self._value in ieee.OUI_INDEX: fh = _importlib_resources.open_binary(__package__, 'oui.txt') for (offset, size) in ieee.OUI_INDEX[self._value]: fh.seek(offset) data = fh.read(size).decode('UTF-8') self._parse_data(data, offset, size) fh.close() else: raise NotRegisteredError('OUI %r not registered!' % (oui, ))
def __init__(self, oui): """ Constructor @param oui: an OUI string C{XX-XX-XX} or an unsigned integer. Also accepts and parses full MAC/EUI-48 address strings (but not MAC/EUI-48 integers)! """ # Lazy loading of IEEE data structures. from netaddr.eui import ieee self.value = None self.records = [] if isinstance(oui, str): #TODO: Improve string parsing here. #TODO: Accept full MAC/EUI-48 addressses as well as XX-XX-XX #TODO: and just take /16 (see IAB for details) self.value = int(oui.replace('-', ''), 16) elif isinstance(oui, (int, long)): if 0 <= oui <= 0xffffff: self.value = oui else: raise ValueError('OUI int outside expected range: %r' % oui) else: raise TypeError('unexpected OUI format: %r' % oui) # Discover offsets. if self.value in ieee.OUI_INDEX: fh = open(ieee.OUI_REGISTRY, 'rb') for (offset, size) in ieee.OUI_INDEX[self.value]: fh.seek(offset) data = fh.read(size) self._parse_data(data, offset, size) fh.close() else: raise NotRegisteredError('OUI %r not registered!' % oui)