
"·T`  ã               @   s¹   d  d l  Z  d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 e j
 e ƒ Z d Z e j d	 ƒ Z d
 Z d Z Gd d „  d e j ƒ Z d S)é    N)Úhandlers)Úlog)Úmergers)Úutil)Úsafeyaml)Ú
PER_ALWAYSz
Merge-Typezdict(replace)+list()+str()z#cloud-configz#cloud-config-jsonpc               @   sp   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   sc   t  j j |  t d d ƒd  |  _ | j d ƒ |  _ d | k rV | j | d ƒ |  _ g  |  _ d  S)NÚversioné   Z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   4   s    	zCloudConfigPartHandler.__init__c             C   sá   |  j  s d  Sg  } |  j rt | j d t |  j ƒ ƒ x. |  j D]# } | sR d } | j d | ƒ q@ W| j d ƒ |  j d  k	 r¸ t d g } | j | ƒ | j t j |  j ƒ ƒ n g  } t	 j
 |  j  d j | ƒ 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_config<   s"    			z*CloudConfigPartHandler._write_cloud_configc       
      C   s£   d } x7 t  d t  g D]% } | j | d ƒ } | r | } Pq Wt j | ƒ } t j | ƒ } t j | ƒ } g  }	 |	 j | ƒ |	 j | ƒ |	 s™ t }	 | |	 f S)Nr   zX-%s)	ÚMERGE_HEADERÚgetr   Z	load_yamlr   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_mergersT   s    z'CloudConfigPartHandler._extract_mergersc             C   sb   | j  ƒ  } t j | d t ƒ} t j j | ƒ } t j d | ƒ | j	 |  j
 d d ƒ|  _
 d  S)NÚprefixz!Merging by applying json patch %sZin_placeF)Ú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   sS   |  j  | | ƒ \ } } t j d | ƒ t j | ƒ } | j |  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 |  j ƒ  d  S| t  j k rD |  j ƒ  |  j ƒ  d  Sy’ |  j d  k s` |  j ri i  |  _ | t  j t k rŒ |  j	 | ƒ n |  j
 | | ƒ x  d D] } | j | d ƒ } q£ W|  j j | j ƒ  ƒ Wn% t k
 rý t j t d | ƒ Yn Xd  S)Nr   úú	ú z.Failed at merging in cloud config part from %s)r   r3   r4   )r   ZCONTENT_STARTr2   ZCONTENT_ENDr   r   r   ZINCLUSION_TYPES_MAPr+   r/   r1   Úreplacer   ÚstripÚ	Exceptionr   Zlogexcr-   )r   ÚdataZctypeÚfilenamer$   Z	frequencyr%   Úir   r   r   Úhandle_part}   s&    


	z"CloudConfigPartHandler.handle_partN)Ú__name__Ú
__module__Ú__qualname__r   r+   Úprefixesr   r   r(   r/   r1   r2   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   