U
    ¯Adð  ã                   @   sv   d dl 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	 e 
e¡ZdZe d¡ZdZd	ZG d
d„ dejƒZdS )é    N)Úhandlers)Úlog)ÚmergersÚsafeyamlÚutil)Ú
PER_ALWAYSz
Merge-Typezdict(replace)+list()+str()z#cloud-configz#cloud-config-jsonpc                   @   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   sF   t jj| tdd d | _| d¡| _d|kr<| |d ¡| _g | _d S )Né   )ÚversionZcloud_configZcloud_config_path)r   ÚHandlerÚ__init__r   Ú	cloud_bufZ	get_ipathÚcloud_fnÚ
file_names)ÚselfÚpathsZ_kwargs© r   úA/usr/lib/python3/dist-packages/cloudinit/handlers/cloud_config.pyr   1   s    zCloudConfigPartHandler.__init__c                 C   s¢   | j s
d S g }| jrT| dt| jƒ ¡ | jD ]}|s:d}| d| ¡ q.| d¡ | jd k	r„tdg}| |¡ | t | j¡¡ ng }t	 
| j d |¡d¡ d S )Nz# from %s filesú?z# %sÚ Ú
i€  )r   r   ÚappendÚlenr   ÚCLOUD_PREFIXÚextendr   Údumpsr   Z
write_fileÚjoin)r   Z
file_linesÚfnÚlinesr   r   r   Ú_write_cloud_config9   s$    


þ
z*CloudConfigPartHandler._write_cloud_configc           
      C   s„   d}t dt  fD ]}| |d¡}|r|} q.qt |¡}|d krHtdƒ‚t |¡}t |¡}g }	|	 |¡ |	 |¡ |	s|t	}	||	fS )Nr   zX-%szempty cloud config)
ÚMERGE_HEADERÚgetr   Z	load_yamlÚ
ValueErrorr   Zdict_extract_mergersÚstring_extract_mergersr   ÚDEF_MERGERS)
r   ÚpayloadÚheadersZmerge_header_headersÚhZtmp_hÚpayload_yamlZmergers_yamlZmergers_headerZall_mergersr   r   r   Ú_extract_mergersQ   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)Zin_place)Úlstripr   Zstrip_prefix_suffixÚJSONP_PREFIXÚ	jsonpatchZ	JsonPatchZfrom_stringÚLOGÚdebugZapplyr   )r   r%   Zpatchr   r   r   Ú_merge_patchh   s
    z#CloudConfigPartHandler._merge_patchc                 C   s:   |   ||¡\}}t d|¡ t |¡}| | j|¡| _d S )NzMerging by applying %s)r)   r.   r/   r   Z	constructÚmerger   )r   r%   r&   r(   Z
my_mergersZmergerr   r   r   Ú_merge_parts   s    
z"CloudConfigPartHandler._merge_partc                 C   s   g | _ d | _d S )N)r   r   )r   r   r   r   Ú_resety   s    zCloudConfigPartHandler._resetc           	   
   C   sð   |t jkr|  ¡  d S |t jkr4|  ¡  |  ¡  d S zf| jd ksF| jsLi | _|t jt krf|  	|¡ n|  
||¡ dD ]}| |d¡}qv| j | ¡ ¡ W nP tk
rÊ } zt d||¡ W 5 d }~X Y n" tk
rê   t td|¡ Y nX d S )N)r   úú	ú z2Failed at merging in cloud config part from %s: %sz.Failed at merging in cloud config part from %s)r   ZCONTENT_STARTr3   ZCONTENT_ENDr   r   r   ZINCLUSION_TYPES_MAPr,   r0   r2   Úreplacer   Ústripr"   r.   ZwarningÚ	Exceptionr   Zlogexc)	r   ÚdataZctypeÚfilenamer%   Z	frequencyr&   ÚiÚerrr   r   r   Úhandle_part}   s8    

ý  ÿz"CloudConfigPartHandler.handle_partN)Ú__name__Ú
__module__Ú__qualname__r   r,   Úprefixesr   r   r)   r0   r2   r3   r>   r   r   r   r   r   ,   s   r   )r-   Z	cloudinitr   r   Zloggingr   r   r   Zcloudinit.settingsr   Z	getLoggerr?   r.   r    r#   r$   r   r,   r   r   r   r   r   r   Ú<module>   s   

