o
    g                     @   s`   d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 dd Z
dd Zd	d
 Zdd Zdd ZdS )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                 C   s   t  }| dD ]r}d|v r_|dd\}}|sd}|sd}t|}t|}d|  kr0dkr=n nd|  kr<dksDn td| f ||krOtd|f t||d D ]}|| qVqt|}d|  krmdksun td| f || qt|S )N,-   r      z!octet value overflow for spec %s!z'left side of hyphen must be <= right %r)setsplitint
ValueErrorr   addsorted)specvalueselementleftrightlowhighoctet r   M/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/netaddr/ip/nmap.py_nmap_octet_target_values   s,   .r   c                 C   st   t | stdt|  | std| d}t|dkr$td| f 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: %sr   r
         )r   	TypeErrortyper   r   lenr   r   )nmap_target_spectokensr   r   r   _generate_nmap_octet_ranges0   s   




r&   c           
   
   c   s    d| v r8|  dd\}}dt|  k rdk s!n td|f t| }|jdkr.td|D ]}|V  q0d S d| v rCt| V  d S t| }|d D ]#}|d D ]}|d	 D ]}|d
 D ]}	td||||	f dV  q]qWqQqKd S )N/r
   r   !   zCIDR prefix expected, not %sr   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zr   r   r   _parse_nmap_target_specD   s.   
r5   c              
   C   s.   z	t t|  W dS  tttfy   Y dS 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   r5   r!   r   r   )r+   r   r   r   valid_nmap_rangeZ   s   r6   c                  g   s$    | D ]}t |D ]}|V  q	qdS )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)r5   )r$   r+   addrr   r   r   iter_nmap_rangeh   s   r8   N)__doc__netaddr.corer   
netaddr.ipr   r   netaddr.compatr   r   r   r   r&   r5   r6   r8   r   r   r   r   <module>   s   