
"·T`d  ã               @   s{   d  Z  d d l m Z d d l m Z d d l Z e j e ƒ Z d d „  Z	 d d d	 „ Z
 d
 d „  Z d d d „ Z d S)z0gpg.py - Collection of gpg key related functionsé    )Úlog)ÚsubpNc             C   ss   y+ t  j  d d d |  g d d ƒ\ } } WnA t  j k
 rn } z t j d |  | ƒ d } WYd d } ~ Xn X| S)z*Export gpg key, armoured key gets returnedÚgpgz--exportz--armourÚcaptureTz&Failed to export armoured key "%s": %sN)r   ÚProcessExecutionErrorÚLOGÚdebug)ÚkeyÚarmourÚ_Úerror© r   ú//usr/lib/python3/dist-packages/cloudinit/gpg.pyÚexport_armour   s    r   é   c       	       C   sG  t  j d |  | ƒ d d d | d |  g } | d k r> g  } d } d } t | ƒ } xê | d 7} y1 t j | d	 d
 ƒt  j d |  | | ƒ d SWn. t j k
 rÄ } z | } WYd d } ~ Xn Xy3 t | ƒ } t  j d | j | ƒ t j | ƒ WqY t	 k
 r>} z$ t
 d |  | | | f ƒ | ‚ WYd d } ~ XqY XqY Wd S)aÁ  Receive gpg key from the specified keyserver.

    Retries are done by default because keyservers can be unreliable.
    Additionally, there is no way to determine the difference between
    a non-existant key and a failure.  In both cases gpg (at least 2.2.4)
    exits with status 2 and stderr: "keyserver receive failed: No data"
    It is assumed that a key provided to cloud-init exists on the keyserver
    so re-trying makes better sense than failing.

    @param key: a string key fingerprint (as passed to gpg --recv-keys).
    @param keyserver: the keyserver to request keys from.
    @param retries: an iterable of sleep lengths for retries.
                    Use None to indicate no retries.z&Importing key '%s' from keyserver '%s'r   z--no-ttyz--keyserver=%sz--recv-keysNr   r   r   Tz/Imported key '%s' from keyserver '%s' on try %dz6Import failed with exit code %d, will try again in %ssz@Failed to import key '%s' from keyserver '%s' after %d tries: %s)r   r   Úiterr   r   ÚnextZ	exit_codeÚtimeZsleepÚStopIterationÚ
ValueError)	r	   Ú	keyserverZretriesÚcmdZtrynumr   ZsleepsÚeZnaplenr   r   r   Úrecv_key   s6    
	r   c             C   sh   y& t  j  d d d d |  g d d ƒWn; t  j k
 rc } z t j d |  | ƒ WYd d } ~ Xn Xd S)	z0Delete the specified key from the local gpg ringr   z--batchz--yesz--delete-keysr   TzFailed delete key "%s": %sN)r   r   r   Zwarning)r	   r   r   r   r   Ú
delete_keyI   s
    r   zkeyserver.ubuntu.comc             C   sp   t  |  ƒ } | sl zL y  t |  d | ƒt  |  ƒ } Wn% t k
 r\ t j d |  ƒ ‚  Yn XWd t |  ƒ X| S)zget gpg keyid from keyserverr   zFailed to obtain gpg key %sN)r   r   r   r   Z	exceptionr   )Zkeyidr   r
   r   r   r   Ú
getkeybyidR   s    r   )r   r   )Ú__doc__Z	cloudinitr   Zloggingr   r   Z	getLoggerÚ__name__r   r   r   r   r   r   r   r   r   Ú<module>   s   +	