
    ӊ^                     V    d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 d Z
d Zd Zd Zd	 Zy
)z
Routines for dealing with nmap-style IPv4 address ranges.

Based on nmap's Target Specification :-

    http://nmap.org/book/man-target-specification.html
    )AddrFormatError)	IPAddress	IPNetwork)_iter_range_is_str
_iter_nextc                    t               }| j                  d      D ]  }d|v r|j                  dd      \  }}|sd}|sd}t        |      }t        |      }d|cxk  rdk  rn nd|cxk  rdk  sn t        d| d      ||kD  rt        d|      t	        ||dz         D ]  }|j                  |        t        |      }d|cxk  rdk  sn t        d| d      |j                  |        t        |      S )	N,-   r      zoctet value overflow for spec !z%left side of hyphen must be <= right )setsplitint
ValueErrorr   addsorted)specvalueselementleftrightlowhighoctets           1/usr/lib/python3/dist-packages/netaddr/ip/nmap.py_nmap_octet_target_valuesr      s     UF::c? '>!--Q/KD%d)Cu:D#__1+;+; !NOOTz g!WXX$S$(3 "

5!" LE%#% !NOOJJu'* &>    c                 &   t        |       st        dt        |       z        | st        d      | j	                  d      }t        |      dk7  rt        d|       t        |d         t        |d         t        |d         t        |d	         fS )
Nzstring expected, not %sz*nmap target specification cannot be blank!.   zinvalid nmap range: r   r         )r   	TypeErrortyper   r   lenr   r   )nmap_target_spectokenss     r   _generate_nmap_octet_rangesr*   0   s     #$1D9I4JJKKEFF##C(F
6{a:JLMM%fQi0%fQi0%fQi0%fQi02 2r   c              #     K   d| v rj| j                  dd      \  }}dt        |      cxk  rdk  sn t        d|      t        |       }|j                  dk7  rt        d      |D ]  }|  y d| v rt        |        y t        |       }|d   D ]5  }|d   D ]+  }|d	   D ]!  }|d
   D ]  }	t        d||||	fz  d        # - 7 y w)N/r   r   !   zCIDR prefix expected, not r"   zCIDR only support for IPv4!:r#   r$   z%d.%d.%d.%d)r   r   r   r   versionr   r*   )
target_spec_prefixnetipoctet_rangeswxyzs
             r   _parse_nmap_target_specr:   D   s    
k%%c1-	6CK$"$!F"LMM$;;!!"?@@ 	BH			$$2;?a 	IA!!_ I%a IA)!_ I'Aq!(DaHHIII	Is   C
Cc                 b    	 t        t        |              y# t        t        t        f$ r Y yw xY w)z
    :param target_spec: an nmap-style IP range target specification.

    :return: ``True`` if IP range target spec is valid, ``False`` otherwise.
    TF)r   r:   r%   r   r   )r0   s    r   valid_nmap_ranger<   Z   s4    *;78z?3 s    ..c               '   B   K   | D ]  }t        |      D ]  }|   yw)aV  
    An generator that yields IPAddress objects from defined by nmap target
    specifications.

    See https://nmap.org/book/man-target-specification.html for details.

    :param *nmap_target_spec: one or more nmap IP range target specification.

    :return: an iterator producing IPAddress objects for each IP in the target spec(s).
    N)r:   )r(   r0   addrs      r   iter_nmap_ranger?   h   s0      ( +K8 	DJ	s   N)__doc__netaddr.corer   
netaddr.ipr   r   netaddr.compatr   r   r   r   r*   r:   r<   r?    r   r   <module>rE      s2    ) + ; ;:2(I,r   