o
    f                  
   @   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   
(%