3 \me@srdZddlZddlZddlmZejeZdddddgZd d Z d d Z dddZ dddZ ddZ dddZdS)z0gpg.py - Collection of gpg key related functionsN)subpgpgz--with-fingerprintz--no-default-keyringz --list-keysz --keyringcCsZytjddd|gdd\}}Wn6tjk rT}ztjd||d}WYdd}~XnX|S)z*Export gpg key, armoured key gets returnedrz--exportz--armourT)capturez&Failed to export armoured key "%s": %sN)rProcessExecutionErrorLOGdebug)keyarmour_errorr /usr/lib/python3.6/gpg.py export_armoursrcCstjddg|ddjS)z~Dearmor gpg key, dearmored key gets returned note: man gpg(1) makes no mention of an --armour spelling, only --armor rz --dearmorF)datadecode)rstdout)rr r r dearmor'srFcCsNg}|jt|s|jd|j|tj|dd\}}|rJtjd|||S)zList keys from a keyring with fingerprints. Default to a stable machine parseable format. @param key_file: a string containing a filepath to a key @param human_output: return output intended for human parsing z --with-colonsT)rz&Failed to export armoured key "%s": %s)extendGPG_LISTappendrrwarning)Zkey_fileZ human_outputcmdrstderrr r r list/s   rc Cstjd||ddd|d|g}|dkr,g}d}d}t|}x|d7}y"tj|d d tjd |||dStjk r}z |}WYdd}~XnXy&t|}tjd |j|tj|Wq>t k r}zt d ||||f|WYdd}~Xq>Xq>WdS)aReceive 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'rz--no-ttyz--keyserver=%sz --recv-keysNrrT)rz/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) rriterrrnextZ exit_codetimeZsleep StopIteration ValueError) r keyserverZretriesrZtrynumr ZsleepseZnaplenr r r recv_keyBs>r"cCsTytjdddd|gddWn2tjk rN}ztjd||WYdd}~XnXdS) z0Delete the specified key from the local gpg ringrz--batchz--yesz --delete-keysT)rzFailed delete key "%s": %sN)rrrr)rr r r r delete_keyss r#keyserver.ubuntu.comcCs\t|}|sXz@yt||dt|}Wn"tk rHtjd|YnXWdt|X|S)zget gpg keyid from keyserver)r zFailed to obtain gpg key %sN)rr"rrZ exceptionr#)Zkeyidr r r r r getkeybyid}s     r%)Frr)r&)r$)__doc__ZloggingrZ cloudinitrZ getLogger__name__rrrrrr"r#r%r r r r s     1