
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼meº9  ã               @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZ e jeƒZejZejZejZdZd	d
gZddgZdgZd	ZdZdZddddddddgZdZdgZ dd„ Z!dd„ Z"d%dd„Z#G dd „ d ƒZ$d!d"„ Z%efd#d$„Z&dS )&é    N)ÚMIMEBase)ÚMIMEMultipart)ÚMIMENonMultipart)ÚMIMEText)ÚfeaturesÚhandlersÚutil)ÚUrlErrorÚread_file_or_urlzContent-Typez
text/plainztext/x-not-multipartztext/x-include-urlztext/x-include-once-urlztext/cloud-config-archiveztext/cloud-configzapplication/octet-streamzapplication/gzipzapplication/gzip-compressedzapplication/gzippedzapplication/x-compresszapplication/x-compressedzapplication/x-gunzipzapplication/x-gzipzapplication/x-gzip-compressedzNumber-Attachmentsc             C   s   | |= || |< d S )N© )ÚmsgÚkeyÚvaluer   r   ú/usr/lib/python3.6/user_data.pyÚ_replace_header;   s    r   c             C   s   | d= | j ddt|ƒd� d S )NzContent-DispositionZ
attachment)Úfilename)Ú
add_headerÚstr)r   r   r   r   r   Ú_set_filename@   s    r   c             C   s    t jrt| ƒ|‚n
tj| ƒ d S )N)r   ZERROR_ON_USER_DATA_FAILUREÚRuntimeErrorÚLOGZwarning)Úerror_messageZsource_exceptionr   r   r   Ú_handle_errorE   s    r   c               @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
ddd„Zdd„ ZdS )ÚUserDataProcessorc             C   s   || _ tj|ƒ| _d S )N)Úpathsr   Zfetch_ssl_detailsÚssl_details)Úselfr   r   r   r   Ú__init__M   s    zUserDataProcessor.__init__c             C   sD   t ƒ }t|tƒr0x.|D ]}| jt|ƒ|ƒ qW n| jt|ƒ|ƒ |S )N)r   Ú
isinstanceÚlistÚ_process_msgÚconvert_string)r   ZblobZaccumulating_msgÚbr   r   r   ÚprocessQ   s    

zUserDataProcessor.processc             C   s¨  dd„ }�x˜|j ƒ D �]Š}t|ƒr$qd }|jƒ }tj|ƒ}d}|tkr¤ytj|dd�}d }d}W nB tjk
r¢ }	 z$dj|t	|ƒ|	ƒ}
t
|
|	ƒ wW Y d d }	~	X nX |s¬t}|tdg krÂ||ƒ}|d krÎ|}|�rB|jdd	ƒ\}}t||ƒ}|j|ƒ |jƒ �rt||jƒ ƒ x,dD ]$}||k�rt||t|| ƒƒ �qW |}||k�rXt|t|ƒ |tk�rp| j||ƒ q|tk�rˆ| j||ƒ qt|t|ƒ | j||ƒ qW d S )Nc             S   s
   t j| ƒS )N)r   Útype_from_starts_with)Úpayloadr   r   r   Ú
find_ctype[   s    z2UserDataProcessor._process_msg.<locals>.find_ctypeF)ÚquietTz<Failed decompressing payload from {} of length {} due to: {}ztext/x-shellscriptú/é   úLaunch-Index)r*   )ÚwalkÚis_skippableÚget_content_typer   Zfully_decoded_payloadÚDECOMP_TYPESÚdecomp_gzipZDecompressionErrorÚformatÚlenr   Ú
UNDEF_TYPEÚTYPE_NEEDEDÚsplitr   Úset_payloadÚget_filenamer   r   r   ÚCONTENT_TYPEÚINCLUDE_TYPESÚ_do_includeÚARCHIVE_TYPESÚ_explode_archiveÚ_attach_part)r   Zbase_msgÚ
append_msgr&   ÚpartZctypeZ
ctype_origr%   Zwas_compressedÚer   ÚmaintypeÚsubtypeZn_partÚhr   r   r   r    Z   sX    









zUserDataProcessor._process_msgc             C   s¬   |j dd ƒ}d }|jƒ tkrVy$tj|jdd�ƒ}|r>|j dƒ}W n tk
rT   Y nX |d k	rb|}|d krn|}|d k	r¨y|jdtt	|ƒƒƒ W n t
tfk
r¦   Y nX d S )NzLaunch-IndexT)Údecodezlaunch-index)Úgetr-   ÚEXAMINE_FOR_LAUNCH_INDEXr   Ú	load_yamlZget_payloadÚ	Exceptionr   r   ÚintÚ
ValueErrorÚ	TypeError)r   r   Z
header_idxZpayload_idxr%   r   r   r   Ú_attach_launch_indexª   s$    z&UserDataProcessor._attach_launch_indexc             C   s&   t j|ddƒ}tjj| jjdƒd|ƒS )NZmd5é@   ÚdataZurlcache)r   Z	hash_blobÚosÚpathÚjoinr   Zget_ipath_cur)r   ÚentryZentry_fnr   r   r   Ú_get_include_once_filenameÂ   s    z,UserDataProcessor._get_include_once_filenamec             C   s$   |j ƒ st|t| ƒ | j|ƒ d S )N)r6   r   ÚPART_FN_TPLrK   )r   r   Zattached_idr   r   r   Ú_process_before_attachÈ   s    z(UserDataProcessor._process_before_attachc             C   s¶  d}�xª|j ƒ D �]œ}|jƒ }|jdƒrB|tdƒd … jƒ }d}n"|jdƒrd|tdƒd … jƒ }d}|jdƒrpq|jƒ }|s~qd }d }|r”| j|ƒ}|r°tjj	|ƒr°t
j|ƒ}nâyZt|dd| jd�}|râ|jƒ rât
j||jd	d
� |jƒ rò|j}ndj||jƒ}	t|	ƒ W n† tk
�rX }
 z0t|
ƒ}||k�r>|dj|ƒ7 }t||
ƒ W Y d d }
~
X n: tk
�r� } zdj||ƒ}	t|	|ƒ W Y d d }~X nX |d k	rt|ƒ}| j||ƒ qW d S )NFz#include-onceTz#includeú#é   é
   )ZtimeoutZretriesr   i€  )Úmodez6Fetching from {} resulted in a invalid http code of {}z for url: {0}zFetching from {} resulted in {})Ú
splitlinesÚlowerÚ
startswithr1   ÚlstripÚstriprR   rN   rO   Úisfiler   Z	load_filer
   r   ÚokZ
write_fileÚcontentsr0   Úcoder   r	   r   ÚIOErrorr!   r    )r   Úcontentr=   Zinclude_once_onÚlineZlc_lineZinclude_urlZinclude_once_fnZrespr   ZurleÚmessageZioeZnew_msgr   r   r   r9   Í   s\    






zUserDataProcessor._do_includec          
   C   sZ  t j|g ttfd�}�x>|D �]4}t|tƒr4d|i}t|tƒs@q|jddƒ}|jdƒ}|sxt}t|t	ƒrlt
}tj||ƒ}|jddƒ\}}	|dkr°t|t	ƒr¢|jƒ }t||	d�}
nt||	ƒ}
|
j|ƒ d	|krÚt|
|d	 ƒ d
|krö|
jdt|d
 ƒƒ xNt|jƒ ƒD ]>}|jƒ dd	dd
dtjƒ tjƒ fk�r0�q|
j||| ƒ �qW | j||
ƒ qW d S )N)ÚdefaultZallowedrc   Ú Útyper(   r)   Útext)Z_subtyper   zlaunch-indexzLaunch-Indexzcontent-disposition)r   rF   r   Úsetr   r   ÚdictrD   ÚARCHIVE_UNDEF_TYPEÚbytesÚARCHIVE_UNDEF_BINARY_TYPEr   r$   r4   rC   r   r   r5   r   r   ÚkeysrZ   ÚATTACHMENT_FIELDr7   r<   )r   Úarchiver=   ZentriesZentrc   Zmtyperf   r@   rA   r   Úheaderr   r   r   r;     sH    






z"UserDataProcessor._explode_archiveNc             C   sl   t |krd|t < |dk	r(t|t t|ƒƒ d}yt|jt ƒƒ}W n( ttfk
rf   t|t t|ƒƒ Y nX |S )z
        Return the number of attachments to this MIMEMultipart by looking
        at its 'Number-Attachments' header.
        Ú0Nr   )rp   r   r   rH   rD   rI   rJ   )r   Ú	outer_msgZ	new_countZfetched_countr   r   r   Ú_multi_part_countF  s    z#UserDataProcessor._multi_part_countc             C   s8   | j |ƒ}| j||d ƒ |j|ƒ | j ||d ƒ dS )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)ru   rT   Zattach)r   rt   r>   Z
part_countr   r   r   r<   X  s    

zUserDataProcessor._attach_part)N)Ú__name__Ú
__module__Ú__qualname__r   r#   r    rK   rR   rT   r9   r;   ru   r<   r   r   r   r   r   L   s   	PE4
r   c             C   s    | j ƒ p
d}|jƒ dkrdS dS )Nrg   Z	multipartTF)Zget_content_maintyperZ   )r>   Zpart_maintyper   r   r   r,   d  s    r,   c             C   sl   | sd} dd„ }t | tƒr&| jdƒ}n| }tj|dd�}d|dd	… jƒ kr^tj|jdƒƒ}n
|||ƒ}|S )
zJconvert a string (more likely bytes) or a message into
    a mime message.ó    c             S   s(   |j ddƒ\}}t||ƒ}|j| ƒ |S )Nr(   r)   )r4   r   r5   )rM   Úcontent_typer@   rA   r   r   r   r   Úcreate_binmsgs  s    

z%convert_string.<locals>.create_binmsgzutf-8F)rC   s   mime-version:r   i   )r   r   Úencoder   r/   rZ   Zmessage_from_stringrC   )Zraw_datarz   r{   Zbdatar   r   r   r   r!   m  s    

r!   )N)'ZloggingrN   Zemail.mime.baser   Zemail.mime.multipartr   Zemail.mime.nonmultipartr   Zemail.mime.textr   Z	cloudinitr   r   r   Zcloudinit.url_helperr	   r
   Z	getLoggerrv   r   ZNOT_MULTIPART_TYPErS   Z
OCTET_TYPEr7   r3   r8   r:   r2   rl   rn   r.   rp   rE   r   r   r   r   r,   r!   r   r   r   r   Ú<module>   sH   

  	