
    x[h                     b   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 d dlmZ d dlmZ eed<   	 d d	lmZ d d
lmZ dZeZ ej2                  e      ZdZ G d de      Z G d de      Z e	j>                  d      d        Z d Z!d Z"ddZ#d Z$ddZ%y# eef$ r dZeZY aw xY w)    N)Any)TemplateSyntaxError)performance)
type_utils)util)
write_file
JUndefined)DebugUndefined)TemplateTFzCI_MISSING_JINJA_VAR/c            
       X     e Zd Zdeddf fdZd Ze	 ddedededefd	       Zd
Z	 xZ
S )JinjaSyntaxParsingExceptionerrorreturnNc                     t         |   |j                  xs d|j                  |j                  |j
                         |j                  | _        y )Nzunknown syntax error)super__init__messagelinenonamefilenamesource)selfr   	__class__s     5/usr/lib/python3/dist-packages/cloudinit/templater.pyr   z$JinjaSyntaxParsingException.__init__/   sA     	MM33LLJJNN		
 ll    c                     | j                  | j                  | j                  | j                  j	                         | j                  dz
     j                               S );Avoid jinja2.TemplateSyntaxError multi-line __str__ format.   syntax_errorline_numberline_content)format_error_messager   r   r   
splitlinesstripr   s    r   __str__z#JinjaSyntaxParsingException.__str__;   sN    ((//1$++/BHHJ ) 
 	
r   r    r!   r"   c                 X    |rd| nd}t         j                  j                  | ||      S )r   z:  r   )r   message_templateformatr   s      r   r#   z0JinjaSyntaxParsingException.format_error_messageC   s<     /;L>**;;BB%#% C 
 	
r   zfUnable to parse Jinja template due to syntax error: {syntax_error} on line {line_number}{line_content})r)   )__name__
__module____qualname__r   r   r'   staticmethodstrr#   r*   __classcell__)r   s   @r   r   r   .   sf    
#"
# 

#
  


 
 
	
 
	= r   r   c                       e Zd ZdZd Zd Zy)UndefinedJinjaVariablez>Class used to represent any undefined jinja template variable.c                 *    t         | j                  S N)MISSING_JINJA_PREFIX_undefined_namer&   s    r   r'   zUndefinedJinjaVariable.__str__\   s    -t/C/CDDr   c                     t        |      j                  t        d      }t        dj	                  | j
                  |            )Nr)   zhUndefined jinja variable: "{this}-{other}". Jinja tried subtraction. Perhaps you meant "{this}_{other}"?)thisother)r0   replacer6   	TypeErrorr+   r7   )r   r:   s     r   __sub__zUndefinedJinjaVariable.__sub___   sI    E
""#7<@@F)) AG A
 	
r   N)r,   r-   r.   __doc__r'   r=    r   r   r3   r3   Y   s    HE
r   r3   zRendering basic templatec                 <    fd}t        j                  d||       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           
      0   | j                  d      }|| j                  d      }|t        d      t        j                  |j	                  d            }}t        |      dkD  r\|j                         }t        |t              s(t        d|dt        j                  |      d|d      ||   }t        |      dkD  r\|j                         }t        |t              s't        d	|d
|dt        j                  |            t        ||         S )N   r   z,Match encountered but no valid group present.z&Can not traverse into non-dictionary 'z
' of type z while looking for subkey ''zCan not extract key 'z' from non-dictionary ')groupRuntimeErrorcollectionsdequesplitlenpopleft
isinstancedictr<   tuobj_namer0   )matchr   pathselected_paramskeyparamss        r   replacerzbasic_render.<locals>.replacerr   s    {{1~<;;q>D<MNN  C1 $i!m,,.Cot4 'O(DcK  .c2O $i!m lln/40_)EG  ?3'((r   z)\$\{([A-Za-z0-9_.]+)\}|\$([A-Za-z0-9_.]+))resub)contentrT   rU   s    ` r   basic_renderrY   i   s"    )6 664h r   c                    d }| j                  d      dk7  r| j                  dd      \  }}n| }d}t        j                  d|t        j                        }|s	dt
        | fS |j                  d      j                         j                         }|dvrt        d	|z        |d
k(  r$t        st        j                  d       dt
        |fS |d
k(  rt        rd
||fS dt
        |fS )Nc                 X   | j                  d      rdnd}	 t        j                  d      5   t        | t        ddg      j
                  d	i ||z   	 cd d d        S # 1 sw Y   y xY w# t        $ r'}|xj                  dz  c_        t        |      |d }~wt        $ r}||d }~ww xY w)
N
r)   zRendering jinja2 templateTzjinja2.ext.do)	undefinedtrim_blocks
extensionsrB   )r   r?   )
endswithr   Timed	JTemplater3   renderr   r   r   	Exception)rX   rT   addtemplate_syntax_errorunknown_errors        r   jinja_renderz%detect_template.<locals>.jinja_render   s    &&t,d"	3""#>? 	I"8$($3#4	
 f'
  &' 	 	 	 # 	)!((A-(-+()  	3]2	3s@   A* (A	A* A'#A* 'A* *	B)3"BB)!B$$B)r\   rB   r)   z##\s*template:(.*)basic)jinjarj   z.Unknown template rendering type '%s' requestedrk   zcJinja not available as the selected renderer for desired template, reverting to the basic renderer.)findrI   rV   rP   IrY   rE   lowerr%   
ValueErrorJINJA_AVAILABLELOGwarning)textrh   identrest
type_matchtemplate_types         r   detect_templaterx      s    3, yy"jjq)t/=Jt,,"((+11399; 22@   G#OKKF \400g%/\400t,,r   c                     |si }t        t        j                  |             \  }}}t        j	                  d| |        |||      S )Nz+Rendering content of '%s' using renderer %s)rx   r   load_text_filerq   debug)fnrT   rw   rendererrX   s        r   render_from_filer~      sD    '6t7J7J27N'O$M8WII;ROGV$$r   c                 L    t        | |      }t        j                  |||       y )N)mode)r~   r   r   )r|   outfnrT   r   contentss        r   render_to_filer      s    F+HOOE8$/r   c                 :    |si }t        |       \  }}}  || |      S )zRender string)rx   )rX   rT   _template_typer}   s       r   render_stringr      s(    (7(@%NHgGV$$r   c                 *   t        j                  |      }| |d}t        ||      j                         dz   }|r't        j                  |d      }|st        d|z        |dk(  r t        j                  j                  |       y t        ||d       y )	N)variantprefixr\   T)defaultz.Cannot render template file %s - invalid yaml.-w)omode)
r   rz   r   rstrip	load_yamlrF   sysstdoutwriter   )r   templateoutputis_yamlr   r   
tpl_paramsouts           r   render_templater      s    ""8,H$7Jh
3;;=DHnnXt4@8K  }

"683/r   )i  r5   )&rG   loggingrV   r   typingr   jinja2r   	cloudinitr   r   rN   r   cloudinit.atomic_helperr   __annotations__r
   _DebugUndefinedr   rb   rp   r	   ImportErrorAttributeErrorobject	getLoggerr,   rq   r6   r   r3   timedrY   rx   r~   r   r   r   r?   r   r   <module>r      s      	 
  & ! &  .
 8,O J
 g!. &"5 &V
Z 
  -.% /%P/-d%0
%0g 	^$ OJs   B   B.-B.