
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼meÌ  ã               @   s
  U d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ ey$d dlmZ d dlmZ dZeZW n  eefk
rš   d	ZeZY nX ejeƒZejd
ejƒZejdƒZdZG dd„ deƒZdd„ Zdd„ Z dd„ Z!ddd„Z"dd„ Z#ddd„Z$dS )é    N)ÚAny)Ú
type_utils)Úutil)Ú
write_file)ÚDebugUndefined)ÚTemplateTFz##\s*template:(.*)z)\$\{([A-Za-z0-9_.]+)\}|\$([A-Za-z0-9_.]+)zCI_MISSING_JINJA_VAR/c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚUndefinedJinjaVariablez>Class used to represent any undefined jinja template variable.c             C   s   dt | jf S )Nz%s%s)ÚMISSING_JINJA_PREFIXÚ_undefined_name)Úself© r   ú/usr/lib/python3.6/templater.pyÚ__str__2   s    zUndefinedJinjaVariable.__str__c             C   s(   t |ƒjtdƒ}tdj| j|d�ƒ‚d S )NÚ zhUndefined jinja variable: "{this}-{other}". Jinja tried subtraction. Perhaps you meant "{this}_{other}"?)ÚthisÚother)ÚstrÚreplacer	   Ú	TypeErrorÚformatr
   )r   r   r   r   r   Ú__sub__5   s    zUndefinedJinjaVariable.__sub__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   /   s   r   c                s   ‡ fdd„}t j|| ƒS )zìThis does simple replacement of bash variable like templates.

    It identifies patterns like ${a} or $a and can also identify patterns like
    ${a.b} or $a.b which will look for a key 'b' in the dictionary rooted
    by key 'a'.
    c                sº   | j dƒ}|d kr| j dƒ}|d kr,tdƒ‚tj|jdƒƒ}ˆ }xBt|ƒdkr‚|jƒ }t|tƒsxt	d|t
j|ƒ|f ƒ‚|| }qBW |jƒ }t|tƒs®t	d||t
j|ƒf ƒ‚t|| ƒS )Né   é   z,Match encountered but no valid group presentÚ.zRCan not traverse into non-dictionary '%s' of type %s while looking for subkey '%s'z<Can not extract key '%s' from non-dictionary '%s' of type %s)ÚgroupÚRuntimeErrorÚcollectionsÚdequeÚsplitÚlenÚpopleftÚ
isinstanceÚdictr   ÚtuZobj_namer   )ÚmatchÚnameÚpathZselected_paramsÚkey)Úparamsr   r   ÚreplacerG   s(    



zbasic_render.<locals>.replacer)ÚBASIC_MATCHERÚsub)Úcontentr,   r-   r   )r,   r   Úbasic_render?   s    r1   c             C   s´   dd„ }| j dƒd
kr(| jddƒ\}}n| }d}tj|ƒ}|sHdt| fS |jdƒjƒ jƒ }|dkrntd| ƒ‚|dkr�t	 r�t
jd	ƒ dt|fS |dkr¦t	r¦d||fS dt|fS d S )Nc             S   s0   | j dƒrdnd}t| tddgd�jf |Ž| S )NÚ
r   Tzjinja2.ext.do)Z	undefinedZtrim_blocksÚ
extensions)ÚendswithÚ	JTemplater   Zrender)r0   r,   Úaddr   r   r   Újinja_renderf   s    z%detect_template.<locals>.jinja_renderr2   r   r   ÚbasicÚjinjaz.Unknown template rendering type '%s' requestedzcJinja not available as the selected renderer for desired template, reverting to the basic renderer.éÿÿÿÿ)r9   r8   )Úfindr"   ÚTYPE_MATCHERr(   r1   r   ÚlowerÚstripÚ
ValueErrorÚJINJA_AVAILABLEÚLOGZwarning)Útextr7   ZidentÚrestZ
type_matchÚtemplate_typer   r   r   Údetect_templatee   s(    



rE   c             C   s4   |si }t tj| ƒƒ\}}}tjd| |ƒ |||ƒS )Nz+Rendering content of '%s' using renderer %s)rE   r   Z	load_filerA   Údebug)Úfnr,   rD   Úrendererr0   r   r   r   Úrender_from_fileŽ   s
    rI   é¤  c             C   s   t | |ƒ}tj|||d� d S )N)Úmode)rI   r   r   )rG   Zoutfnr,   rK   Úcontentsr   r   r   Úrender_to_file–   s    
rM   c             C   s    |si }t | ƒ\}}} || |ƒS )zRender string)rE   )r0   r,   Z_template_typerH   r   r   r   Úrender_string›   s    rN   c       	      C   s„   t |dƒ�}|jƒ }W d Q R X | |dœ}t||ƒjƒ d }|r\tj|dd�}|s\td| ƒ‚|dkrrtjj	|ƒ nt
||dd	� d S )
NÚr)ÚvariantÚprefixr2   T)Údefaultz.Cannot render template file %s - invalid yaml.ú-Úw)Zomode)ÚopenÚreadrN   Úrstripr   Z	load_yamlr   ÚsysÚstdoutÚwriter   )	rP   ÚtemplateÚoutputZis_yamlrQ   ZfhrL   Z
tpl_paramsÚoutr   r   r   Úrender_template£   s    

r^   )rJ   )N)%r    ZloggingÚrerX   Ztypingr   Z	cloudinitr   r'   r   Zcloudinit.atomic_helperr   Z
JUndefinedZjinja2r   Z_DebugUndefinedr   r5   r@   ÚImportErrorÚAttributeErrorÚobjectZ	getLoggerr   rA   ÚcompileÚIr<   r.   r	   r   r1   rE   rI   rM   rN   r^   r   r   r   r   Ú<module>   s8    


&)
