o
    g6                     @   s  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	 d	ejZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZdd ZdddZdd Zd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)_dict_items	_callable_importlib_resources)IPv4IPv6IPv6_unicast	multicastc                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )SaxRecordParserNc                 C   s.   d| _ d| _d | _d | _d | _d | _|| _d S )Nr   F)_level
_is_active_record
_tag_level_tag_payload_tag_feeding	_callback)selfcallback r   M/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/netaddr/ip/iana.py__init__3   s   
zSaxRecordParser.__init__c                 C   s   |  j d7  _ | jdu r+|dkr'd| _| j | _i | _d|v r)|d | jd< d S d S d S | j | jd kr]|dkrUd|v rQd|v rS| 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lr   r   r   startElement<   s&   


zSaxRecordParser.startElementc                 C   s   | j du r?|dkr$| j| jkr$d| _ d | _t| jr | | j d | _n| j| jd kr?|dkr?d| j| j|< d | _d| _|  jd8  _d S )NTr   Fr   r!    )	r   r   r   r   r   r   joinr   r   )r   r&   r   r   r   
endElementQ   s   

zSaxRecordParser.endElementc                 C   s   | j du r| j| d S d S )NT)r   r   r%   )r   contentr   r   r   
charactersa   s   
zSaxRecordParser.charactersN)__name__
__module____qualname__r   r)   r,   r.   r   r   r   r   r   2   s
    
	r   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
XMLRecordParserzP
    A configurable Parser that understands how to parse XML based records.
    c                    s>   t t|   t | _| jt| j || _| j	
| dS )z`
        Constructor.

        fh - a valid, open file handle to XML based record data.
        N)superr3   r   r   	xmlparsersetContentHandlerr   consume_recordfh__dict__updater   r8   kwargs	__class__r   r   r   k   s
   zXMLRecordParser.__init__c                 C   s   |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.
        r   )r   recr   r   r   process_recordz   s   zXMLRecordParser.process_recordc                 C   s$   |  |}|d ur| | d S d S r/   )r@   notifyr   r?   r   r   r   r   r7      s   
zXMLRecordParser.consume_recordc                 C   s   | j | j dS )z
        Parse and normalises records, notifying registered subscribers with
        record data as it is encountered.
        N)r5   parser8   )r   r   r   r   rC      s   zXMLRecordParser.parse)	r0   r1   r2   __doc__r   r@   r7   rC   __classcell__r   r   r=   r   r3   f   s    
r3   c                       (   e Zd ZdZ fddZdd Z  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| | dS )z
        Constructor.

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

        kwargs - additional parser options.
        N)r4   rG   r   r;   r=   r   r   r         zIPv4Parser.__init__c                 C   sp   i }dD ]}t ||d ||< qd|d v r.|d d\}}dt|t|f |d< |d  |d< |S )l
        Callback method invoked for every record.

        See base class method for more details.
        )prefixdesignationr    whoisstatusr*   /rK   z%d/%drN   )strgetstripsplitint
capitalize)r   r?   r   keyoctetrK   r   r   r   r@      s   zIPv4Parser.process_recordr0   r1   r2   rD   r   r@   rE   r   r   r=   r   rG          	
rG   c                       rF   )
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                    rH   z
        Constructor.

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

        kwargs - additional parser options.
        N)r4   rZ   r   r;   r=   r   r   r      rI   zIPv6Parser.__init__c                 C   sF   t |dd t |dd t |ddgd  d}|S )rJ   rK   r*   descriptionrfc)rK   
allocation	referencerP   rQ   rR   rB   r   r   r   r@      s
   zIPv6Parser.process_recordrX   r   r   r=   r   rZ      rY   rZ   c                       rF   )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                    rH   r[   )r4   rb   r   r;   r=   r   r   r      rI   zIPv6UnicastParser.__init__c              	   C   sd   t |dd t |dd t |dd t |dd t |dd d}|S )rJ   rN   r*   r\   rK   r    rM   )rN   r\   rK   r    rM   ra   rB   r   r   r   r@      s   z IPv6UnicastParser.process_recordrX   r   r   r=   r   rb      s    
rb   c                       s0   e Zd ZdZ fddZdd Zdd Z  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                    rH   )z
        Constructor.

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

        kwargs - additional parser options.
        N)r4   rc   r   r;   r=   r   r   r     s   	zMulticastParser.__init__c                 C   s   d|v r/| d\}}|  d}|  d}dddd |D ddd |D f S |  d}ddd |D S )zX
        Removes variations from address entries found in this particular file.
        -.z%s-%sc                 S      g | ]}t t|qS r   rP   rT   .0ir   r   r   
<listcomp>%      z2MulticastParser.normalise_addr.<locals>.<listcomp>c                 S   rf   r   rg   rh   r   r   r   rk   &  rl   c                 S   rf   r   rg   rh   r   r   r   rk   )  rl   )rS   rR   r+   )r   addra1a2o1o2r   r   r   normalise_addr  s   zMulticastParser.normalise_addrc                 C   s4   d|v r|  t|d t|ddd}|S dS )rJ   rm   r\   r*   )addressdescrN)rr   rP   rQ   rB   r   r   r   r@   +  s   zMulticastParser.process_record)r0   r1   r2   rD   r   rr   r@   rE   r   r   r=   r   rc     s
    	rc   c                   @   s    e Zd ZdZdd Zdd ZdS )DictUpdaterzc
    Concrete Subscriber that inserts records received from a Publisher into a
    dictionary.
    c                 C   s   || _ || _|| _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   rv   rw   rx   r   r   r   r   @  s   

zDictUpdater.__init__c                 C   s   || j  }| jdkrtt|}|| j|< dS | jdkr)tt|}|| j|< dS | jdkr9t|}|| j|< dS | jdkrjd}d|v r_|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   Nrd   r   r   )
rx   rw   r   r	   rv   rS   r   cidrslenr   )r   r#   data_idcidriprangefirstlastry   r   r   r   r:   N  s,   





zDictUpdater.updateN)r0   r1   r2   rD   r   r:   r   r   r   r   ru   :  s    ru   c                  C   s   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   rK   zipv6-address-space.xmlr   z$ipv6-unicast-address-assignments.xmlr   zmulticast-addresses.xmlr   rs   N)rG   r   open_binary__package__attachru   	IANA_INFOrC   rZ   rb   rc   )ipv4ipv6ipv6uamcastr   r   r   	load_infom  s   
r   c                 C   s   | du rt j} ttD ]9}| dt| d  | |d  | dt| d  t| }t|D ]}|| }| d| | d  q2qdS )z7
    Pretty prints IANA information to filehandle.
    Nrd   
z%-45r)_sysstdoutsortedr   writerz   )r8   categoryiprangesr}   detailsr   r   r   pprint_info  s   r   c                 C   s2   t |dr	| |v S t |dr| |kS td|f )Nr~   valuez$Unsupported IP range or address: %r!)hasattr	Exception)ipip_ranger   r   r   _within_bounds  s
   

r   c                 C   s  i }| j dkrGttd D ]\}}t| |r#|dg  |d | q|  rEttd D ]\}}t| |rD|dg  |d | q.|S | j dkrttd D ]\}}t| |rh|dg  |d | qRttd D ]\}}t| |r|dg  |d | qo|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}   r   r   r   query  s4   





r   r/   )rD   sysr   xml.saxr   r   netaddr.corer   r   
netaddr.ipr   r   r   r	   netaddr.compatr
   r   r   r   ContentHandlerr   r3   rG   rZ   rb   rc   ru   r   r   r   r   r   r   r   r   <module>   s.   
4+)*$23

