3 \me9@sddlZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z ddlmZmZejeZe jZe jZe jZdZd d gZd d gZd gZd ZdZdZddddddddgZdZdgZ ddZ!ddZ"d%ddZ#Gdd d Z$d!d"Z%efd#d$Z&dS)&N)MIMEBase) MIMEMultipart)MIMENonMultipart)MIMEText)featureshandlersutil)UrlErrorread_file_or_urlz Content-Typez text/plainztext/x-not-multipartztext/x-include-urlztext/x-include-once-urlztext/cloud-config-archiveztext/cloud-configzapplication/octet-streamzapplication/gzipzapplication/gzip-compressedzapplication/gzippedzapplication/x-compresszapplication/x-compressedzapplication/x-gunzipzapplication/x-gzipzapplication/x-gzip-compressedzNumber-AttachmentscCs||=|||<dS)N)msgkeyvaluer r /usr/lib/python3.6/user_data.py_replace_header;srcCs|d=|jddt|ddS)NzContent-DispositionZ attachment)filename) add_headerstr)r rr r r _set_filename@srcCs tjrt||n tj|dS)N)rZERROR_ON_USER_DATA_FAILURE RuntimeErrorLOGZwarning) error_messageZsource_exceptionr r r _handle_errorEs rc@s^eZdZddZddZddZddZd d Zd d Zd dZ ddZ dddZ ddZ dS)UserDataProcessorcCs||_tj||_dS)N)pathsrZfetch_ssl_details ssl_details)selfrr r r__init__MszUserDataProcessor.__init__cCsDt}t|tr0x.|D]}|jt||qWn|jt|||S)N)r isinstancelist _process_msgconvert_string)rZblobZaccumulating_msgbr r rprocessQs   zUserDataProcessor.processcCsdd}x|jD]}t|r$qd}|j}tj|}d}|tkrytj|dd}d}d}WnBtjk r} z$dj|t || } t | | wWYdd} ~ XnX|st }|t dgkr||}|dkr|}|rB|j dd \} } t| | } | j||jrt| |jx,d D]$}||krt| |t||qW| }||krXt|t||tkrp|j||q|tkr|j||qt|t||j||qWdS) NcSs tj|S)N)rtype_from_starts_with)payloadr r r find_ctype[sz2UserDataProcessor._process_msg..find_ctypeF)quietTz|jd}Wntk rTYnX|dk rb|}|dkrn|}|dk ry|jdtt |Wnt t fk rYnXdS)Nz Launch-IndexT)decodez launch-index) getr-EXAMINE_FOR_LAUNCH_INDEXr load_yamlZ get_payload Exceptionrrint ValueError TypeError)rr Z header_idxZ payload_idxr%r r r_attach_launch_indexs$  z&UserDataProcessor._attach_launch_indexcCs&tj|dd}tjj|jjdd|S)NZmd5@dataZurlcache)rZ hash_blobospathjoinrZ get_ipath_cur)rentryZentry_fnr r r_get_include_once_filenamesz,UserDataProcessor._get_include_once_filenamecCs$|jst|t||j|dS)N)r6r PART_FN_TPLrK)rr Z attached_idr r r_process_before_attachsz(UserDataProcessor._process_before_attachcCsd}x|jD]}|j}|jdrB|tddj}d}n"|jdrd|tddj}d}|jdrpq|j}|s~qd}d}|r|j|}|rtjj |rt j |}nyZt |dd|j d}|r|jrt j||jd d |jr|j}nd j||j} t| Wntk rX} z0t| } || kr>| d j|7} t| | WYdd} ~ Xn:tk r} zd j|| } t| | WYdd} ~ XnX|dk rt|} |j| |qWdS)NFz #include-onceTz#include# )ZtimeoutZretriesri)modez6Fetching from {} resulted in a invalid http code of {}z for url: {0}zFetching from {} resulted in {}) splitlineslower startswithr1lstripstriprRrNrOisfilerZ load_filer rokZ write_filecontentsr0coderr rIOErrorr!r )rcontentr=Zinclude_once_onlineZlc_lineZ include_urlZinclude_once_fnZresprZurlemessageZioeZnew_msgr r rr9s\          zUserDataProcessor._do_includec CsZtj|gttfd}x>|D]4}t|tr4d|i}t|ts@q|jdd}|jd}|sxt}t|t rlt }t j ||}|j dd\}} |dkrt|t r|j}t|| d} nt|| } | j|d |krt| |d d |kr| jd t|d xNt|jD]>} | jdd dd d tjtjfkr0q| j| || qW|j|| qWdS) N)defaultZallowedrctyper(r)text)Z_subtyperz launch-indexz Launch-Indexzcontent-disposition)rrFrsetrrdictrDARCHIVE_UNDEF_TYPEbytesARCHIVE_UNDEF_BINARY_TYPErr$r4rCrrr5rrkeysrZATTACHMENT_FIELDr7r<) rarchiver=ZentriesZentrcZmtyperfr@rAr headerr r rr;sH         z"UserDataProcessor._explode_archiveNc Cslt|krd|t<|dk r(t|tt|d}yt|jt}Wn(ttfk rft|tt|YnX|S)z Return the number of attachments to this MIMEMultipart by looking at its 'Number-Attachments' header. 0Nr)rprrrHrDrIrJ)r outer_msgZ new_countZ fetched_countr r r_multi_part_countFsz#UserDataProcessor._multi_part_countcCs8|j|}|j||d|j||j||ddS)z 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. r)N)rurTZattach)rrtr>Z part_countr r rr<Xs  zUserDataProcessor._attach_part)N) __name__ __module__ __qualname__rr#r rKrRrTr9r;rur<r r r rrLs PE4 rcCs |jp d}|jdkrdSdS)NrgZ multipartTF)Zget_content_maintyperZ)r>Z part_maintyper r rr,ds  r,cCsl|sd}dd}t|tr&|jd}n|}tj|dd}d|dd jkr^tj|jd}n |||}|S) zJconvert a string (more likely bytes) or a message into a mime message.cSs(|jdd\}}t||}|j||S)Nr(r))r4rr5)rM content_typer@rAr r r r create_binmsgss  z%convert_string..create_binmsgzutf-8F)rCs mime-version:ri)rrencoderr/rZZmessage_from_stringrC)Zraw_datarzr{Zbdatar r r rr!ms   r!)N)'ZloggingrNZemail.mime.baserZemail.mime.multipartrZemail.mime.nonmultipartrZemail.mime.textrZ cloudinitrrrZcloudinit.url_helperr r Z getLoggerrvrZNOT_MULTIPART_TYPErSZ OCTET_TYPEr7r3r8r:r2rlrnr.rprErrrrr,r!r r r r sH