a
    4iA                     @   sJ   d dl Z d dlZd dlZd dlmZmZ G dd deZG dd dZdS )    N)PopenPIPEc                       s   e Zd Z fddZ  ZS )TimePastc                    s   t t| d|||f  d S )Nz'%s time for key %s (%d) is already past)superr   __init__)selfkeypropvalue	__class__ ,/usr/lib/python3/dist-packages/isc/dnskey.pyr      s    
zTimePast.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r      s   r   c                   @   s  e Zd ZdZdZdZdZdVddZdd	 Zd
d Z	e
dWddZdd Zedd Zedd ZdXddZedd Zedd Zedd Zedd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Ze fd*d+Zd,d- Ze fd.d/Zd0d1 Ze fd2d3Z d4d5 Z!e fd6d7Z"d8d9 Z#e fd:d;Z$d<d= Z%e fd>d?Z&d@dA Z'e fdBdCZ(dDdE Z)dFdG Z*dHdI Z+dJdK Z,dLdM Z-dNdO Z.dYdPdQZ/dZdRdSZ0edTdU Z1dS )[dnskeyztAn individual DNSSEC key.  Identified by path, name, algorithm, keyid.
    Contains a dictionary of metadata events.)	CreatedPublishActivateInactiveDeleteRevokeZ	DSPublishSyncPublish
SyncDelete)	N-P-Az-Iz-Dz-RNz-Psyncz-Dsync)NZRSAMD5ZDHZDSANZRSASHA1ZNSEC3DSAZNSEC3RSASHA1Z	RSASHA256NZ	RSASHA512NZECCGOSTZECDSAP256SHA256ZECDSAP384SHA384ZED25519ZED448Nc                 C   s   t |tr:t|dkr:|pd| _|\}}}| |||| |pLtj|pLd| _tj|}|	d\}}}|dd }t
|}t
|	dd }| |||| d S )N   .+   r   )
isinstancetuplelen_dir	fromtupleospathdirnamebasenamesplitint)r   r   Z	directorykeyttlnamealgkeyidr   r   r   r   A   s    

zdnskey.__init__c                    s  | dr|}|d}n|d }d|||f }| j| jr@tjpBd | d }| j| jr^tjp`d | d }|| _|| _t|| _t|| _	|| _
t|d}	|	D ]z  d dkrq  }
|
sq|
d	  d
v rd}|| _nd}|st|
d	 n|| _t|
| d	@ d	krd| _qd| _q|	  t|d}t | _t | _t | _t | _t | _t | _t | _d | _|D ]     rp d dv rqp fdddD t g }tdd |D } d |  } |d  d }|| j|< qptjD ]}d| j|< || jv rb| | j| }|| j|< |  || j|< | !|| j|< | j| | j|< n(d | j|< d | j|< d | j|< d | j|< q|  d S )Nr   zK%s+%03d+%05d z.keyz.privaterr   ;r!   )inZchZhsr      TFz!#c                    s   g | ]}  |qS r   )find).0cliner   r   
<listcomp>       z$dnskey.fromtuple.<locals>.<listcomp>z:= c                 S   s   g | ]}|d kr|qS )r"   r   )r8   posr   r   r   r<      r=   )"endswithrstripr&   r(   sepkeystrr/   r-   r0   r1   fullnameopenr,   lowerttlclosedictmetadata_changed_delete_times_fmttime_timestamps	_original_origttlstripr%   minlstripr   _PROPS	parsetime
formattimeepochfromtime)r   r/   r0   r1   r.   rC   rB   Zkey_fileZprivate_fileZkfptokensZseptokenZpfpZpunctuationfoundr
   r	   tr   r:   r   r'   P   sv    










zdnskey.fromtuplec              
   K   sf  | dd}g }d}| jd ur0|dt| jg7 }ttjtjD ]V\}}|r>| j| sVq>d}|| j	v rr| j	| rrd}|rzdn| j
| }	|||	g7 }d}q>|rb|d| jg| | jg }
|stdd|
  z.t|
ttd	}| \}}|rtt|W n: ty2 } z td
|t|f W Y d }~n
d }~0 0 d | _tjD ] }| j| | j|< d| j|< q@d S )NquietFT-LZnone-K#  stdoutstderrzunable to run %s: %s)getrP   strrF   zipr   rT   _OPTSrJ   rK   rM   r&   rB   printjoinr   r   communicate	ExceptionrN   rO   )r   Zsettime_binkwargsr[   cmdfirstr	   ZoptdeleteZwhenZfullcmdpra   rb   er   r   r   commit   sF    

*
zdnskey.commitc              
   K   sP  | dd}|dd|dt|g}|r0|d|g7 }|r>|d |rN|d|g7 }|rb|d	t|g7 }|	rt|	}|d
t|g7 }|
rt|
}|dt|
g7 }|| |stdd|  t|t	t	d}|
 \}}|rtdt| z$| d d}t|||}|W S  tyJ } ztdt| W Y d }~n
d }~0 0 d S )Nr[   F-qr]   r\   -rz-fkz-az-br   r   r^   r_   r`   unable to generate key: r   asciiz!unable to parse generated key: %s)rc   rd   appendr   timefromepochrV   rg   rh   r   r   ri   rj   
splitlinesdecode)cls
keygen_bin	randomdevZkeys_dirr/   r0   ZkeysizerA   rF   publishactivaterk   r[   
keygen_cmdrZ   ro   ra   rb   rB   newkeyrp   r   r   r   generate   s:    



zdnskey.generatec                 K   s   | dd}|  s td|  |dd| jd| jg}| jrL|dt| jg7 }|r\|d|g7 }|rp|d	t|g7 }|std
d|  t	|t
t
d}| \}}	|	rtd|	 z(| d d}
t|
| j| j}|W S    td|  Y n0 d S )Nr[   Fz'predecessor key %s has no inactive daterr   r]   z-Sr\   rs   z-ir^   r_   r`   rt   r   ru   z'unable to generate successor for key %s)rc   inactiverj   r&   rB   rF   rd   rg   rh   r   r   ri   rx   ry   r   )r   r{   r|   Z
prepublishrk   r[   r   ro   ra   rb   rB   r   r   r   r   generate_successor   s,    zdnskey.generate_successorc                 C   s0   d }| t ttjv r tj|  }|r(|S d|  S )Nz%03d)ranger%   r   	_ALGNAMES)r0   r/   r   r   r   algstr  s    
zdnskey.algstrc                 C   s8   | sd S |   } ztj| W S  ty2   Y d S 0 d S N)upperr   r   index
ValueError)r0   r   r   r   algnum%  s    zdnskey.algnumc                 C   s   |  |p| jS r   )r   r0   )r   r0   r   r   r   algname/  s    zdnskey.algnamec                 C   s
   t | S r   )timegmtime)secsr   r   r   rw   2  s    zdnskey.timefromepochc                 C   s   t | dS Nz%Y%m%d%H%M%S)r   strptime)stringr   r   r   rU   6  s    zdnskey.parsetimec                 C   s
   t | S r   )calendarZtimegmrZ   r   r   r   rW   :  s    zdnskey.epochfromtimec                 C   s   t d| S r   )r   strftimer   r   r   r   rV   >  s    zdnskey.formattimec                 K   s   | dd}| j| |krd S | j| d urP| j| |k rP|sPt| || j| |d u r| j| d u rjdnd| j|< d| j|< d | j|< d | j|< d | j|< d S | |}|| j|< || j|< | 	|| j|< | j| | j| krdnd| j|< d S )NforceFT)
rc   rN   rO   r   rJ   rK   rL   rM   rw   rV   )r   r	   r   nowrk   r   rZ   r   r   r   setmetaB  s.    






zdnskey.setmetac                 C   s
   | j | S r   )rL   r   r	   r   r   r   gettime`  s    zdnskey.gettimec                 C   s
   | j | S r   )rM   r   r   r   r   
getfmttimec  s    zdnskey.getfmttimec                 C   s
   | j | S r   rN   r   r   r   r   gettimestampf  s    zdnskey.gettimestampc                 C   s
   | j d S )Nr   r   r   r   r   r   createdi  s    zdnskey.createdc                 C   s
   | j d S Nr   r   r   r   r   r   syncpublishl  s    zdnskey.syncpublishc                 K   s   | j d||fi | d S r   r   r   r   r   rk   r   r   r   setsyncpublisho  s    zdnskey.setsyncpublishc                 C   s
   | j d S Nr   r   r   r   r   r   r}   r  s    zdnskey.publishc                 K   s   | j d||fi | d S r   r   r   r   r   r   
setpublishu  s    zdnskey.setpublishc                 C   s
   | j d S Nr   r   r   r   r   r   r~   x  s    zdnskey.activatec                 K   s   | j d||fi | d S r   r   r   r   r   r   setactivate{  s    zdnskey.setactivatec                 C   s
   | j d S Nr   r   r   r   r   r   revoke~  s    zdnskey.revokec                 K   s   | j d||fi | d S r   r   r   r   r   r   	setrevoke  s    zdnskey.setrevokec                 C   s
   | j d S Nr   r   r   r   r   r   r     s    zdnskey.inactivec                 K   s   | j d||fi | d S r   r   r   r   r   r   setinactive  s    zdnskey.setinactivec                 C   s
   | j d S Nr   r   r   r   r   r   rn     s    zdnskey.deletec                 K   s   | j d||fi | d S r   r   r   r   r   r   	setdelete  s    zdnskey.setdeletec                 C   s
   | j d S Nr   r   r   r   r   r   
syncdelete  s    zdnskey.syncdeletec                 K   s   | j d||fi | d S r   r   r   r   r   r   setsyncdelete  s    zdnskey.setsyncdeletec                 C   sR   |d u s| j |krd S | jd u r0| j | _|| _ n| j|krHd | _|| _ n|| _ d S r   )rF   rP   )r   rF   r   r   r   setttl  s    

zdnskey.setttlc                 C   s   | j r
dS dS )NKSKZSK)rA   r   r   r   r   keytype  s    zdnskey.keytypec                 C   s   d| j |  | jf S )Nz
%s/%s/%05d)r/   r   r1   r   r   r   r   __str__  s    zdnskey.__str__c                 C   s"   d| j |  | j| jrdndf S )Nz%s/%s/%05d (%s)r   r   )r/   r   r1   rA   r   r   r   r   __repr__  s    zdnskey.__repr__c                 C   s   |   p|  p|  S r   )r~   r}   r   r   r   r   r   date  s    zdnskey.datec                 C   s@   | j |j kr| j |j k S | j|jkr0| j|jk S |  | k S r   )r/   r0   r   )r   otherr   r   r   __lt__  s
    zdnskey.__lt__c                 C   s   dd }|s|}t t }|  }|  }|s4dS |sT||krP|dt|   dS ||krh||krhdS ||kr|dt| t| jpdf  dS ||k r|dt|   dS | jd ur|| | jk r|d	t| t| jpdf  dS dS )
Nc                  _   s   d S r   r   argsrk   r   r   r   noop  s    z!dnskey.check_prepub.<locals>.noopFzFWARNING: Key %s is scheduled for
	 activation but not for publication.TzWARNING: %s is scheduled to be
	 published and activated at the same time. This
	 could result in a coverage gap if the zone was
	 previously signed. Activation should be at least
	 %s after publication.zone DNSKEY TTLz0WARNING: Key %s is active before it is publishedzWARNING: Key %s is activated too soon
	 after publication; this could result in coverage 
	 gaps due to resolver caches containing old data.
	 Activation should be at least %s after
	 publication.)r-   r   r~   r}   reprr   durationrF   )r   outputr   r   aro   r   r   r   check_prepub  sH    zdnskey.check_prepubc                 C   s   dd }|d u r|}|d u r"| j }|d u r>|dt|   d}t }|  }|  }|s^dS |s~||krz|dt|   dS ||k r||k rdS ||k r|dt|   dS || |k r|d	t| t|f  dS dS )
Nc                  _   s   d S r   r   r   r   r   r   r     s    z"dnskey.check_postpub.<locals>.noopz"WARNING: Key %s using default TTL.Q FzEWARNING: Key %s is scheduled for
	 deletion but not for inactivation.Tz@WARNING: Key %s is scheduled for
	 deletion before inactivation.zWARNING: Key %s scheduled for
	 deletion too soon after deactivation; this may 
	 result in coverage gaps due to resolver caches
	 containing old data.  Deletion should be at least
	 %s after inactivation.)rF   r   r   rn   r   r   r   )r   r   Ztimespanr   r   dir   r   r   check_postpub  sL    zdnskey.check_postpubc                 C   sn   | sd S g d}g }|D ]J}| |d  | |d   }} |dkr| d||d |dkrXdndf  qd|S )N))Zyeari3)Zmonthi ' )Zdayr   )Zhouri  )Zminute<   )secondr!   r!   r   z%d %s%ssr2   z, )rv   rh   )r   Zunitsr   Zunitvr   r   r   r   &  s    	&zdnskey.duration)NN)NN)N)N)NN)2r   r   r   __doc__rT   rf   r   r   r'   rq   classmethodr   r   staticmethodr   r   r   rw   rU   rW   rV   r   r   r   r   r   r   r   r   r}   r   r~   r   r   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sl   
L*  7 

	





5
3r   )	r(   r   r   
subprocessr   r   rj   r   r   r   r   r   r   <module>   s
   