a '¡DgÀ9ã@søddlZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z ddlmZmZe e¡Ze jZe jZe jZdZd d gZd d gZd gZd ZdZdZgd¢ZdZdgZ dd„Z!dd„Z"ddd„Z#Gdd„dƒZ$dd„Z%efdd„Z&dS)éN)ÚMIMEBase)Ú MIMEMultipart)ÚMIMENonMultipart)ÚMIMEText)ÚfeaturesÚhandlersÚutil)ÚUrlErrorÚread_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||=|||<dS©N©)ÚmsgÚkeyÚvaluer r ú7/usr/lib/python3.9/site-packages/cloudinit/user_data.pyÚ_replace_header;srcCs|d=|jddt|ƒd�dS)NzContent-DispositionZ attachment)Úfilename)Ú add_headerÚstr)r rr r rÚ _set_filename@srcCs tjrt|ƒ|‚n t |¡dSr )rZERROR_ON_USER_DATA_FAILUREÚ RuntimeErrorÚLOGZwarning)Ú error_messageZsource_exceptionr r rÚ _handle_errorEs rc@s^eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z ddd„Z dd„Z dS)ÚUserDataProcessorcCs||_t |¡|_dSr )ÚpathsrZfetch_ssl_detailsÚ ssl_details)Úselfrr r rÚ__init__MszUserDataProcessor.__init__cCs@tƒ}t|tƒr,|D]}| t|ƒ|¡qn| t|ƒ|¡|Sr )rÚ isinstanceÚlistÚ _process_msgÚconvert_string)rZblobZaccumulating_msgÚbr r rÚprocessQs  zUserDataProcessor.processc Csªdd„}| ¡D�]’}t|ƒr qd}| ¡}t |¡}d}|tvr¬ztj|dd�}d}d}WnNtjyª} z4d |t |ƒ| ¡} t | | ƒWYd} ~ qWYd} ~ n d} ~ 00|s´t }|t dgvrÊ||ƒ}|durÖ|}|�rF|  dd ¡\} } t| | ƒ} |  |¡| ¡�rt| | ¡ƒd D]$}||v�rt| |t||ƒƒ�q| }||k�r\t|t|ƒ|tv�rt| ||¡q|tv�rŒ| ||¡qt|t|ƒ| ||¡qdS) NcSs t |¡Sr )rÚtype_from_starts_with)Úpayloadr r rÚ find_ctype[sz2UserDataProcessor._process_msg..find_ctypeF)ÚquietTz| d¡}WntyRYn0|dur`|}|durl|}|dur¤z| dtt |ƒƒ¡Wnt t fy¢Yn0dS)Nr+T©Údecodeú launch-index) Úgetr.ÚEXAMINE_FOR_LAUNCH_INDEXrÚ load_yamlZ get_payloadÚ ExceptionrrÚintÚ ValueErrorÚ TypeError)rr Z header_idxZ payload_idxr&r r rÚ_attach_launch_indexªs$   z&UserDataProcessor._attach_launch_indexcCs&t |dd¡}tj |j d¡d|¡S)NZmd5é@ÚdataZurlcache)rZ hash_blobÚosÚpathÚjoinrZ get_ipath_cur)rÚentryZentry_fnr r rÚ_get_include_once_filenameÂsÿz,UserDataProcessor._get_include_once_filenamecCs$| ¡st|t|ƒ| |¡dSr )r7rÚ PART_FN_TPLrN)rr Z attached_idr r rÚ_process_before_attachÈsz(UserDataProcessor._process_before_attachc Cs´d}| ¡D�] }| ¡}| d¡r>|tdƒd… ¡}d}n"| d¡r`|tdƒd… ¡}d}| d¡rlq | ¡}|szq d}d}|r�| |¡}|r¬tj  |¡r¬t   |¡}næzZt |dd|j d�}|rÞ| ¡rÞt j||jd d �| ¡rî|j}nd  ||j¡} t| ƒWnŠt�yV} z6t| ƒ} || v�r8| d  |¡7} t| | ƒWYd} ~ nDd} ~ 0t�y�} 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 {})Ú splitlinesÚlowerÚ startswithr2ÚlstripÚstriprUrQrRÚisfilerZload_text_filer rÚokZ write_fileÚcontentsr1Úcoderr rÚIOErrorr"r!)rÚcontentr>Zinclude_once_onÚlineZlc_lineZ include_urlZinclude_once_fnZresprZurleÚmessageZioeZnew_msgr r rr:Ísf     ü ÿþÿ  ÿ zUserDataProcessor._do_includec CsLtj|gttfd�}|D�],}t|tƒr0d|i}t|tƒsÚentriesZentrgZmtyperjrArBr Ú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¡| |¡| ||d¡dS)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|tƒr&| 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)rrÚencoderr0r^Zmessage_from_stringrE)Úraw_datar€r�Zbdatar 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: