a
    4i                     @   sf   d dl Z d dlZd dlZd dlmZmZ d dlmZmZ dZ	G dd dZ
dd Zd	d
 Zdd ZdS )    N)PopenPIPE)prefixversionzdnssec-checkdsc                   @   sN   e Zd ZdddddZdZdZdZdZdZdZ	d	Z
d
d Zdd Zdd ZdS )SECRRzSHA-1zSHA-256ZGOSTzSHA-384)             INNr   c                 C   s  |st t|tur$|d }n| }t|dk r<t d| _|d  | _|dd  }|d 	 dv r|d 	 | _
|dd  }n(t|d | _|d 	 | _
|dd  }|d 	 | jkrt d|d 	 | jf tt|dd	 \| _| _| _d
|d	d  	 | _d S )Nascii   ZDSr   r   )r   ZCHZHSr   z%s does not match %sr
   r   )	Exceptiontypestrdecodesplitlenrrtypelowerrrnameupperrrclassintttlmapkeyidkeyalghashalgjoindigest)selfZrrtextfields r$   -/usr/lib/python3/dist-packages/isc/checkds.py__init__$   s(    zSECRR.__init__c                 C   s$   d| j | j| j| j| j| j| jf S )Nz%s %s %s %d %d %d %s)r   r   r   r   r   r   r!   )r"   r$   r$   r%   __repr__B   s    zSECRR.__repr__c                 C   s   |   |  kS N)r'   )r"   otherr$   r$   r%   __eq__M   s    zSECRR.__eq__)__name__
__module____qualname__hashalgsr   r   r   r   r   r!   r   r&   r'   r*   r$   r$   r$   r%   r      s   r   c              	   C   sD  g }|j rt|j  }n(|jddddd| g}t|td \}}| D ](}t|t	urd|
d}|t| qJt|dd	 d
}g }|jg}|jD ]}|d|g7 }q|jr|d|j| g7 }t|td \}}nJt|jddddd| gtd \}	}|dd| g7 }t|ttd|	\}}| D ],}t|t	urB|
d}|t| q&t|dk rntd dS d}
|D ]@}||vrvtd|j|jd|j|jtj|j f  d}
qv|D ]@}||vrtd|j|jd|j|jtj|j f  d}
q|D ]<}||v rtd|j|jd|j|jtj|j f  q|
S )Nz+noallz+answerz-tZdsz-q)stdoutr   c                 S   s   | j | j| jfS r(   )r   r   r   )rrr$   r$   r%   <lambda>d       zcheck.<locals>.<lambda>)key-a-fZdnskey-)stdinr/   r   z$No DNSKEY records found in zone apexFTz/KSK for %s %s/%03d/%05d (%s) missing from child.z0%s for KSK %s/%03d/%05d (%s) missing from parentz,%s for KSK %s/%03d/%05d (%s) found in parent)	dssetfileopenreaddigr   r   Zcommunicate
splitlinesr   r   r   appendr   sorted	dsfromkeyalgo
masterfiler   printr   r   stripr   r   r.   r   )zoneargsZrrlistfpcmd_lineZklistrA   Zintodsmatchr0   r$   r$   r%   checkX   s    













rL   c               	   C   s   t jtd d} d}tjdkr"dnd}| jdtdd | jd	d
ddg tdd | jdddtjt	|dtdd | jdddtjt	|dtdd | jdddtdd | jddd td!d | jd"d#d$t
d% |  }|jd&|_|S )'Nz: checks DS coverage)ZdescriptionbinntZsbinrE   zzone to check)r   helpr4   z--algorA   r>   zDS digest algorithm)destactiondefaultr   rO   z-dz--digr<   zpath to 'dig')rP   rR   r   rO   z-Dz--dsfromkeyr@   zdnssec-dsfromkeyzpath to 'dnssec-dsfromkey'r5   z--filerB   zzone master file)rP   r   rO   z-sz--dssetr9   zprepared DSset filez-vz	--versionr   )rQ   r   r8   )argparseArgumentParserprogosnameadd_argumentr   pathr    r   r   
parse_argsrE   rD   )parserZbindirZsbindirrF   r$   r$   r%   rZ      sN    	

rZ   c                  C   s&   t  } t| j| }t|rdnd d S )Nr   r   )rZ   rL   rE   exit)rF   rK   r$   r$   r%   main   s    r]   )rS   rV   sys
subprocessr   r   Z	isc.utilsr   r   rU   r   rL   rZ   r]   r$   r$   r$   r%   <module>   s   >V1