
TҏZc           @   sg   d  d l  Z  d  d l Z d  d l Z d  d l m Z m Z d e f d     YZ d d d     YZ d S(   iN(   t   Popent   PIPEt   TimePastc           B   s   e  Z d    Z RS(   c         C   s'   t  t |   j d | | | f  d  S(   Ns'   %s time for key %s (%d) is already past(   t   superR   t   __init__(   t   selft   keyt   propt   value(    (    s   ./dnskey.pyR      s    (   t   __name__t
   __module__R   (    (    (    s   ./dnskey.pyR      s   t   dnskeyc           B   s  e  Z d  Z dE Z dG Z dH Z dF dF d  Z d   Z d   Z	 e
 dF dF d    Z d!   Z e d"    Z e d#    Z dF d$  Z e d%    Z e d&    Z e d'    Z e d(    Z d)   Z d*   Z d+   Z d,   Z d-   Z d.   Z e j   d/  Z d0   Z e j   d1  Z d2   Z e j   d3  Z  d4   Z! e j   d5  Z" d6   Z# e j   d7  Z$ d8   Z% e j   d9  Z& d:   Z' e j   d;  Z( d<   Z) d=   Z* d>   Z+ d?   Z, d@   Z- dA   Z. dF dB  Z/ dF dF dC  Z0 e dD    Z1 RS(I   st   An individual DNSSEC key.  Identified by path, name, algorithm, keyid.
    Contains a dictionary of metadata events.t   Createdt   Publisht   Activatet   Inactivet   Deletet   Revoket	   DSPublisht   SyncPublisht
   SyncDeletes   -Ps   -As   -Is   -Ds   -Rs   -Psyncs   -Dsynct   RSAMD5t   DHt   DSAt   ECCt   RSASHA1t   NSEC3DSAt   NSEC3RSASHA1t	   RSASHA256t	   RSASHA512t   ECCGOSTt   ECDSAP256SHA256t   ECDSAP384SHA384c      	   C   s   t  | t  rX t |  d k rX | p* d |  _ | \ } } } |  j | | | |  n  | ps t j j |  ps d |  _ t j j |  } | j	 d  \ } } } | d d !} t
 |  } t
 | j	 d  d  } |  j | | | |  d  S(   Ni   t   .t   +i   ii    (   t
   isinstancet   tuplet   lent   _dirt	   fromtuplet   ost   patht   dirnamet   basenamet   splitt   int(   R   R   t	   directoryt   keyttlt   namet   algt   keyid(    (    s   ./dnskey.pyR   +   s    !!c         C   s  | j  d  r' | } | j d  } n
 | d } d | | | f } |  j |  j r\ t j p_ d | d } |  j |  j r t j p d | d } | |  _ | |  _ t |  |  _ t |  |  _	 | |  _
 t | d  }	 x |	 D] }
 |
 d d k r q n  |
 j   } | sq n  | d	 j   d k r=d } | |  _ n% d } | sYt | d	  n | |  _ t | |  d	 @d	 k rt |  _ q t |  _ q W|	 j   t | d  } t   |  _ t   |  _ t   |  _ t   |  _ t   |  _ t   |  _ t   |  _ d  |  _ x | D] }
 |
 j   }
 |
 s|
 d d k rAqn  g  d D] } |
 j |  ^ qHt |
  g } t g  | D] } | d k rz| ^ qz } |
 |  j   } |
 | j  d  j   } | |  j | <qWx t! j" D] } t |  j | <| |  j k rg|  j# |  j |  } | |  j | <|  j$ |  |  j | <|  j% |  |  j | <|  j | |  j | <qd  |  j | <d  |  j | <d  |  j | <d  |  j | <qW| j   d  S(   NR!   s   K%s+%03d+%05dt    s   .keys   .privatet   ri    t   ;i   t   int   cht   hsi   i   t   rUs   !#s   := i(   s   inR7   R8   (&   t   endswitht   rstripR&   R(   t   sept   keystrR0   R-   R1   R2   t   fullnamet   openR,   t   lowert   ttlt   Truet   Falset   closet   dictt   metadatat   _changedt   _deletet   _timest   _fmttimet   _timestampst	   _originalt   Nonet   _origttlt   stript   findR%   t   mint   lstripR   t   _PROPSt	   parsetimet
   formattimet   epochfromtime(   R   R0   R1   R2   R/   R>   R=   t   key_filet   private_filet   kfpt   linet   tokenst   septokent   pfpt   ct   punctuationt   post   foundR   R   t   t(    (    s   ./dnskey.pyR'   :   sv    
''			
	/+c         K   s  | j  d t  } g  } t } |  j d  k	 rI | d t |  j  g 7} n  x t t j	 t j
  D] \ } } | s_ |  j | r q_ n  t } | |  j k r |  j | r t } n  | r d n
 |  j | }	 | | |	 g 7} t } q_ W| r| d |  j g | |  j g }
 | s%d d j |
  GHn  yI t |
 d t d t } | j   \ } } | rmt t |    n  Wn/ t k
 r} t d	 | t |  f   n Xd  |  _ x5 t j	 D]' } |  j | |  j | <t |  j | <qWn  d  S(
   Nt   quiets   -Lt   nones   -Ks   # t    t   stdoutt   stderrs   unable to run %s: %s(   t   getRC   RB   RN   RM   t   strRA   t   zipR   RS   t   _OPTSRG   RH   RJ   R&   R=   t   joinR    R   t   communicatet	   ExceptionRK   RL   (   R   t   settime_bint   kwargsRc   t   cmdt   firstR   t   optt   deletet   whent   fullcmdt   pRf   Rg   t   e(    (    s   ./dnskey.pyt   commit   s<    "	
 	c
         K   s  |
 j  d t  } | d d | d t |  g } | rF | j d  n  | r_ | d | g 7} n  | r~ | d t |  g 7} n  | r t j |  } | d t j |  g 7} n  |	 r t j |	  } | d	 t j |	  g 7} n  | j |  | sd
 d j |  GHn  t | d t	 d t	 } | j
   \ } } | rQt d t |    n  y3 | j   d j d  } t | | |  } | SWn) t k
 r} t d t |    n Xd  S(   NRc   s   -qs   -Ks   -Ls   -fks   -as   -bs   -Ps   -As   # Re   Rf   Rg   s   unable to generate key: i    t   asciis!   unable to parse generated key: %s(   Rh   RC   Ri   t   appendR   t   timefromepochRU   Rl   R    R   Rm   Rn   t
   splitlinest   decode(   t   clst
   keygen_bint   keys_dirR0   R1   t   keysizeR<   RA   t   publisht   activateRp   Rc   t
   keygen_cmdRb   Rw   Rf   Rg   R=   t   newkeyRx   (    (    s   ./dnskey.pyt   generate   s6    c   
      K   s   | j  d t  } |  j   s1 t d |    n  | d d |  j d |  j g } |  j rt | d t |  j  g 7} n  | s d d j |  GHn  t	 | d	 t
 d
 t
 } | j   \ } } | r t d |   n  y0 | j   d } t | |  j |  j  }	 |	 SWn t d |    n Xd  S(   NRc   s'   predecessor key %s has no inactive dates   -qs   -Ks   -Ss   -Ls   # Re   Rf   Rg   s   unable to generate key: i    s'   unable to generate successor for key %s(   Rh   RC   t   inactiveRn   R&   R=   RA   Ri   Rl   R    R   Rm   R}   R   (
   R   R   Rp   Rc   R   Rw   Rf   Rg   R=   R   (    (    s   ./dnskey.pyt   generate_successor   s$    	c         C   sC   d  } |  t t t j   k r1 t j |  } n  | r; | Sd |  S(   Ns   %03d(   RM   t   rangeR%   R   t	   _ALGNAMES(   R1   R0   (    (    s   ./dnskey.pyt   algstr   s    c         C   sC   |  s
 d  S|  j   }  y t j j |   SWn t k
 r> d  SXd  S(   N(   RM   t   upperR   R   t   indext
   ValueError(   R1   (    (    s   ./dnskey.pyt   algnum   s    c         C   s   |  j  | p |  j  S(   N(   R   R1   (   R   R1   (    (    s   ./dnskey.pyt   algname   s    c         C   s   t  j |   S(   N(   t   timet   gmtime(   t   secs(    (    s   ./dnskey.pyR|     s    c         C   s   t  j |  d  S(   Ns   %Y%m%d%H%M%S(   R   t   strptime(   t   string(    (    s   ./dnskey.pyRT     s    c         C   s   t  j |   S(   N(   t   calendart   timegm(   Rb   (    (    s   ./dnskey.pyRV     s    c         C   s   t  j d |   S(   Ns   %Y%m%d%H%M%S(   R   t   strftime(   Rb   (    (    s   ./dnskey.pyRU     s    c         K   sL  | j  d t  } |  j | | k r) d  S|  j | d  k	 rr |  j | | k  rr | rr t |  | |  j |   n  | d  k r |  j | d  k r t n t |  j | <t |  j | <d  |  j | <d  |  j	 | <d  |  j
 | <d  S|  j |  } | |  j | <| |  j	 | <|  j |  |  j
 | <|  j | |  j | k r;t n t |  j | <d  S(   Nt   force(   Rh   RC   RK   RL   RM   R   RB   RG   RH   RI   RJ   R|   RU   (   R   R   R   t   nowRp   R   Rb   (    (    s   ./dnskey.pyt   setmeta  s$    &c         C   s   |  j  | S(   N(   RI   (   R   R   (    (    s   ./dnskey.pyt   gettime.  s    c         C   s   |  j  | S(   N(   RJ   (   R   R   (    (    s   ./dnskey.pyt
   getfmttime1  s    c         C   s   |  j  | S(   N(   RK   (   R   R   (    (    s   ./dnskey.pyt   gettimestamp4  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyt   created7  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyt   syncpublish:  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt   setsyncpublish=  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyR   @  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt
   setpublishC  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyR   F  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt   setactivateI  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyt   revokeL  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt	   setrevokeO  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyR   R  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt   setinactiveU  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyRt   X  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt	   setdelete[  s    c         C   s   |  j  d S(   NR   (   RK   (   R   (    (    s   ./dnskey.pyt
   syncdelete^  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rp   (    (    s   ./dnskey.pyt   setsyncdeletea  s    c         C   sw   | d  k s |  j | k r d  S|  j d  k rF |  j |  _ | |  _ n- |  j | k rj d  |  _ | |  _ n	 | |  _ d  S(   N(   RM   RA   RN   (   R   RA   (    (    s   ./dnskey.pyt   setttld  s    	c         C   s   |  j  r d Sd S(   Nt   KSKt   ZSK(   R<   (   R   (    (    s   ./dnskey.pyt   keytypep  s    c         C   s   d |  j  |  j   |  j f S(   Ns
   %s/%s/%05d(   R0   R   R2   (   R   (    (    s   ./dnskey.pyt   __str__s  s    c         C   s/   d |  j  |  j   |  j |  j r' d n d f S(   Ns   %s/%s/%05d (%s)R   R   (   R0   R   R2   R<   (   R   (    (    s   ./dnskey.pyt   __repr__w  s    c         C   s"   |  j    p! |  j   p! |  j   S(   N(   R   R   R   (   R   (    (    s   ./dnskey.pyt   date|  s    c         C   sZ   |  j  | j  k r" |  j  | j  k  S|  j | j k rD |  j | j k  S|  j   | j   k  S(   N(   R0   R1   R   (   R   t   other(    (    s   ./dnskey.pyt   __lt__  s
    c         C   sK  d   } | s | } n  t  t j    } |  j   } |  j   } | sL t S| sy | | k ru | d t |    n  t S| | k r | | k r t S| | k r | d t |   t j |  j	  p d f  t S| | k  r | d t |    t S|  j	 d  k	 rG| | |  j	 k  rG| d t |   t j |  j	  p;d f  t St S(   Nc          _   s   d  S(   N(    (   t   argsRp   (    (    s   ./dnskey.pyt   noop  s    sF   WARNING: Key %s is scheduled for
	 activation but not for publication.s   WARNING: %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.s   one DNSKEY TTLs0   WARNING: Key %s is active before it is publisheds   WARNING: 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   RC   t   reprRB   R   t   durationRA   RM   (   R   t   outputR   R   t   aRw   (    (    s   ./dnskey.pyt   check_prepub  s<    			"	c         C   s  d   } | d  k r | } n  | d  k r6 |  j } n  t j   } |  j   } |  j   } | sd t S| s | | k r | d t |    n  t S| | k  r | | k  r t S| | k  r | d t |    t S| | | k  r| d t |   t j	 |  f  t St S(   Nc          _   s   d  S(   N(    (   R   Rp   (    (    s   ./dnskey.pyR     s    sE   WARNING: Key %s is scheduled for
	 deletion but not for inactivation.s@   WARNING: Key %s is scheduled for
	 deletion before inactivation.s   WARNING: 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.(
   RM   RA   R   Rt   R   RC   R   RB   R   R   (   R   R   t   timespanR   R   t   dt   i(    (    s   ./dnskey.pyt   check_postpub  s4    		c         C   s   |  s
 d  Sd d f d d f d d f d d f d d g } g  } xj | D]b } |  | d |  | d } }  | d k rG | j d | | d | d k r d n d f  qG qG Wd j |  S(   Nt   yeari<   i   im  t   monthi   t   dayt   hourt   minutet   secondi   i    s   %d %s%st   sR3   s   , i  iQ i3i  iQ i ' i  iQ i  (   R   i<   (   R   i   (   RM   R{   Rl   (   R   t   unitsR   t   unitt   v(    (    s   ./dnskey.pyR     s    					7(	   s   Createds   Publishs   Activates   Inactives   Deletes   RevokeR   s   SyncPublishs
   SyncDeleteN(	   Ns   -Ps   -As   -Is   -Ds   -RNs   -Psyncs   -Dsync(   NR   R   R   R   R   R   R   R   NR   NR   R   R    (2   R	   R
   t   __doc__RS   RM   Rk   R   R   R'   Ry   t   classmethodR   R   t   staticmethodR   R   R   R|   RT   RV   RU   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   Rt   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s   ./dnskey.pyR      sb       	M	%'	
																		1)(    (	   R(   R   R   t
   subprocessR    R   Rn   R   R   (    (    (    s   ./dnskey.pyt   <module>   s
   