U
    L¬÷d  ã                   @   sz   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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-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|kr<| |d ¡| _g | _g | _d S )Né   )ÚversionZcloud_configZcloud_config_path)	r   ÚHandlerÚ__init__r   Ú	cloud_bufZ	get_ipathÚcloud_fnÚ
file_namesÚerror_file_names)ÚselfÚpathsZ_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rT| dt| jƒ ¡ | jD ]}|s:d}| d| ¡ q.| d¡ | jD ]}| t› |› ¡ qZ| 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   ÚMERGED_PART_SCHEMA_ERROR_PREFIXr   ÚCLOUD_PREFIXÚextendr   Údumpsr   Z
write_fileÚjoin)r   Z
file_linesÚfnZ
error_fileÚlinesr   r   r   Ú_write_cloud_config<   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_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)Zin_place)Úlstripr   Zstrip_prefix_suffixÚJSONP_PREFIXÚ	jsonpatchZ	JsonPatchZfrom_stringÚLOGÚdebugZapplyr   )r   r'   Zpatchr   r   r   Ú_merge_patchm   s
    z#CloudConfigPartHandler._merge_patchc                 C   s:   |   ||¡\}}t d|¡ t |¡}| | j|¡| _d S )NzMerging by applying %s)r+   r0   r1   r   Z	constructÚmerger   )r   r'   r(   r*   Z
my_mergersZ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r4|  ¡  |  ¡  d S zf| jd ksF| jsLi | _|t jt krf|  	|¡ n|  
||¡ dD ]}| |d¡}qv| j | ¡ ¡ W n` tk
rÚ } z"| j | ¡ ¡ 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_STARTr5   ZCONTENT_ENDr!   r   r   ZINCLUSION_TYPES_MAPr.   r2   r4   Úreplacer   Ústripr$   r   r0   ZwarningÚ	Exceptionr   Zlogexc)	r   ÚdataZctypeÚfilenamer'   Z	frequencyr(   ÚiÚerrr   r   r   Úhandle_part‚   s:    

ý  ÿz"CloudConfigPartHandler.handle_partN)Ú__name__Ú
__module__Ú__qualname__r   r.   Úprefixesr   r!   r+   r2   r4   r5   r@   r   r   r   r   r   .   s   	r   )r/   Z	cloudinitr   r   Zloggingr   r   r   Zcloudinit.settingsr   Z	getLoggerrA   r0   r"   r%   r&   r   r.   r   r   r   r   r   r   r   Ú<module>   s   

