a
    4i%                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ dZd dlmZmZmZmZmZmZ dd Zdad	d
 Zdd Zdd ZdddZdd Zdd ZdS )    )print_functionN)defaultdictzdnssec-coverage)dnskey	eventlistkeydictkeyeventkeyzoneutilsc                  O   s   t | i | td d S )N   )printsysexit)argskwargs r   ./usr/lib/python3/dist-packages/isc/coverage.pyfatal   s    r   Tc                  O   sN   d|v r|d }| dd nd}tr,dan|r8td | rJt| i | dS )zuoutput text, adding a vertical space this is *not* the first
    first section being printed since a call to vreset()skipNTF )pop
_firstliner   )r   r   r   r   r   r   output*   s    r   c                   C   s   da dS )zreset vertical spacingTN)r   r   r   r   r   vreset;   s    r   c                 C   s   |   } z
t| W S  ty$   Y n0 td}|| }|sJtd|  | \}}t|}| }|drx|d S |dr|d S |dr|d S |d	r|d
 S |dr|d S |dr|d S |dr|S td| dS )zconvert a formatted time (e.g., 1y, 6mo, 15mi, etc) into seconds
    :param s: String with some text representing a time interval
    :return: Integer with the number of seconds in the time interval
    z([0-9][0-9]*)\s*([A-Za-z]*)zCannot parse %syi3Zmoi ' w:	 diQ hi  mi<   szInvalid suffix %sN)	stripint
ValueErrorrecompilematchgroupslower
startswith)r    rmnZunitr   r   r   
parse_timeD   s6    









r-   c                 C   s~   |}|r"t j|r"t |t jszt jd }|s8t jj}|t jD ]4}t j	|| }t j|rtt |t jrt qzd}qD|S )a0  find the location of a specified command.  if a default is supplied
    and it works, we use it; otherwise we search PATH for a match.
    :param command: string with a command to look for in the path
    :param default: default location to use
    :return: detected location for the desired command
    PATHN)
ospathisfileaccessX_OKenvirondefpathsplitpathsepjoin)ZcommanddefaultZfpathr0   Z	directoryr   r   r   set_pathn   s    
r:   c            	   
   C   s>  t dtjtdd} tjtd d d}|j	dt
ddd	d
 |j	dddt
ddd |j	ddt
ddd |j	ddt
ddd |j	ddt
ddd |j	dddt
d dd |j	d!d"| t
d#dd |j	d$d%t
d&d'dd( |j	d)d*d+d,d-d. |j	d/d0d+d,d1d. |j	d2d3d4d+d,d5d. |j	d6d7d8tjd9 | }|jrJ|jrJtd: n*|jsZ|jrn|jrfd;nd<|_nd|_|jrt|jd=krtd> d?d@ |jD |_z|jrt|j}||_W n ty   Y n0 z|jrt|j}||_W n ty   Y n0 z|jr$t|j}||_W n ty:   Y n0 z<|jrv|j}t|j}|dAkrhd|_nt | |_W n ty   Y n0 |jr|jr|S |jr$|jr$z:t|jdA |j|j}|jp|j|_|jp|j|_W n6 ty" } ztdB|j | W Y d}~n
d}~0 0 |js:tdC dD|_|S )Ez8Read command line arguments, set global 'args' structureznamed-compilezoneZsbinz: checks future zDNSKEY coverage for a zone)Zdescriptionzone*Nz5zone(s) to check(default: all zones in the directory))typenargsr9   helpz-Kr0   .z&a directory containing keys to processdir)destr9   r=   r?   metavarz-ffilenamezzone master filefile)rB   r=   r?   rC   z-mmaxttlzthe longest TTL in the zone(s)timez-dkeyttlzthe DNSKEY TTLz-rresignZ1944000z:the RRSIG refresh interval in seconds [default: 22.5 days]z-ccompilezonezpath to 'named-compilezone'z-l
checklimit0zDLength of time to check for DNSSEC coverage [default: 0 (unlimited)])rB   r=   r9   r?   rC   z-zno_ksk
store_trueFz#Only check zone-signing keys (ZSKs))rB   actionr9   r?   z-kno_zskz"Only check key-signing keys (KSKs)z-Dz--debugZ
debug_modezTurn on debugging outputz-vz	--versionversion)rO   rQ   z)ERROR: -z and -k cannot be used together.ZKSKZZSKr
   z)ERROR: -f can only be used with one zone.c                 S   s4   g | ],}t |d kr,|d dkr,|dd n|qS )r
   r@   N)len).0xr   r   r   
<listcomp>       zparse_args.<locals>.<listcomp>r   z"Unable to load zone data from %s: zWARNING: Maximum TTL value was not specified.  Using 1 week
	 (604800 seconds); re-run with the -m option to get more
	 accurate results.r   ) r:   r/   r0   r8   r	   prefixargparseArgumentParserprogadd_argumentstrrQ   
parse_argsrP   rM   r   keytyperD   rS   r;   rF   r-   r#   rH   rI   rK   rG   r   rJ   	Exceptionr   r   )	rJ   parserr   r+   kr*   Zlimr;   er   r   r   r^      s   











&r^   c               
   C   sl  t  } td zt| j| j| jd}W n4 tyZ } ztdt|  W Y d }~n
d }~0 0 |D ]4}|	t
 |jr|t
 q`|t
| j| j  q`t
d t  zt|}W n4 ty } ztdt|  W Y d }~n
d }~0 0 d}| js|d | j| jt
sTd}nF| jD ]>}z||| j| jt
s4d}W n   t
d|  Y n0 qt|rbd	nd
 d S )Nz;PHASE 1--Loading keys to check for internal timing problems)r0   ZzonesrH   z'ERROR: Unable to build key dictionary: z9PHASE 2--Scanning future key events for coverage failuresz#ERROR: Unable to build event list: FTz&ERROR: Coverage check failed for zone r
   r   )r^   r   r   r0   r;   rH   r`   r   r]   Zcheck_prepubr   sepZcheck_postpubrF   rI   r   r   Zcoverager_   rK   r   r   )r   Zkdrc   keyZelisterrorsr;   r   r   r   main(  s8    &
&
rg   )N)Z
__future__r   r/   r   rY   Zglobr$   rG   ZcalendarZpprintcollectionsr   r[   Ziscr   r   r   r   r   r	   r   r   r   r   r-   r:   r^   rg   r   r   r   r   <module>   s(    	*
 "