
    ^6                     @   d Z ddlZddlmZmZ ddlmZmZ ddl	m
Z
mZmZmZ ddlmZmZmZ i i i i dZ G d d	ej&                        Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zd ZddZd Zd Z e        y)a  
Routines for accessing data published by IANA (Internet Assigned Numbers
Authority).

More details can be found at the following URLs :-

    - IANA Home Page - http://www.iana.org/
    - IEEE Protocols Information Home Page - http://www.iana.org/protocols/
    N)make_parserhandler)	Publisher
Subscriber)	IPAddress	IPNetworkIPRangecidr_abbrev_to_verbose)_dict_items	_callable_importlib_resources)IPv4IPv6IPv6_unicast	multicastc                   &    e Zd ZddZd Zd Zd Zy)SaxRecordParserNc                 f    d| _         d| _        d | _        d | _        d | _        d | _        || _        y )Nr   F)_level
_is_active_record
_tag_level_tag_payload_tag_feeding	_callback)selfcallbacks     1/usr/lib/python3/dist-packages/netaddr/ip/iana.py__init__zSaxRecordParser.__init__3   s5      !    c                    | xj                   dz  c_         | j                  du r=|dk(  r7d| _        | j                   | _        i | _        d|v r|d   | j                  d<   y y y | j                   | j                  dz   k(  rR|dk(  r<d|v rHd|v rC| j                  j	                  |d   g       }|j                  |d          y g | _        d| _        y y y d| _        y )	N   FrecordTdatexreftypedata)r   r   r   r   
setdefaultappendr   r   )r   nameattrsls       r   startElementzSaxRecordParser.startElement<   s    q??e#x"&"&++!U?+0=DLL( #	   [[DOOa//v~U?v//frBAHHU6]+$&!$(! (7? !&Dr    c                    | j                   du r|dk(  r_| j                  | j                  k(  rFd| _         d | _        t        | j                        r| j	                  | j
                         d | _        nW| j                  | j                  dz   k(  r;|dk7  r6dj                  | j                        | j
                  |<   d | _        d| _        | xj                  dz  c_        y )NTr#   Fr"   r%    )	r   r   r   r   r   r   joinr   r   )r   r*   s     r   
endElementzSaxRecordParser.endElementQ   s    ??d"xDOOt{{$B"'"&T^^,NN4<<0#! 336>)+1B1B)CDLL&(,D%(-D%qr    c                 X    | j                   du r| j                  j                  |       y y )NT)r   r   r)   )r   contents     r   
characterszSaxRecordParser.charactersa   s)    $$$W- %r    N)__name__
__module____qualname__r   r-   r1   r4    r    r   r   r   2   s    "&* .r    r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )XMLRecordParserzP
    A configurable Parser that understands how to parse XML based records.
    c                     t         t        |           t               | _        | j                  j                  t        | j                               || _        | j                  j                  |       y)z`
        Constructor.

        fh - a valid, open file handle to XML based record data.
        N)superr;   r   r   	xmlparsersetContentHandlerr   consume_recordfh__dict__updater   rA   kwargs	__class__s      r   r   zXMLRecordParser.__init__k   sQ     	ot-/$((9L9L)MNV$r    c                     |S )a  
        This is the callback method invoked for every record. It is usually
        over-ridden by base classes to provide specific record-based logic.

        Any record can be vetoed (not passed to registered Subscriber objects)
        by simply returning None.
        r9   )r   recs     r   process_recordzXMLRecordParser.process_recordz   s	     
r    c                 N    | j                  |      }|| j                  |       y y r5   )rI   notifyr   rH   r#   s      r   r@   zXMLRecordParser.consume_record   s)    $$S)KK r    c                 N    | j                   j                  | j                         y)z
        Parse and normalises records, notifying registered subscribers with
        record data as it is encountered.
        N)r>   parserA   )r   s    r   rN   zXMLRecordParser.parse   s    
 	TWW%r    )	r6   r7   r8   __doc__r   rI   r@   rN   __classcell__rF   s   @r   r;   r;   f   s    % 
&r    r;   c                   (     e Zd ZdZ fdZd Z xZS )
IPv4Parserz
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv4 address space file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml
    c                 ,    t         t        |   |       y)z
        Constructor.

        fh - a valid, open file handle to an IANA IPv4 address space file.

        kwargs - additional parser options.
        N)r=   rS   r   rD   s      r   r   zIPv4Parser.__init__        	j$(,r    c                    i }dD ].  }t        |j                  |d            j                         ||<   0 d|d   v r3|d   j                  d      \  }}dt	        |      t	        |      fz  |d<   |d   j                         |d<   |S )l
        Callback method invoked for every record.

        See base class method for more details.
        )prefixdesignationr$   whoisstatusr/   /rX   z%d/%dr[   )strgetstripsplitint
capitalize)r   rH   r#   keyoctetrX   s         r   rI   zIPv4Parser.process_record   s     G 	8Ccggc2./557F3K	8 &""$X.44S9OUF&#e*c&k)BBF8!(+668xr    r6   r7   r8   rO   r   rI   rP   rQ   s   @r   rS   rS      s    -r    rS   c                   (     e Zd ZdZ fdZd Z xZS )
IPv6Parserz
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv6 address space file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xml
    c                 ,    t         t        |   |       yz
        Constructor.

        fh - a valid, open file handle to an IANA IPv6 address space file.

        kwargs - additional parser options.
        N)r=   rg   r   rD   s      r   r   zIPv6Parser.__init__   rU   r    c                    t        |j                  dd            j                         t        |j                  dd            j                         t        |j                  ddg      d         j                         d}|S )rW   rX   r/   descriptionrfc)rX   
allocation	referencer]   r^   r_   rL   s      r   rI   zIPv6Parser.process_record   so     #''(B/0668cggmR89??A SWWURD1"56<<>

 r    re   rQ   s   @r   rg   rg      s    -r    rg   c                   (     e Zd ZdZ fdZd Z xZS )IPv6UnicastParsera!  
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv6 unicast address assignments file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xml
    c                 ,    t         t        |   |       yri   )r=   rr   r   rD   s      r   r   zIPv6UnicastParser.__init__   s     	/3r    c           
         t        |j                  dd            j                         t        |j                  dd            j                         t        |j                  dd            j                         t        |j                  dd            j                         t        |j                  dd            j                         d}|S )rW   r[   r/   rk   rX   r$   rZ   )r[   rk   rX   r$   rZ   rp   rL   s      r   rI   z IPv6UnicastParser.process_record   s     #''(B/0668sww}b9:@@B#''(B/0668+,224"-.446
 r    re   rQ   s   @r   rr   rr      s    4r    rr   c                   .     e Zd ZdZ fdZd Zd Z xZS )MulticastParserz
    A XMLRecordParser that knows how to process the IANA IPv4 multicast address
    allocation file.

    It can be found online here :-

        - http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml
    c                 ,    t         t        |   |       y)z
        Constructor.

        fh - a valid, open file handle to an IANA IPv4 multicast address
             allocation file.

        kwargs - additional parser options.
        N)r=   rv   r   rD   s      r   r   zMulticastParser.__init__  s     	ot-b1r    c                 6   d|v r|j                  d      \  }}|j                         j                  d      }|j                         j                  d      }dj                  |D cg c]  }t        t	        |             c}      ddj                  |D cg c]  }t        t	        |             c}      S |j                         j                  d      }dj                  |D cg c]  }t        t	        |             c}      S c c}w c c}w c c}w )zX
        Removes variations from address entries found in this particular file.
        -.)r`   r_   r0   r]   ra   )r   addra1a2o1o2is          r   normalise_addrzMulticastParser.normalise_addr  s     $;zz#HR!!#&B!!#&B!hhR'@CF'@A!hhR'@CF'@AC C ##C(B88"5QSQ[566	 (A'@ 6s   &DD*Dc                     d|v r;| j                  t        |d               t        |j                  dd            d}|S y)rW   r{   rk   r/   )addressdescrN)r   r]   r^   rL   s      r   rI   zMulticastParser.process_record+  sH     S=..s3v;/?@SWW]B78F M r    )r6   r7   r8   rO   r   r   rI   rP   rQ   s   @r   rv   rv     s    	27r    rv   c                       e Zd ZdZd Zd Zy)DictUpdaterzc
    Concrete Subscriber that inserts records received from a Publisher into a
    dictionary.
    c                 .    || _         || _        || _        y)z
        Constructor.

        dct - lookup dict or dict like object to insert records into.

        topic - high-level category name of data to be processed.

        unique_key - key name in data dict that uniquely identifies it.
        N)dcttopic
unique_key)r   r   r   r   s       r   r   zDictUpdater.__init__@  s     
$r    c                 *   || j                      }| j                  dk(  r$t        t        |            }|| j                  |<   y| j                  dk(  r$t        t        |            }|| j                  |<   y| j                  dk(  rt        |      }|| j                  |<   y| j                  dk(  red}d|v rD|j                  d      \  }}t        ||      }|j                         }t        |      dk(  r|d   }nt        |      }|| j                  |<   yy)	z
        Callback function used by Publisher to notify this Subscriber about
        an update. Stores topic based information into dictionary passed to
        constructor.
        r   r   r   r   Nry   r"   r   )
r   r   r   r
   r   r`   r	   cidrslenr   )r   r'   data_idcidriprangefirstlastr   s           r   rC   zDictUpdater.updateN  s     t'::3G<=D!DHHTNZZ6!3G<=D!DHHTNZZ>)W%D!DHHTNZZ;&Gg~ 'c 2!%.u:?#AhG#G, $DHHW 'r    N)r6   r7   r8   rO   r   rC   r9   r    r   r   r   :  s    
%%r    r   c                     t        t        j                  t        d            } | j	                  t        t        d   dd             | j                          t        t        j                  t        d            }|j	                  t        t        d   dd             |j                          t        t        j                  t        d            }|j	                  t        t        d   dd             |j                          t        t        j                  t        d            }|j	                  t        t        d	   d	d
             |j                          y)zd
    Parse and load internal IANA data lookups with the latest information from
    data files.
    zipv4-address-space.xmlr   rX   zipv6-address-space.xmlr   z$ipv6-unicast-address-assignments.xmlr   zmulticast-addresses.xmlr   r   N)rS   r   open_binary__package__attachr   	IANA_INFOrN   rg   rr   rv   )ipv4ipv6ipv6uamcasts       r   	load_infor   m  s    
 *66{D\]^DKKIf-vx@AJJL*66{D\]^DKKIf-vx@AJJL((6\]F MM+i7RS
LLN0<<[JcdeE	LLY{3[)LM	KKMr    c                 h   | t         j                  } t        t              D ]  }| j	                  dt        |      z  dz          | j	                  |dz          | j	                  dt        |      z  dz          t        |   }t        |      D ]!  }||   }| j	                  d|z  |z   dz          #  y)z7
    Pretty prints IANA information to filehandle.
    Nry   
z%-45r)_sysstdoutsortedr   writer   )rA   categoryiprangesr   detailss        r   pprint_infor     s     
z[[9% ;
s8}$t+,
D!
s8}$t+,X&h' 	;Gw'GHHW(72T9:	;;r    c                 b    t        |d      r| |v S t        |d      r| |k(  S t        d|d      )Nr   valuez!Unsupported IP range or address: !)hasattr	Exception)ipip_ranges     r   _within_boundsr     s8    x!X~	7	#X~
hH
IIr    c                    i }| j                   dk(  rt        t        d         D ]8  \  }}t        | |      s|j	                  dg        |d   j                  |       : | j                         rMt        t        d         D ]8  \  }}t        | |      s|j	                  dg        |d   j                  |       : |S | j                   dk(  rt        t        d         D ]8  \  }}t        | |      s|j	                  dg        |d   j                  |       : t        t        d         D ]8  \  }}t        | |      s|j	                  dg        |d   j                  |       : |S )z7Returns informational data specific to this IP address.   r   r   	Multicast   r   r   )versionr   r   r   r(   r)   is_multicast)ip_addrinfor   r#   r   s        r   queryr     s]   D!'	&(9: 	,LD&gt,+V##F+	,
 !#.y/E#F 5!'73OOK4%,,V45  K 
A	'	&(9: 	,LD&gt,+V##F+	,
 (	.(AB 	4LD&gt,3^$++F3	4
 Kr    r5   )rO   sysr   xml.saxr   r   netaddr.corer   r   
netaddr.ipr   r   r	   r
   netaddr.compatr   r   r   r   ContentHandlerr   r;   rS   rg   rr   rv   r   r   r   r   r   r9   r    r   <module>r      s   ,  ( . L L G G 		1.g,, 1.h(&i (&V& &R' 'T! !H/o /d0%* 0%f0;"	J< 
r    