U .Ѫ_! @s^dZddlZddlZzddlmZWnek r<dZYnXddlm Z ddl m Z ddl m ZmZmZmZmZmZmZmZmZdZeZ dZ!dZ"d ed Z#Gd d d e$Z%Gd dde%Z&Gddde&Z'Gddde%Z(Gddde%Z)Gddde%Z*e%Z+dd,dgdddd,dgdddd,dgdddd,dgdddd,dgdddd,d gd ddd,d gd dd!d",d#gd$d%d!d",d#gd&d%f Z-d'd(e-DZ-d)d*Z.d+d,Z/dEd-d.Z0d/d0Z1d1d2Z2dFd3d4Z dGd5d6ZdHd7d8ZdId9d:ZdJd;d<ZdKd=d>ZdLd?d@ZdAdBZdCdDZdS)Mz IEEE 48-bit EUI (MAC address) logic. Supports numerous MAC string formats including Cisco's triple hextet as well as bare MACs containing no delimiters. N)AF_LINK0)AddrFormatError)_is_str) valid_words int_to_words words_to_int valid_bits bits_to_int int_to_bits valid_bin int_to_bin bin_to_intZMACc@s4eZdZdZdZeeZdedZdZdZ dZ dS) mac_eui48z%A standard IEEE EUI-48 dialect class.rr-z%.2XN) __name__ __module__ __qualname____doc__ word_sizewidth num_wordsmax_wordword_sepword_fmt word_baser r =/Users/cjl/code/aws-vpc-ipam/lambda/netaddr/strategy/eui48.pyr1s rc@s(eZdZdZdZeeZdZdZdZ dS)mac_unixz'A UNIX-style MAC address dialect class.r:z%xrN rrrrrrrrrrr r r r!r"Fs r"c@seZdZdZdZdS)mac_unix_expandedz;A UNIX-style MAC address dialect class with leading zeroes.%.2xN)rrrrrr r r r!r%Osr%c@s(eZdZdZdZeeZdZdZdZ dS) mac_ciscoz2A Cisco 'triple hextet' MAC address dialect class.r.%.4xNr$r r r r!r'Ts r'c@s(eZdZdZdZeeZdZdZdZ dS)mac_barez1A bare (no delimiters) MAC address dialect class.rz%.12XrNr$r r r r!r*]s r*c@s(eZdZdZdZeeZdZdZdZ dS) mac_pgsqlz@A PostgreSQL style (2 x 24-bit words) MAC address dialect class.r#%.6xrNr$r r r r!r,fs r,^r#z([0-9A-F]{1,2})$rz([0-9A-F]{1,4})z\.z([0-9A-F]{5,6})z^(r+z[0-9A-F] z)$ cCsg|]}t|tjqSr )_recompile IGNORECASE).0_r r r! sr:c CsFtD]<}z"||}t|dkr(WdSWqtk r>YqXqdS)z :param addr: An IEEE EUI-48 (MAC) address in string form. :return: ``True`` if MAC address string is valid, ``False`` otherwise. rTF)RE_MAC_FORMATSfindalllen TypeError)addrregexp match_resultr r r! valid_strs   rBcCs2g}t|rnd}tD]D}||}t|dkrd}t|dtrJ|d}n |df}qZq|s|td|fntd|fd}t|dkrtd d d |Dd }nt|d krtd d d |Dd }n^t|dkrtd dd |Dd }n6t|dkr tdt|dd d }ntd|f|S)z :param addr: An IEEE EUI-48 (MAC) address in string form. :return: An unsigned integer that is equivalent to value represented by EUI-48/MAC string address formatted according to the dialect settings. FrTz!%r is not a supported MAC format!z%r is not str() or unicode()!Nr0r+cSsg|]}dt|dqS)r&rintr8wr r r!r:szstr_to_int..rr2cSsg|]}dt|dqS)r)rrCrEr r r!r:srcSsg|]}dt|dqS)r.rrCrEr r r!r:srz%012xz(unexpected word count in MAC address %r!) rr;r<r= isinstancetuplerr>rDjoin)r?wordsZ found_matchr@rAint_valr r r! str_to_ints2       rLcs8dkr tt|}fdd|D}j|}|S)a :param int_val: An unsigned integer. :param dialect: (optional) a Python class defining formatting options. :return: An IEEE EUI-48 (MAC) address string that is equivalent to unsigned integer formatted according to the dialect settings. Ncsg|]}j|qSr )r)r8idialectr r!r:szint_to_str..)rrrrI)rKrOrJtokensr?r rNr! int_to_strs   rQcCstd|d?|d@S)z :param int_val: the integer to be packed. :return: a packed string that is equivalent to value represented by an unsigned integer. z>HI l)_structpackrKr r r! int_to_packedsrVcCsFttd|}d}tt|D] \}}|}|d|>}||B}q |S)a :param packed_int: a packed string containing an unsigned integer. It is assumed that string is packed in network byte order. :return: An unsigned integer equivalent to value of network address represented by packed binary string. z>6Brr)listrSunpack enumeratereversed) packed_intrJrKrMnumwordr r r! packed_to_ints  r^cCs|dkr t}t||j|jSN)DEFAULT_DIALECT _valid_wordsrrrJrOr r r!rsrcCs|dkr t}t||j|jSr_)r` _int_to_wordsrrrKrOr r r!rsrcCs|dkr t}t||j|jSr_)r` _words_to_intrrrbr r r!rsrcCs|dkr t}t|t|jSr_)r` _valid_bitsrrbitsrOr r r!r sr cCs|dkr t}t|t|jSr_)r` _bits_to_intrrrgr r r!r sr cCs |dkr t}t||j|j|jSr_)r` _int_to_bitsrrrrdr r r!r sr cCs|dkr t}t|tSr_)r` _valid_binr)bin_valrOr r r!r sr cCs t|tSr_) _int_to_binrrUr r r!r #sr cCs t|tSr_) _bin_to_intr)rlr r r!r'sr)N)N)N)N)N)N)N)N)3rstructrSrer5socketr ImportError netaddr.corernetaddr.compatrnetaddr.strategyrrarrcrrer rfr rir rjr rkr rmrrnrfamily family_nameversionmax_intobjectrr"r%r'r*r,r`rIr;rBrLrQrVr^r r r r!s\   ,     -