
`c           @   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.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR      s    (   t   __name__t
   __module__R   (    (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR      s   t   dnskeyc           B   s  e  Z d  Z dG Z dI Z dJ Z dH dH d  Z d    Z d!   Z	 e
 dH dH d"   Z d#   Z e d$    Z e d%    Z dH d&  Z e d'    Z e d(    Z e d)    Z e d*    Z d+   Z d,   Z d-   Z d.   Z 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' e j   d=  Z( d>   Z) d?   Z* d@   Z+ dA   Z, dB   Z- dC   Z. dH dD  Z/ dH dH dE  Z0 e dF    Z1 RS(K   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   ECDSAP384SHA384t   ED25519t   ED448c      	   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.   /usr/lib/python2.7/site-packages/isc/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   inR9   R:   (&   t   endswitht   rstripR(   R*   t   sept   keystrR2   R/   R3   R4   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   R2   R3   R4   R1   R@   R?   t   key_filet   private_filet   kfpt   linet   tokenst   septokent   pfpt   ct   punctuationt   post   foundR   R   t   t(    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR)   5   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   getRE   RD   RP   RO   t   strRC   t   zipR   RU   t   _OPTSRI   RJ   RL   R(   R?   t   joinR    R   t   communicatet	   ExceptionRM   RN   (   R   t   settime_bint   kwargsRe   t   cmdt   firstR   t   optt   deletet   whent   fullcmdt   pRh   Ri   t   e(    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   commit   s<    "	
 	c         K   s  | j  d t  } | d d | d t |  g } | rI | d | g 7} n  | r_ | j d  n  | rx | 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
   \ } } | rjt d t |    n  y3 | j   d j d  } t | | |  } | SWn) t k
 r} t d t |    n Xd  S(   NRe   s   -qs   -Ks   -Ls   -rs   -fks   -as   -bs   -Ps   -As   # Rg   Rh   Ri   s   unable to generate key: i    t   asciis!   unable to parse generated key: %s(   Rj   RE   Rk   t   appendR   t   timefromepochRW   Rn   R    R   Ro   Rp   t
   splitlinest   decode(   t   clst
   keygen_bint	   randomdevt   keys_dirR2   R3   t   keysizeR>   RC   t   publisht   activateRr   Re   t
   keygen_cmdRd   Ry   Rh   Ri   R?   t   newkeyRz   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   generate   s:    c         K   sa  | j  d t  } |  j   s1 t d |    n  | d d |  j d |  j g } |  j rt | d t |  j  g 7} n  | r | d | g 7} n  | r | d t |  g 7} n  | s d	 d
 j |  GHn  t	 | d t
 d t
 } | j   \ } }	 |	 r
t d |	   n  y9 | j   d j d  }
 t |
 |  j |  j  } | SWn t d |    n Xd  S(   NRe   s'   predecessor key %s has no inactive dates   -qs   -Ks   -Ss   -Ls   -rs   -is   # Rg   Rh   Ri   s   unable to generate key: i    R|   s'   unable to generate successor for key %s(   Rj   RE   t   inactiveRp   R(   R?   RC   Rk   Rn   R    R   Ro   R   R   R   (   R   R   R   t
   prepublishRr   Re   R   Ry   Rh   Ri   R?   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   generate_successor   s,    	c         C   sC   d  } |  t t t j   k r1 t j |  } n  | r; | Sd |  S(   Ns   %03d(   RO   t   rangeR'   R   t	   _ALGNAMES(   R3   R2   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   algstr   s    c         C   sC   |  s
 d  S|  j   }  y t j j |   SWn t k
 r> d  SXd  S(   N(   RO   t   upperR   R   t   indext
   ValueError(   R3   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   algnum   s    c         C   s   |  j  | p |  j  S(   N(   R   R3   (   R   R3   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   algname  s    c         C   s   t  j |   S(   N(   t   timet   gmtime(   t   secs(    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR~     s    c         C   s   t  j |  d  S(   Ns   %Y%m%d%H%M%S(   R   t   strptime(   t   string(    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyRV     s    c         C   s   t  j |   S(   N(   t   calendart   timegm(   Rd   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyRX     s    c         C   s   t  j d |   S(   Ns   %Y%m%d%H%M%S(   R   t   strftime(   Rd   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyRW     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(   Rj   RE   RM   RN   RO   R   RD   RI   RJ   RK   RL   R~   RW   (   R   R   R   t   nowRr   R   Rd   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setmeta  s$    &c         C   s   |  j  | S(   N(   RK   (   R   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   gettime2  s    c         C   s   |  j  | S(   N(   RL   (   R   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt
   getfmttime5  s    c         C   s   |  j  | S(   N(   RM   (   R   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   gettimestamp8  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   created;  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   syncpublish>  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setsyncpublishA  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR   D  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt
   setpublishG  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR   J  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setactivateM  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   revokeP  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt	   setrevokeS  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR   V  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setinactiveY  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyRv   \  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt	   setdelete_  s    c         C   s   |  j  d S(   NR   (   RM   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt
   syncdeleteb  s    c         K   s   |  j  d | | |  d  S(   NR   (   R   (   R   R   R   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setsyncdeletee  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(   RO   RC   RP   (   R   RC   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   setttlh  s    	c         C   s   |  j  r d Sd S(   Nt   KSKt   ZSK(   R>   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   keytypet  s    c         C   s   d |  j  |  j   |  j f S(   Ns
   %s/%s/%05d(   R2   R   R4   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   __str__w  s    c         C   s/   d |  j  |  j   |  j |  j r' d n d f S(   Ns   %s/%s/%05d (%s)R   R   (   R2   R   R4   R>   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   __repr__{  s    c         C   s"   |  j    p! |  j   p! |  j   S(   N(   R   R   R   (   R   (    (    s.   /usr/lib/python2.7/site-packages/isc/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(   R2   R3   R   (   R   t   other(    (    s.   /usr/lib/python2.7/site-packages/isc/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   argsRr   (    (    s.   /usr/lib/python2.7/site-packages/isc/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   RE   t   reprRD   R   t   durationRC   RO   (   R   t   outputR   R   t   aRy   (    (    s.   /usr/lib/python2.7/site-packages/isc/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   Rr   (    (    s.   /usr/lib/python2.7/site-packages/isc/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.(
   RO   RC   R   Rv   R   RE   R   RD   R   R   (   R   R   t   timespanR   R   t   dt   i(    (    s.   /usr/lib/python2.7/site-packages/isc/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   sR5   s   , i  iQ i3i  iQ i ' i  iQ i  (   R   i<   (   R   i   (   RO   R}   Rn   (   R   t   unitsR   t   unitt   v(    (    s.   /usr/lib/python2.7/site-packages/isc/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    R!   R"   (2   R	   R
   t   __doc__RU   RO   Rm   R   R   R)   R{   t   classmethodR   R   t   staticmethodR   R   R   R~   RV   RX   RW   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   Rv   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyR      sb       	M	%*	 
																		1)(    (	   R*   R   R   t
   subprocessR    R   Rp   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/isc/dnskey.pyt   <module>   s
   