???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
!i @                 @   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| jd|||f  d S )Nz'%s time for key %s (%d) is already past)superr   __init__)selfkeypropvalue)	__class__ /usr/lib/python3.6/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dqZdrZdsZdtd!d"Zd#d$ Zd%d& Z	e
dud'd(Zd)d* Zed+d, Zed-d. Zdvd/d0Zed1d2 Zed3d4 Zed5d6 Zed7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD Zej fdEdFZdGdH Zej fdIdJZdKdL Zej fdMdNZ dOdP Z!ej fdQdRZ"dSdT Z#ej fdUdVZ$dWdX Z%ej fdYdZZ&d[d\ Z'ej fd]d^Z(d_d` Z)dadb Z*dcdd Z+dedf Z,dgdh Z-didj Z.dwdkdlZ/dxdmdnZ0edodp Z1dS )ydnskeyztAn individual DNSSEC key.  Identified by path, name, algorithm, keyid.
    Contains a dictionary of metadata events.CreatedPublishActivateInactiveDeleteRevoke	DSPublishSyncPublish
SyncDeleteN-P-A-I-D-R-Psync-DsyncRSAMD5DHDSAECCRSASHA1NSEC3DSANSEC3RSASHA1	RSASHA256	RSASHA512ECCGOSTECDSAP256SHA256ECDSAP384SHA384ED25519ED448c             C   s   t |tr:t|dkr:|pd| _|\}}}| j|||| |pLtjj|pLd| _tjj|}|j	d\}}}|dd }t
|}t
|j	dd }| j|||| 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   &   s    

zdnskey.__init__c                s  |j dr|}|jd}n|d }d|||f }| j| jr@tjpBd | d }| j| jr^tjp`d | d }|| _|| _t|| _t|| _	|| _
t|d}	x|	D ]z  d dkrq j }
|
sq|
d	 j dkrd}|| _nd}|st|
d	 n|| _t|
| d	@ d	krd| _qd| _qW |	j  t|d}t | _t | _t | _t | _t | _t | _t | _d | _x|D ]  j    sv d dkrqv fdddD t g }tdd |D } d | j } |d  jdj }|| j|< qvW xtjD ]}d| j|< || jkrn| j| j| }|| j|< | j || j|< | j!|| j|< | j| | j|< n(d | j|< d | j|< d | j|< d | j|< qW |j  d S )Nr2   zK%s+%03d+%05d z.keyz.privaterr   ;r4   inchhsr1      TFZrUz!#c                s   g | ]} j |qS r   )find).0c)liner   r   
<listcomp>l   s    z$dnskey.fromtuple.<locals>.<listcomp>z:= c             S   s   g | ]}|dkr|qS )r4   r5   r   )rM   posr   r   r   rP   m   s    )rH   rI   rJ   )"endswithrstripr9   r;   sepkeystrrB   r@   rC   rD   fullnameopenr?   lowerttlclosedictZmetadata_changed_delete_times_fmttime_timestamps	_original_origttlstripr8   minlstripr   _PROPS	parsetime
formattimeepochfromtime)r   rB   rC   rD   rA   rV   rU   Zkey_fileZprivate_fileZkfptokensZseptokenZpfpZpunctuationfoundr
   r	   tr   )rO   r   r:   5   sv    












zdnskey.fromtuplec             K   sr  |j dd}g }d}| jd k	r0|dt| jg7 }xlttjtjD ]Z\}}| s@| j|  r\q@d}|| j	krx| j	| rxd}|rdn| j
| }	|||	g7 }d}q@W |rn|d| jg| | jg }
|stddj|
  y0t|
ttd	}|j \}}|r tt|W n8 tk
r: } ztd
|t|f W Y d d }~X nX d | _x*tjD ] }| j| | j|< d| j|< qJW d S )NquietFTz-LZnonez-Kz#  )stdoutstderrzunable to run %s: %s)getrb   strrY   zipr   rf   _OPTSr\   r]   r_   r9   rU   printjoinr   r   communicate	Exceptionr`   ra   )r   Zsettime_binkwargsrm   cmdfirstr	   optdeleteZwhenZfullcmdpro   rp   er   r   r   commit   s<    
"zdnskey.commitc             K   sL  |j dd}|dd|dt|g}|r0|d|g7 }|r>|jd |rN|d|g7 }|rb|d	t|g7 }|	rtj|	}|d
tj|g7 }|
rtj|
}|dtj|
g7 }|j| |stddj|  t|t	t	d}|j
 \}}|rtdt| y"|j d jd}t|||}|S  tk
rF } ztdt| W Y d d }~X nX d S )Nrm   Fz-qz-Kz-Lz-rz-fkz-az-bz-Pz-Az# rn   )ro   rp   zunable to generate key: r   asciiz!unable to parse generated key: %s)rq   rr   appendr   timefromepochrh   ru   rv   r   r   rw   rx   
splitlinesdecode)cls
keygen_bin	randomdevZkeys_dirrB   rC   ZkeysizerT   rY   publishactivatery   rm   
keygen_cmdrl   r~   ro   rp   rU   newkeyr   r   r   r   generate   s:    



zdnskey.generatec          
   K   s   |j dd}| j 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j|  t	|t
t
d}|j \}}	|	rtd|	 y&|j d jd}
t|
| j| j}|S    td|  Y nX d S )Nrm   Fz'predecessor key %s has no inactive datez-qz-Kz-Sz-Lz-rz-iz# rn   )ro   rp   zunable to generate key: r   r   z'unable to generate successor for key %s)rq   inactiverx   r9   rU   rY   rr   ru   rv   r   r   rw   r   r   r   )r   r   r   Z
prepublishry   rm   r   r~   ro   rp   rU   r   r   r   r   generate_successor   s,    zdnskey.generate_successorc             C   s0   d }| t ttjkr tj|  }|r(|S d|  S )Nz%03d)ranger8   r   	_ALGNAMES)rC   rB   r   r   r   algstr   s    
zdnskey.algstrc             C   s6   | sd S | j  } ytjj| S  tk
r0   d S X d S )N)upperr   r   index
ValueError)rC   r   r   r   algnum   s    zdnskey.algnumc             C   s   | j |p| jS )N)r   rC   )r   rC   r   r   r   algname  s    zdnskey.algnamec             C   s
   t j| S )N)timeZgmtime)secsr   r   r   r     s    zdnskey.timefromepochc             C   s   t j| dS )Nz%Y%m%d%H%M%S)r   Zstrptime)stringr   r   r   rg     s    zdnskey.parsetimec             C   s
   t j| S )N)calendarZtimegm)rl   r   r   r   ri     s    zdnskey.epochfromtimec             C   s   t jd| S )Nz%Y%m%d%H%M%S)r   Zstrftime)rl   r   r   r   rh     s    zdnskey.formattimec             K   s   |j dd}| j| |krd S | j| d k	rR| j| |k rR| rRt| || j| |d kr| j| d krldnd| j|< d| j|< d | j|< d | j|< d | j|< d S | j|}|| j|< || j|< | j	|| j|< | j| | j| krdnd| j|< d S )NforceFT)
rq   r`   ra   r   r\   r]   r^   r_   r   rh   )r   r	   r   nowry   r   rl   r   r   r   setmeta  s$    






zdnskey.setmetac             C   s
   | j | S )N)r^   )r   r	   r   r   r   gettime2  s    zdnskey.gettimec             C   s
   | j | S )N)r_   )r   r	   r   r   r   
getfmttime5  s    zdnskey.getfmttimec             C   s
   | j | S )N)r`   )r   r	   r   r   r   gettimestamp8  s    zdnskey.gettimestampc             C   s
   | j d S )Nr   )r`   )r   r   r   r   created;  s    zdnskey.createdc             C   s
   | j d S )Nr   )r`   )r   r   r   r   syncpublish>  s    zdnskey.syncpublishc             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   setsyncpublishA  s    zdnskey.setsyncpublishc             C   s
   | j d S )Nr   )r`   )r   r   r   r   r   D  s    zdnskey.publishc             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   
setpublishG  s    zdnskey.setpublishc             C   s
   | j d S )Nr   )r`   )r   r   r   r   r   J  s    zdnskey.activatec             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   setactivateM  s    zdnskey.setactivatec             C   s
   | j d S )Nr   )r`   )r   r   r   r   revokeP  s    zdnskey.revokec             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   	setrevokeS  s    zdnskey.setrevokec             C   s
   | j d S )Nr   )r`   )r   r   r   r   r   V  s    zdnskey.inactivec             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   setinactiveY  s    zdnskey.setinactivec             C   s
   | j d S )Nr   )r`   )r   r   r   r   r}   \  s    zdnskey.deletec             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   	setdelete_  s    zdnskey.setdeletec             C   s
   | j d S )Nr   )r`   )r   r   r   r   
syncdeleteb  s    zdnskey.syncdeletec             K   s   | j d||f| d S )Nr   )r   )r   r   r   ry   r   r   r   setsyncdeletee  s    zdnskey.setsyncdeletec             C   sR   |d ks| j |krd S | jd kr0| j | _|| _ n| j|krHd | _|| _ n|| _ d S )N)rY   rb   )r   rY   r   r   r   setttlh  s    

zdnskey.setttlc             C   s   | j r
dS dS )NKSKZSK)rT   )r   r   r   r   keytypet  s    zdnskey.keytypec             C   s   d| j | j | jf S )Nz
%s/%s/%05d)rB   r   rD   )r   r   r   r   __str__w  s    zdnskey.__str__c             C   s"   d| j | j | j| jrdndf S )Nz%s/%s/%05d (%s)r   r   )rB   r   rD   rT   )r   r   r   r   __repr__{  s    zdnskey.__repr__c             C   s   | j  p| j p| j S )N)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 | j |j k S )N)rB   rC   r   )r   otherr   r   r   __lt__  s
    zdnskey.__lt__c             C   s   dd }|s|}t tj }| j }| j }|s4dS |sT||krP|dt|   dS ||krh||krhdS ||kr|dt| tj| jpdf  dS ||k r|dt|   dS | jd k	r|| | jk r|d	t| tj| jpdf  dS dS )
Nc              _   s   d S )Nr   )argsry   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   durationrY   )r   outputr   r   ar~   r   r   r   check_prepub  s<    zdnskey.check_prepubc             C   s   dd }|d kr|}|d kr"| j }|d kr>|dt|   d}tj }| j }| j }|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j|f  dS dS )Nc              _   s   d S )Nr   )r   ry   r   r   r   r     s    z"dnskey.check_postpub.<locals>.noopz"WARNING: Key %s using default TTL.<      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.i  iQ )rY   r   r   r}   r   r   r   )r   r   Ztimespanr   r   dir   r   r   check_postpub  s:    zdnskey.check_postpubc             C   sz   | sd S ddddddg}g }xR|D ]J}| |d  | |d   }} |dkr"|j d||d |dkrbdndf  q"W dj|S ) Nyearr   r   im  month   dayhourminutesecondr4   r   z%d %s%ssrE   z, i  iQ 3)r   r   i  iQ  ' )r   r   i  Q )r   r     )r   r   )r   r   )r   r4   )r   rv   )r   Zunitsr   Zunitvr   r   r   r     s    
(zdnskey.duration)	r   r   r   r   r   r   r   r   r   )	Nr   r   r   r   r    Nr!   r"   )Nr#   r$   r%   r&   r'   r(   r)   r*   Nr+   Nr,   r-   r.   r/   r0   )NN)NN)N)N)NN)2r   r   r   __doc__rf   rt   r   r   r:   r   classmethodr   r   staticmethodr   r   r   r   rg   ri   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sb       
M%* 


1
-r   )	r;   r   r   
subprocessr   r   rx   r   r   r   r   r   r   <module>   s
   