a 'Dg9@sddlZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z ddlmZmZeeZe jZe jZe jZdZd d gZd d gZd gZd ZdZdZgdZdZdgZ ddZ!ddZ"dddZ#GdddZ$ddZ%efddZ&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-stream)zapplication/gzipzapplication/gzip-compressedzapplication/gzippedzapplication/x-compresszapplication/x-compressedzapplication/x-gunzipzapplication/x-gzipzapplication/x-gzip-compressedzNumber-AttachmentscCs||=|||<dSN)msgkeyvaluer r 7/usr/lib/python3.9/site-packages/cloudinit/user_data.py_replace_header;srcCs|d=|jddt|ddS)NzContent-DispositionZ attachment)filename) add_headerstr)r rr r r _set_filename@srcCs tjrt||n t|dSr )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||_t||_dSr )pathsrZfetch_ssl_details ssl_details)selfrr r r__init__MszUserDataProcessor.__init__cCs@t}t|tr,|D]}|t||qn|t|||Sr )r isinstancelist _process_msgconvert_string)rZblobZaccumulating_msgbr r rprocessQs  zUserDataProcessor.processc Csdd}|D]}t|r qd}|}t|}d}|tvrztj|dd}d}d}WnNtjy} z4d|t || } t | | WYd} ~ qWYd} ~ n d} ~ 00|st }|t dgvr||}|dur|}|rF| dd \} } t| | } | ||rt| |d D]$}||vrt| |t||q| }||kr\t|t||tvrt|||q|tvr|||qt|t||||qdS) NcSs t|Sr )rtype_from_starts_with)payloadr r r find_ctype[sz2UserDataProcessor._process_msg..find_ctypeF)quietTz|d}WntyRYn0|dur`|}|durl|}|durz|dtt |Wnt t fyYn0dS)Nr+Tdecode 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&t|dd}tj|jdd|S)NZmd5@dataZurlcache)rZ hash_blobospathjoinrZ get_ipath_cur)rentryZentry_fnr r r_get_include_once_filenamesz,UserDataProcessor._get_include_once_filenamecCs$|st|t|||dSr )r7r PART_FN_TPLrN)rr Z attached_idr r r_process_before_attachsz(UserDataProcessor._process_before_attachc Csd}|D]}|}|dr>|tdd}d}n"|dr`|tdd}d}|drlq |}|szq d}d}|r||}|rtj |rt |}nzZt |dd|j d}|r|rt j||jd d |r|j}nd ||j} t| WntyV} z6t| } || vr8| d |7} t| | WYd} ~ nDd} ~ 0ty} z"d || } t| | WYd} ~ n d} ~ 00|dur t|} || |q dS)NFz #include-onceTz#include# )timeoutZretriesri)modez6Fetching from {} resulted in a invalid http code of {}z for url: {0}zFetching from {} resulted in {}) splitlineslower startswithr2lstripstriprUrQrRisfilerZload_text_filer rokZ write_filecontentsr1coderr rIOErrorr"r!)rcontentr>Zinclude_once_onlineZlc_lineZ include_urlZinclude_once_fnZresprZurlemessageZioeZnew_msgr r rr:sf         zUserDataProcessor._do_includec CsLtj|gttfd}|D],}t|tr0d|i}t|tsentriesZentrgZmtyperjrArBr headerr r rr<sJ           z"UserDataProcessor._explode_archiveNc Csjt|vrd|t<|dur(t|tt|d}zt|t}Wn&ttfydt|tt|Yn0|S)z Return the number of attachments to this MIMEMultipart by looking at its 'Number-Attachments' header. 0Nr)rurrrKrGrLrM)r outer_msgZ new_countZ fetched_countr r r_multi_part_countFsz#UserDataProcessor._multi_part_countcCs8||}|||d|||||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)r{rWZattach)rrzr?Z part_countr r rr=Xs  zUserDataProcessor._attach_part)N) __name__ __module__ __qualname__rr$r!rNrUrWr:r<r{r=r r r rrLs PE4 rcCs |p d}|dkrdSdS)NrlZ multipartTF)Zget_content_maintyper^)r?Z part_maintyper r rr-ds  r-cCsl|sd}dd}t|tr&|d}n|}tj|dd}d|dd vr^t|d}n |||}|S) zJconvert a string (more likely bytes) or a message into a mime message.cSs(|dd\}}t||}|||S)Nr)r*)r5rr6)rP content_typerArBr r r r create_binmsgss  z%convert_string..create_binmsgzutf-8FrDs mime-version:ri)rrencoderr0r^Zmessage_from_stringrE)raw_datarrZbdatar r r rr"ms   r")N)'ZloggingrQZemail.mime.baserZemail.mime.multipartrZemail.mime.nonmultipartrZemail.mime.textrZ cloudinitrrrZcloudinit.url_helperr r Z getLoggerr|rZNOT_MULTIPART_TYPErVZ OCTET_TYPEr8r4r9r;r3rqrsr/rurHrrrrr-r"r r r r s: