U
    Ld#                  	   @   s  U 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
 d dlmZ eed< z$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eZedejZe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)log)
type_utils)util)
write_file
JUndefined)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   5/usr/lib/python3/dist-packages/cloudinit/templater.py__str__2   s    zUndefinedJinjaVariable.__str__c                 C   s(   t |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 || S )zThis 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   |  d}|d kr|  d}|d kr,tdt|d} }t|dkr| }t|tsvt	d|t
||f || }q@| }t|tst	d||t
|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   s0    




zbasic_render.<locals>.replacer)BASIC_MATCHERsub)contentr/   r0   r   r.   r   basic_render?   s    r4   c                 C   s   dd }|  ddkr(| dd\}}n| }d}t|}|sHdt| fS |d  }|dkrntd	| |d
krt	st
d dt|fS |d
krt	rd
||fS dt|fS d S )Nc                 S   s0   |  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)r3   r/   addr   r   r   jinja_renderf   s    z%detect_template.<locals>.jinja_renderr5   r   r   basic)jinjar<   z.Unknown template rendering type '%s' requestedr=   zcJinja not available as the selected renderer for desired template, reverting to the basic renderer.)findr$   TYPE_MATCHERr*   r4   r    lowerstrip
ValueErrorJINJA_AVAILABLELOGZwarning)textr:   ZidentrestZ
type_matchtemplate_typer   r   r   detect_templatee   s.    



rH   c                 C   s4   |si }t t| \}}}td| | |||S )Nz+Rendering content of '%s' using renderer %s)rH   r   Z	load_filerD   debug)fnr/   rG   rendererr3   r   r   r   render_from_file   s
    rL     c                 C   s   t | |}tj|||d d S )N)mode)rL   r   r   )rJ   Zoutfnr/   rN   contentsr   r   r   render_to_file   s    
rP   c                 C   s    |si }t | \}}} || |S )zRender string)rH   )r3   r/   Z_template_typerK   r   r   r   render_string   s    rQ   c              	   C   sl   t |d}| }W 5 Q R X | |d}t|| d }t| |dkrZtj| nt	||dd d S )Nr)variantprefixr5   -w)Zomode)
openreadrQ   rstripr   Z	load_yamlsysstdoutwriter   )rS   templateoutputrT   ZfhrO   Z
tpl_paramsr   r   r   render_cloudcfg   s    

r_   )rM   )N)'r"   rerZ   typingr   Z	cloudinitr   Zloggingr   r)   r   Zcloudinit.atomic_helperr   __annotations__Zjinja2r   Z_DebugUndefinedr	   r8   rC   r   ImportErrorAttributeErrorobjectZ	getLoggerr   rD   compileIr?   r1   r   r
   r4   rH   rL   rP   rQ   r_   r   r   r   r   <module>   s8    


&)
