o
    ¦®ØfÞ  ã                   @   sn   d dl Z d dlZd dlmZmZmZmZ d dlmZ e  	e
¡ZdZe d¡ZdZdZdZG d	d
„ d
ejƒZdS )é    N)ÚhandlersÚmergersÚsafeyamlÚutil)Ú
PER_ALWAYSz
Merge-Typezdict(replace)+list()+str()z#cloud-configz#cloud-config-jsonpz*# Cloud-config part ignored SCHEMA_ERROR: c                   @   sL   e Zd ZeegZdd„ Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚCloudConfigPartHandlerc                 K   sL   t jj| tdd d | _| d¡| _d|v r| |d ¡| _g | _g | _d S )Né   )ÚversionÚcloud_configÚcloud_config_path)	r   ÚHandlerÚ__init__r   Ú	cloud_bufÚ	get_ipathÚcloud_fnÚ
file_namesÚerror_file_names)ÚselfÚpathsÚ_kwargs© r   úA/usr/lib/python3/dist-packages/cloudinit/handlers/cloud_config.pyr   3   s   
zCloudConfigPartHandler.__init__c                 C   sÀ   | j sd S g }| jr*| dt| jƒ ¡ | jD ]}|sd}| d| ¡ q| d¡ | jD ]}| t› |› ¡ q-| jd urQtdg}| |¡ | t	 
| j¡¡ ng }t | j d |¡d¡ d S )Nz# from %s filesú?z# %sÚ Ú
i€  )r   r   ÚappendÚlenr   ÚMERGED_PART_SCHEMA_ERROR_PREFIXr   ÚCLOUD_PREFIXÚextendr   Údumpsr   Ú
write_fileÚjoin)r   Ú
file_linesÚfnÚ
error_fileÚlinesr   r   r   Ú_write_cloud_config<   s(   



þ
z*CloudConfigPartHandler._write_cloud_configc           
      C   s„   d}t dt  fD ]}| |d¡}|r|} nqt |¡}|d u r$tdƒ‚t |¡}t |¡}g }	|	 |¡ |	 |¡ |	s>t	}	||	fS )Nr   zX-%szempty cloud config)
ÚMERGE_HEADERÚgetr   Ú	load_yamlÚ
ValueErrorr   Údict_extract_mergersÚstring_extract_mergersr   ÚDEF_MERGERS)
r   ÚpayloadÚheadersÚmerge_header_headersÚhÚtmp_hÚpayload_yamlÚmergers_yamlÚmergers_headerÚall_mergersr   r   r   Ú_extract_mergersV   s$   þ




z'CloudConfigPartHandler._extract_mergersc                 C   sD   |  ¡ }tj|td}tj |¡}t d|¡ |j	| j
dd| _
d S )N)Úprefixz!Merging by applying json patch %sF)Úin_place)Úlstripr   Ústrip_prefix_suffixÚJSONP_PREFIXÚ	jsonpatchÚ	JsonPatchÚfrom_stringÚLOGÚdebugÚapplyr   )r   r/   Úpatchr   r   r   Ú_merge_patchm   s
   z#CloudConfigPartHandler._merge_patchc                 C   s:   |   ||¡\}}t d|¡ t |¡}| | j|¡| _d S )NzMerging by applying %s)r8   rA   rB   r   Ú	constructÚmerger   )r   r/   r0   r4   Ú
my_mergersÚmergerr   r   r   Ú_merge_partx   s   
z"CloudConfigPartHandler._merge_partc                 C   s   g | _ d | _d S )N)r   r   )r   r   r   r   Ú_reset~   s   
zCloudConfigPartHandler._resetc           	   
   C   s  |t jkr|  ¡  d S |t jkr|  ¡  |  ¡  d S z4| jd u s#| js&i | _|t jt kr3|  	|¡ n|  
||¡ dD ]}| |d¡}q;| j | ¡ ¡ W d S  typ } z| j | ¡ ¡ t d||¡ W Y d }~d S d }~w ty€   t td|¡ Y d S w )N)r   úú	ú z2Failed at merging in cloud config part from %s: %sz.Failed at merging in cloud config part from %s)r   ÚCONTENT_STARTrK   ÚCONTENT_ENDr'   r   r   ÚINCLUSION_TYPES_MAPr=   rE   rJ   Úreplacer   Ústripr+   r   rA   ÚwarningÚ	Exceptionr   Úlogexc)	r   ÚdataÚctypeÚfilenamer/   Ú	frequencyr0   ÚiÚerrr   r   r   Úhandle_part‚   s:   

ý€
ÿÿz"CloudConfigPartHandler.handle_partN)Ú__name__Ú
__module__Ú__qualname__r   r=   Úprefixesr   r'   r8   rE   rJ   rK   r]   r   r   r   r   r   .   s    	r   )Úloggingr>   Ú	cloudinitr   r   r   r   Úcloudinit.settingsr   Ú	getLoggerr^   rA   r(   r-   r.   r   r=   r   r   r   r   r   r   r   Ú<module>   s   


