Xc@sXddlZddlZddlZddZdZdZdZdZdS(iNcCs2ddg}|dk rx|D]t}|dkr4qt|trS|j|qt|drx|j|jqtdjt|qWng}d}xIt |D];}||kr|j||fnt ||d}qW|j|dfx&|D]}t j |d|dq WdS(Niitfilenos*{0} must be an int or have a fileno methodii( tNonet isinstancetinttappendthasattrRt ValueErrortformattreprtsortedtmaxtost closerange(t except_fdstexcept_filenost except_fdt fileno_rangestnext_range_mint except_filenot fileno_range((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pyt close_all_fdss(       cCsktjddd|dddfdtj}|j\}}|jjdd d jd d jS( Ntopenssltx509s-ins -fingerprints-sha1s-noouttstdoutt=iit:t(t subprocesstPopentPIPEt communicatetstriptrsplittreplacetlower(t cert_filenameRt fingerprintt_((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pytget_cert_fingerprint9s  cCs1tj\}}tj|tj|dfS(Ntw(R tpipetfdopen(tpipe_rtpipe_w((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pytopen_pipe_fileobjsAscCs2tjdtd|f}t|_|jdS(s Start a thread that calls os.waitpid on a particular PID to prevent zombie processes from hanging around after they have finished. ttargettargsN(t threadingtThreadt _wait_for_pidtTruetdaemontstart(tpidt pid_thread((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pytwaitpid_in_threadFs cCs5|r1ytj|dWq1tk r-q1XndS(Ni(R twaitpidtOSError(R5((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pyR1Ps  ( R RR/RRR&R,R7R1(((s9/usr/lib/python2.7/site-packages/euca2ools/bundle/util.pyts