
    $g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 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             dS )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)_open_binary)IPv4IPv6IPv6_unicast	multicastc                   (    e Zd ZddZd Zd Zd ZdS )SaxRecordParserNc                 h    d| _         d| _        d | _        d | _        d | _        d | _        || _        d S )Nr   F)_level
_is_active_record
_tag_level_tag_payload_tag_feeding	_callback)selfcallbacks     O/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/netaddr/ip/iana.py__init__zSaxRecordParser.__init__2   s9      !    c                    | xj         dz  c_         | j        du r:|dk    r0d| _        | j         | _        i | _        d|v r|d         | j        d<   d S d S d S | j         | j        dz   k    r`|dk    rJd|v rBd|v r@| j                            |d         g           }|                    |d                    d S d S d S g | _        d| _        d S d| _        d S )	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=DL(((   #?[DOa///v~~U??v//frBBAHHU6]+++++ #? %'!$(!!! %Dr   c                    | j         du r|dk    rU| j        | j        k    rEd| _         d | _        t          | j        d          r|                     | j                   d | _        nI| j        | j        dz   k    r6|dk    r0d                    | j                  | j        |<   d | _        d| _        | xj        dz  c_        d S )NTr!   F__call__r    r#    )	r   r   r   hasattrr   r   joinr   r   )r   r(   s     r   
endElementzSaxRecordParser.endElementP   s    ?d""xDOt{$B$B"'"&4>:66 1NN4<000#! 3336>>)+1B)C)CDL&(,D%(-D%qr   c                 P    | j         du r| j                            |           d S d S )NT)r   r   r'   )r   contents     r   
characterszSaxRecordParser.characters`   s5    $$$$W----- %$r   N)__name__
__module____qualname__r   r+   r1   r4    r   r   r   r   1   sU        " " " "& & &*   . . . . .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                            t          | j                             || _        | j	        
                    |           dS )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__j   sp     	ot$$--///$((9L)M)MNN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_recordy   s	     
r   c                 b    |                      |          }||                     |           d S d S r5   )rI   notifyr   rH   r!   s      r   r@   zXMLRecordParser.consume_record   s;    $$S))KK r   c                 D    | j                             | j                   dS )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"    
 	TW%%%%%r   )	r6   r7   r8   __doc__r   rI   r@   rN   __classcell__rF   s   @r   r;   r;   e   so         % % % % %       
& & & & & & &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                 X    t          t          |                               |           dS )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                 V   i }dD ]:}t          |                    |d                                                    ||<   ;d|d         v rB|d                             d          \  }}dt	          |          t	          |          fz  |d<   |d                                         |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 	8 	8Ccggc2..//5577F3KK &"""$X.44S99OUF&#e**c&kk)BBF8!(+6688xr   r6   r7   r8   rO   r   rI   rP   rQ   s   @r   rS   rS      sQ         - - - - -      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                 X    t          t          |                               |           dS 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                 R   t          |                    dd                                                    t          |                    dd                                                    t          |                    ddg          d                                                   d}|S )rW   rX   r.   descriptionrfc)rX   
allocation	referencer]   r^   r_   rL   s      r   rI   zIPv6Parser.process_record   s     #''(B//006688cggmR8899??AA SWWURD11"566<<>>

 

 r   re   rQ   s   @r   rg   rg      sQ         - - - - -      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                 X    t          t          |                               |           dS ri   )r=   rr   r   rD   s      r   r   zIPv6UnicastParser.__init__   s*     	&&//33333r   c           
         t          |                    dd                                                    t          |                    dd                                                    t          |                    dd                                                    t          |                    dd                                                    t          |                    dd                                                    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06688sww}b99::@@BB#''(B//006688++,,2244"--..4466
 
 r   re   rQ   s   @r   rr   rr      sQ         4 4 4 4 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                 X    t          t          |                               |           dS )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11111r   c                    d|v r|                     d          \  }}|                                                     d          }|                                                     d          }d                    d |D                       dd                    d |D                       S |                                                     d          }d                    d |D                       S )zX
        Removes variations from address entries found in this particular file.
        -.c                 F    g | ]}t          t          |                    S r9   r]   ra   .0is     r   
<listcomp>z2MulticastParser.normalise_addr.<locals>.<listcomp>&  $    222!#c!ff++222r   c                 F    g | ]}t          t          |                    S r9   r|   r}   s     r   r   z2MulticastParser.normalise_addr.<locals>.<listcomp>'  r   r   c                 F    g | ]}t          t          |                    S r9   r|   r}   s     r   r   z2MulticastParser.normalise_addr.<locals>.<listcomp>+  s$    555QSQ[[555r   )r`   r_   r0   )r   addra1a2o1o2s         r   normalise_addrzMulticastParser.normalise_addr  s     $;;zz#HR!!#&&B!!#&&B22r222333322r222333 
 ##C((B8855"555666r   c                     d|v rN|                      t          |d                             t          |                    dd                    d}|S dS )rW   r   rk   r.   )addressdescrN)r   r]   r^   rL   s      r   rI   zMulticastParser.process_record-  s]     S==..s3v;/?/?@@SWW]B7788 F M =r   )r6   r7   r8   rO   r   r   rI   rP   rQ   s   @r   rv   rv     s`         	2 	2 	2 	2 	27 7 7       r   rv   c                       e Zd ZdZd Zd ZdS )DictUpdaterzc
    Concrete Subscriber that inserts records received from a Publisher into a
    dictionary.
    c                 0    || _         || _        || _        dS )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__B  s     
$r   c                 @   || j                  }| j        dk    r(t          t          |                    }|| j        |<   dS | j        dk    r(t          t          |                    }|| j        |<   dS | j        dk    rt          |          }|| j        |<   dS | j        dk    ryd}d|v rX|                    d          \  }}t          ||          }|                                }t          |          dk    r|d         }nt          |          }|| j        |<   dS dS )	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.updateP  s)    t':3G<<==D!DHTNNNZ6!!3G<<==D!DHTNNNZ>))W%%D!DHTNNNZ;&&Gg~~ 'c 2 2!%..u::??#AhG#G,, $DHW '&r   N)r6   r7   r8   rO   r   rC   r9   r   r   r   r   <  s<         
% % %% % % % %r   r   c                  .   t          t          t          d                    } |                     t	          t
          d         dd                     |                                  t          t          t          d                    }|                    t	          t
          d         dd                     |                                 t          t          t          d                    }|                    t	          t
          d         dd                     |                                 t          t          t          d                    }|                    t	          t
          d	         d	d
                     |                                 dS )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   __package__attachr   	IANA_INFOrN   rg   rr   rv   )ipv4ipv6ipv6uamcasts       r   	load_infor   o  s/   
 l;0HIIJJDKKIf-vx@@AAAJJLLLl;0HIIJJDKKIf-vx@@AAAJJLLL["HII F MM+i7RRSSS
LLNNNL6OPPQQE	LLY{3[)LLMMM	KKMMMMMr   c                    | t           j        } t          t                    D ]}|                     dt          |          z  dz              |                     |dz              |                     dt          |          z  dz              t          |         }t          |          D ](}||         }|                     d|z  |z   dz              )dS )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                 |    t          |d          r| |v S t          |d          r| |k    S t          d|d          )Nr   valuez!Unsupported IP range or address: !)r/   	Exception)ipip_ranges     r   _within_boundsr     sQ    x!! X~	7	#	# X~
)hhhH
I
IIr   c                    i }| j         dk    rt          d                                         D ]F\  }}t          | |          r1|                    dg            |d                             |           G|                                 rft          d                                         D ]F\  }}t          | |          r1|                    dg            |d                             |           Gn| j         dk    rt          d                                         D ]F\  }}t          | |          r1|                    dg            |d                             |           Gt          d                                         D ]F\  }}t          | |          r1|                    dg            |d                             |           G|S )z7Returns informational data specific to this IP address.   r   r   	Multicast   r   r   )versionr   itemsr   r&   r'   is_multicast)ip_addrinfor   r!   r   s        r   queryr     s   D!%f-3355 	, 	,LD&gt,, ,+++V##F+++!! 	5#,[#9#?#?#A#A 5 5!'733 5OOK444%,,V444	A		%f-3355 	, 	,LD&gt,, ,+++V##F+++%n5;;== 	4 	4LD&gt,, 4333^$++F333Kr   r5   )rO   sysr   xml.saxr   r   netaddr.corer   r   
netaddr.ipr   r   r	   r
   netaddr.compatr   r   ContentHandlerr   r;   rS   rg   rr   rv   r   r   r   r   r   r9   r   r   <module>r      s"  ,      ( ( ( ( ( ( ( ( . . . . . . . . L L L L L L L L L L L L ' ' ' ' ' '
 	 	1. 1. 1. 1. 1.g, 1. 1. 1.h(& (& (& (& (&i (& (& (&V& & & & & & & &R' ' ' ' ' ' ' 'T" " " " " " " "J1 1 1 1 1o 1 1 1h0% 0% 0% 0% 0%* 0% 0% 0%f  0; ; ; ;"	J 	J 	J  > 
	r   