�
oB�]c@soddlZddlmZddlmZddlmZddlmZddl Z ddl
mZddl
mZ
ddlmZmZdd l
mZe
je�ZejZejZejZd
ZddgZd
dgZdgZdZdZdZddddddddgZdZ dgZ!d�Z"d�Z#de$fd��YZ%d�Z&ed �Z'dS(!i����N(tMIMEBase(t
MIMEMultipart(tMIMENonMultipart(tMIMEText(thandlers(tlog(tread_file_or_urltUrlError(tutilsContent-Types
text/plainstext/x-not-multipartstext/x-include-urlstext/x-include-once-urlstext/cloud-config-archivestext/cloud-configsapplication/octet-streamsapplication/gzipsapplication/gzip-compressedsapplication/gzippedsapplication/x-compresssapplication/x-compressedsapplication/x-gunzipsapplication/x-gzipsapplication/x-gzip-compressedsNumber-AttachmentscCs||=|||<dS(N((tmsgtkeytvalue((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt_replace_header?scCs'|d=|jdddt|��dS(NsContent-Dispositiont
attachmenttfilename(t
add_headertstr(R R((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt
_set_filenameDs tUserDataProcessorcBseeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d
d�Zd �ZRS(cCs||_tj|�|_dS(N(tpathsRtfetch_ssl_detailstssl_details(tselfR((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt__init__Ks cCs\t�}t|t�rBx=|D]}|jt|�|�qWn|jt|�|�|S(N(Rt
isinstancetlistt_process_msgtconvert_string(Rtblobtaccumulating_msgtb((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pytprocessOs
cCs*d�}x|j�D]}t|�r.qnd}|j�}tj|�}t}|tkr�y%tj|dt�}d}t }Wq�tj
k
r�} tjd|t
|�| �qq�Xn|s�t}n|tkr�||�}n|dkr|}n|r�|jdd�\}
}t|
|�}|j|�|j�r\t||j��nx7dD]/}
|
|krct||
t||
��qcqcW|}n||kr�t|t|�n|tkr�|j||�qn|tkr|j||�qnt|t|�|j||�qWdS(NcSs
tj|�S(N(Rttype_from_starts_with(tpayload((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt
find_ctypeZstquiets<Failed decompressing payload from %s of length %s due to: %st/isLaunch-Index(sLaunch-Index(twalktis_skippabletNonetget_content_typeRtfully_decoded_payloadtFalsetDECOMP_TYPEStdecomp_gziptTruetDecompressionErrortLOGtwarningtlent
UNDEF_TYPEtTYPE_NEEDEDtsplitRtset_payloadtget_filenameRRRtCONTENT_TYPEt
INCLUDE_TYPESt_do_includet
ARCHIVE_TYPESt_explode_archivet_attach_part(Rtbase_msgt
append_msgR"tparttctypet
ctype_origR!twas_compressedtetmaintypetsubtypetn_partth((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyRXsV
! cCs�|jdd�}d}|j�tkrxy7tj|jdt��}|r`|jd�}nWqxtk
rtqxXn|dk r�|}n|dkr�|}n|dk r�y |j dt
t|���Wq�tt
fk
r�q�XndS(NsLaunch-Indextdecodeslaunch-index(tgetR'R(tEXAMINE_FOR_LAUNCH_INDEXRt load_yamltget_payloadR-t ExceptionRRtintt
ValueErrort TypeError(RR t
header_idxtpayload_idxR!((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt_attach_launch_index�s$
cCs7tj|dd�}tjj|jjd�d|�S(Ntmd5i@tdataturlcache(Rt hash_blobtostpathtjoinRt
get_ipath_cur(Rtentrytentry_fn((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt_get_include_once_filename�scCs1|j�s t|t|�n|j|�dS(N(R6RtPART_FN_TPLRS(RR tattached_id((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt_process_before_attach�sc
Cs&t}x|j�D]}|j�}|jd�rS|td�j�}t}n.|jd�r�|td�j�}t}n|jd�r�qn|j�}|s�qnd}d}|r�|j |�}n|r�t
jj|�r�t
j|�}n�y�t|ddddd|j�}|rN|j�rNt
j||jd d
�n|j�rf|j}ntjd||j�Wnstk
r�} t| �}
||
kr�|
dj|�7}
ntj|
�n&tk
r�}tjd
||�nX|dk rt|�}|j||�qqWdS(Ns
#include-onces#includet#ttimeoutitretriesi
Rtmodei�s6Fetching from %s resulted in a invalid http code of %ss
for url: {0}sFetching from %s resulted in %s(R*t
splitlinestlowert
startswithR1tlstripR-tstripR'R^RXRYtisfileRt load_fileRRtokt
write_filetcontentsR/R0tcodeRRtformattIOErrorRR(
RtcontentR>tinclude_once_ontlinetlc_linetinclude_urltinclude_once_fntrespturletmessagetioetnew_msg((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyR9�sR
c
Cstj|dgdttf�}x�|D]�}t|tj�rPi|d6}nt|t�seq(n|jdd�}|jd�}|s�t }t|tj
�r�t}ntj
||�}n|jdd�\}} |dkrt|tj
�r|j�}nt|d | �}
nt|| �}
|
j|�d
|krXt|
|d
�nd|kr�|
jdt|d��nxgt|j��D]S}|j�dd
ddd
tj�tj�fkr�q�n|
j|||�q�W|j||
�q(WdS(NtdefaulttallowedRstttypeR$ittextt_subtypeRslaunch-indexsLaunch-Indexscontent-disposition(RRKRtsetRtsixtstring_typestdictRItARCHIVE_UNDEF_TYPEtbinary_typetARCHIVE_UNDEF_BINARY_TYPERR R4RHRRR5RRRtkeysRgtATTACHMENT_FIELDR7R<(RtarchiveR>tentriestentRstmtypeR~RDRER theader((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyR;�s@!
cCs�t|krd|t<n|dk r>t|tt|��nd}yt|jt��}Wn-ttfk
r�t|tt|��nX|S(s
Return the number of attachments to this MIMEMultipart by looking
at its 'Number-Attachments' header.
t0iN(R�R'RRRNRIRORP(Rt outer_msgt new_countt
fetched_count((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt_multi_part_count,s
cCsH|j|�}|j||d�|j|�|j||d�dS(s�
Attach a message to an outer message. outermsg must be a MIMEMultipart.
Modifies a header in the outer message to keep track of number of
attachments.
iN(R�Ratattach(RR�R?t
part_count((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyR<>s
N(
t__name__t
__module__RRRRSR^RaR9R;R'R�R<(((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyRJs I : /cCs,|j�pd}|j�dkr(tStS(NR�t multipart(tget_content_maintypeRgR-R*(R?t
part_maintype((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyR&JscCs�|sd}nd�}t|tj�r<|jd�}n|}tj|dt�}d|dd!j�kr�tj|j d��}n|||�}|S(sJconvert a string (more likely bytes) or a message into
a mime message.R�cSs8|jdd�\}}t||�}|j|�|S(NR$i(R4RR5(RUtcontent_typeRDRER ((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt
create_binmsgYs
sutf-8RHs
mime-version:ii(
RR�t text_typetencodeRR,R*Rgtmessage_from_stringRH(traw_dataR�R�tbdataR ((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyRSs ((RXtemail.mime.baseRtemail.mime.multipartRtemail.mime.nonmultipartRtemail.mime.textRR�t cloudinitRRtloggingtcloudinit.url_helperRRRt getLoggerR�R/tNOT_MULTIPART_TYPER_t
OCTET_TYPER7R3R8R:R2R�R�R+R�RJRRtobjectRR&R(((s7/usr/lib/python2.7/site-packages/cloudinit/user_data.pyt<module>sH � |