o
    x[hü  ã                
   @   sô   U d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ d	Zd
ZdZe e¡ZddgedgdœZeed< dedede
deddf
dd„Zdd„ Zd#dedee fdd„Zdd„ Zdd „ Z d!d"„ Z!dS )$z"Write Files: write arbitrary filesé    N)ÚOptional)Ú
url_helperÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚPER_INSTANCEi¤  Fz
text/plainÚcc_write_filesÚallÚwrite_files)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmetaÚnameÚcfgÚcloudÚargsÚreturnc                 C   sP   |  dg ¡}dd„ |D ƒ}|st d| ¡ d S t |j¡}t| ||jj|ƒ d S )Nr   c                 S   s   g | ]}t  |d t¡s|‘qS )Údefer)r   Úget_cfg_option_boolÚDEFAULT_DEFER)Ú.0Úf© r   úA/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.pyÚ
<listcomp>$   s    ýÿzhandle.<locals>.<listcomp>zESkipping module named %s, no/empty 'write_files' key in configuration)	ÚgetÚLOGÚdebugr   Úfetch_ssl_detailsÚpathsr   ÚdistroÚdefault_owner)r   r   r   r   Ú	file_listÚfiltered_filesÚssl_detailsr   r   r   Úhandle"   s   þýr(   c                 C   sf   | sd} |   ¡  ¡ } | dv rdgS | dv rddgS | dv r dgS | tkr'tgS | r0t d| t¡ tgS )NÚ )ÚgzÚgzipúapplication/x-gzip)z	gz+base64zgzip+base64zgz+b64zgzip+b64úapplication/base64)Úb64Úbase64z%Unknown encoding type %s, assuming %s)ÚlowerÚstripÚTEXT_PLAIN_ENCr   Úwarning)Úencoding_typer   r   r   Úcanonicalize_extraction4   s$   ýr5   Úownerr'   c              	   C   sì   |sd S t |ƒD ]k\}}| d¡}|st d|d | ¡ qtj |¡}t| dd ¡|| dd ¡| dd ¡ƒ}|d u rDt d|d | ¡ qt 	| d|¡¡\}}	t
| d	¡tƒ}
t |d
¡r_dnd}tj||||
||	d� t |||	¡ qd S )NÚpathz3No path provided to write for entry %s in module %sé   ÚsourceÚcontentÚencodingz>No content could be loaded for entry %s in module %s; skippingr6   ÚpermissionsÚappendÚabÚwb)ÚomodeÚmodeÚuserÚgroup)Ú	enumerater   r   r3   Úosr7   ÚabspathÚread_url_or_decoder   Úextract_usergroupÚdecode_permsÚDEFAULT_PERMSr   Ú
write_fileÚchownbyname)r   Úfilesr6   r'   ÚiÚf_infor7   ÚcontentsÚuÚgÚpermsr@   r   r   r   r   M   sB   
ý


üüÿßc                 C   s¦   | d u r|S zt | ttfƒrt| ƒW S tt| ƒdƒW S  ttfyR   g }| |fD ]}z	| d| ¡ W q) tyD   | d| ¡ Y q)w tjdg|¢R Ž  | Y S w )Né   z%oz%rz0Undecodable permissions %s, returning default %s)	Ú
isinstanceÚintÚfloatÚstrÚ	TypeErrorÚ
ValueErrorr=   r   r3   )ÚpermÚdefaultÚrepsÚrr   r   r   rI   u   s"   
ÿørI   c                 C   s¢   | d u rd n|   dd ¡}t|ƒ}|d u r|sdS d }|r@ztj||   dd ¡dd|d�j}W n ty?   t td|¡ d}Y nw |d urO|sOt	|ƒ}t
||ƒ}|S )NÚurir)   Úheadersé   )r`   ÚretriesÚsec_betweenr'   zVFailed to retrieve contents from source "%s"; falling back to data from "contents" keyF)r   Úboolr   Úread_file_or_urlrP   Ú	Exceptionr   Úlogexcr   r5   Úextract_contents)r9   r'   r:   r;   ÚurlÚuse_urlÚresultÚextractionsr   r   r   rG   Š   s8   
ûúüù

rG   c                 C   sJ   | }|D ]}|dkrt j|ddd�}q|dkrt |¡}q|tkr"	 q|S )Nr,   F)ÚquietÚdecoder-   )r   Údecomp_gzipr/   Ú	b64decoder2   )rP   Úextraction_typesrk   Útr   r   r   rh   ¯   s   €rh   )N)"Ú__doc__r/   ÚloggingrE   Útypingr   Ú	cloudinitr   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.settingsr   rJ   r   r2   Ú	getLoggerÚ__name__r   r   Ú__annotations__rX   Úlistr(   r5   Údictr   rI   rG   rh   r   r   r   r   Ú<module>   s2   
ü(%