ó €aUc@sÜdZddlmZmZmZmZmZmZddlm Z m Z ddl mZddlmZddlmZmZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZdS(s] Classes and functions for dealing with MAC addresses, EUI-48, EUI-64, OUI, IAB identifiers. iÿÿÿÿ(tNotRegisteredErrortAddrFormatErrortAddrConversionErrort Subscribert Publishert DictDotLookup(teui48teui64(t mac_eui48(t IPAddress(t_is_intt_is_strtBaseIdentifiercBsJeZdZdZd„Zd„Zd„Zd„Zd„Zd„Z RS( s$Base class for all IEEE identifiers.t_valuecCs d|_dS(N(tNoneR (tself((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__init__scCs|jS(s):return: integer value of this identifier(R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__int__scCs|jS(s):return: integer value of this identifier(R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__long__scCs|jdkrdSd|jS(s8:return: octal string representation of this identifier.it0s0%o(R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__oct__#scCs d|jS(s>:return: hexadecimal string representation of this identifier.s0x%x(R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__hex__*scCs|jS(sx :return: return the integer value of this identifier when passed to hex(), oct() or bin(). (R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt __index__/s(s_value( t__name__t __module__t__doc__t __slots__RRRRRR(((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR s     tOUIcBsweZdZd Zd„Zd„Zd„Zd„Zd„Zd„Z e d„ƒZ d d „Z d „Z d „ZRS(sŒ An individual IEEE OUI (Organisationally Unique Identifier). For online details see - http://standards.ieee.org/regauth/oui/ trecordscCsEtt|ƒjƒddlm}g|_t|tƒr\t|j ddƒdƒ|_ nWt |ƒr£d|kodknr||_ q³t d|ƒ‚nt d |ƒ‚|j |jkr1t|jƒ}xM|j|j D];\}}|j|ƒ|j|ƒ}|j|||ƒqåW|jƒntd |ƒ‚d S( sÔ 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)! iÿÿÿÿ(tieeet-tiiiÿÿÿs"OUI int outside expected range: %rsunexpected OUI format: %rsOUI %r not registered!N(tsuperRRt netaddr.euiRRt isinstancetstrtinttreplaceR R t ValueErrort TypeErrort OUI_INDEXtopent OUI_REGISTRYtseektreadt _parse_datatcloseR(RtouiRtfhtoffsettsizetdata((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRAs$ !    cCsJt|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jkS(N(R"Rt __class__t ExceptiontNotImplementedR (Rtother((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__eq__hs  cCsJt|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jkS(N(R"RR4R5R6R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__ne__ps  cCs|j|jfS(s+:returns: Pickled state of an `OUI` object.(R R(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt __getstate__xscCs|\|_|_dS(s;:param state: data used to unpickle a pickled `OUI` object.N(R R(Rtstate((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt __setstate__|scCsßidd6dd6dd6gd6|d6|d6}x˜|jd ƒD]‡}|jƒ}|s^q@nd |kr¤|j|d<|jd d ƒd |dR?R1R2RiRPsunexpected IAB format: %r!sIAB %r not unregistered!N(R RMRR!RRCR"R#R$R%RUR R R't IAB_INDEXR)t IAB_REGISTRYR+R,R-R.R( RRVRPRRItiab_inttuser_intR0R1R2R3((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRÛs8          cCsJt|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jkS(N(R"RMR4R5R6R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR8s  cCsJt|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jkS(N(R"RMR4R5R6R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR9s  cCs|j|jfS(s+:returns: Pickled state of an `IAB` object.(R RC(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR: scCs|\|_|_dS(s;:param state: data used to unpickle a pickled `IAB` object.N(R RC(RR;((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR<$scCs«x¤|jdƒD]“}|jƒ}|s.qnd|kr}|j|jd<|jd dƒd|jdRVs (base 16)R?N(R@RAR RCRR#RB(RR3R1R2RD((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR-(s   cCs t|jƒS(s*The IEEE registration details for this IAB(RRC(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRH8scCsH|jd>}d|d?d@|d?d@|d?d@|d?d@|d@fS(s*:return: string representation of this IABis%02X-%02X-%02X-%02X-%02X-00i iÿiii(R (RRI((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRJ<s     cCsd|S(s@:return: executable Python string to recreate equivalent object.s IAB('%s')((R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRKGs(srecord(RRRRt staticmethodtFalseRURR8R9R:R<R-RHRJRK(((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRM¹s 5       tEUIcBs—eZdZd%Zd&d&d„Zd„Zd„Zd„Zd„Z e ee d&dƒZ d „Z d „Z e e e d&d ƒZe d „ƒZe d „ƒZd„Ze d„ƒZe d„ƒZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd&d„Ze d„ƒZe d„ƒZe d„ƒZ d„Z!d„Z"d „Z#d!„Z$e d"„ƒZ%d#„Z&d$„Z'RS('s× An IEEE EUI (Extended Unique Identifier). Both EUI-48 (used for layer 2 MAC addresses) and EUI-64 are supported. Input parsing for EUI-48 addresses is flexible, supporting many MAC variants. t_modulet_dialectcCsDtt|ƒjƒd|_t|tƒr€|dk rX||jjkrXtdƒ‚n|j|_|j|_|j |_ dS|dk rÏ|dkr¤t |_q.|dkr¼t |_q.td|ƒ‚n_t |ƒr.d|koòdknrt |_q.d|kodknr.t |_q.n||_ ||_ dS( s2 Constructor. :param addr: an EUI-48 (MAC) or EUI-64 address in string format or an unsigned integer. May also be another EUI object (copy construction). :param version: (optional) the explicit EUI address version, either 48 or 64. Mainly used to distinguish EUI-48 and EUI-64 identifiers specified as integers which may be numerically equivalent. :param dialect: (optional) the mac_* dialect to be used to configure the formatting of EUI-48 (MAC) addresses. s2cannot switch EUI versions using copy constructor!Ni0i@sunsupported EUI version %riIÿÿÿÿÿÿlÿÿÿÿ(R R]RRR^R"tversionR&R tdialectt_eui48t_eui64R tvalue(RtaddrR`Ra((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRXs,            cCs|j|jj|jfS(s+:returns: Pickled state of an `EUI` object.(R R^R`Ra(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR:ŠscCsk|\}}}||_|dkr0t|_n.|dkrHt|_ntdt|ƒƒ‚||_dS(sN :param state: data used to unpickle a pickled `EUI` object. i0i@s&unpickling failed for object state: %sN(R RbR^RcR&R#Ra(RR;RdR`Ra((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR<Žs     cCs|jS(N(R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt _get_value¡scCs~|jdkrØx¡ttfD]“}y |j|ƒ|_||_PWqtk r®yEdt|ƒkou|jknr–t|ƒ|_||_PnWq¯t k rªq¯XqXqW|jdkrztd|ƒ‚qzn¢t |ƒr0y|jj|ƒ|_Wqztk r,td||jj fƒ‚qzXnJdt|ƒkoS|jjknrjt|ƒ|_ntd|ƒ‚dS(Nis failed to detect EUI version: %rsaddress %r is not an EUIv%dsbad address format: %r( R^RRbRct str_to_intR RR$tmax_intR&R R`(RRdtmodule((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt _set_value¤s4  %     (sBa positive integer representing the value of this EUI indentifier.cCs|jS(N(R_(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt _get_dialectÉscCsR|dkrt|_n6t|dƒrBt|dƒrB||_n tdƒ‚dS(Nt word_sizetword_fmts*custom dialects should subclass mac_eui48!(RRR_thasattrR'(RRd((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt _set_dialectÌs    sXa Python class providing support for the interpretation of various MAC address formats.cCsD|jtkr t|jd?ƒS|jtkr@t|jd?ƒSdS(s:The OUI (Organisationally Unique Identifier) for this EUI.ii(N(R^RbRRdRc(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR/ÙscCsL|jtkr$dt|dd!ƒS|jtkrHdt|dd!ƒSdS(s*The EI (Extension Identifier) for this EUIs%02X-%02X-%02Xiis%02X-%02X-%02X-%02X-%02XiN(R^RbttupleRc(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyteiáscCsd|jd?kodkSS(s<:return: True if this EUI is an IAB address, False otherwisei i iÿ/ (R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytis_iabéscCs!|jƒrt|jd?ƒSdS(sr If is_iab() is True, the IAB (Individual Address Block) is returned, ``None`` otherwise. i N(RrRMR (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRVís cCs |jjS(s/The EUI version represented by this EUI object.(R^R`(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR`öscCsÓt|ƒre|jj}| |ko4|dknsHtdƒ‚n|jj|j|jƒ|St|tƒr¿|jj|j|jƒ}gt |j t |ƒƒŒD]}||^q«St d|ƒ‚dS(sû :return: The integer value of the word referenced by index (both positive and negative). Raises ``IndexError`` if index is out of bounds. Also supports Python list slices for accessing word groups. is!index out range for address type!sunsupported type %r!N( R R_t num_wordst IndexErrorR^t int_to_wordsR R"tslicetrangetindicesRER'(RR=Rstwordsti((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt __getitem__ûs  !0cCst|tƒrtdƒ‚nt|ƒs9tdƒ‚nd|koZ|jjdknsrtd|ƒ‚nt|ƒstdƒ‚nd|koª|jjknsÎtd||jj fƒ‚nt |j j |j |jƒƒ}|||<|j j|ƒ|_ dS( s=Set the value of the word referenced by index in this addresss"settable slices are not supported!sindex not an integer!iis'index %d outside address type boundary!svalue not an integer!s.value %d outside word size maximum of %d bits!N(R"RvtNotImplementedErrorR R'R_RsRttmax_wordRltlistR^RuR t words_to_int(RR=RdRy((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt __setitem__s & "! cCst|j|jfƒS(sA:return: hash of this EUI object suitable for dict keys, sets etc(thashR`R (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__hash__%scCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(sy :return: ``True`` if this EUI object is numerically the same as other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR8)s  cCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(sy :return: ``True`` if this EUI object is numerically the same as other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyR95s  cCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(s :return: ``True`` if this EUI object is numerically lower in value than other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__lt__As  cCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(sˆ :return: ``True`` if this EUI object is numerically lower or equal in value to other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__le__Ms  cCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(sƒ :return: ``True`` if this EUI object is numerically greater in value than other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__gt__Ys  cCs\t|tƒs:y|j|ƒ}Wq:tk r6tSXn|j|jf|j|jfkS(sŠ :return: ``True`` if this EUI object is numerically greater or equal in value to other, ``False`` otherwise. (R"R]R4R5R6R`R (RR7((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyt__ge__es  cCs|jj|j|ƒS(sÞ :param word_sep: (optional) the separator to insert between words. Default: None - use default separator for address type. :return: human-readable binary digit string of this address. (R^t int_to_bitsR (Rtword_sep((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytbitsqscCs|jj|jƒS(s8The value of this EUI address as a packed binary string.(R^t int_to_packedR (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytpackedzscCs|jj|jƒS(s<A list of unsigned integer octets found in this EUI address.(R^RuR (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRyscCs|jj|jƒS(sÜ The value of this EUI adddress in standard Python binary representational form (0bxxx). A back port of the format provided by the builtin bin() function found in Python 2.6.x and higher. (R^t int_to_binR (R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytbin„scCsZ|jdkr>|jd?}|jd@}|d>dB|B}n |j}|j|ddƒS(s2 - If this object represents an EUI-48 it is converted to EUI-64 as per the standard. - If this object is already an EUI-64, a new, numerically equivalent object is returned instead. :return: The value of this EUI object as a new 64-bit EUI object. i0iiÿÿÿi(IþÿR`i@(R`R R4(Rt first_threet last_threet new_value((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pyRs    cCs|jƒ}|jdN_|S(s¡ - create a new EUI object with a modified EUI-64 as described in RFC 4291 section 2.5.1 :return: a new and modified 64-bit EUI object. I(RR (RR((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytmodified_eui64 s cCs,t|ƒt|jƒƒ}t|ddƒS(s5 .. note:: This poses security risks in certain scenarios. Please read RFC 4941 for details. Reference: RFCs 4291 and 4941. :param prefix: ipv6 prefix :return: new IPv6 `IPAddress` object based on this `EUI` using the technique described in RFC 4291. R`i(R$R‘R (RtprefixRI((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytipv6°s cCs |jdƒS(s .. note:: This poses security risks in certain scenarios. Please read RFC 4941 for details. Reference: RFCs 4291 and 4941. :return: new link local IPv6 `IPAddress` object based on this `EUI` using the technique described in RFC 4291. l @þ(R“(R((s8/usr/lib/python2.7/site-packages/netaddr/eui/__init__.pytipv6_link_local½scCsBi|jjƒd6}|jƒr8|jjƒ|d s.$“