
    x[h                     h   % S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SKJ
r  S SKJr  S SKJr  \\S'    S S	KJr  S S
KJr  Sr\r\R2                  " \5      rSr " S S\5      r " S S\5      r\	R>                  " S5      S 5       r S r!S r"SS jr#S r$SS jr%g! \\4 a    Sr\r Ndf = f)    N)Any)TemplateSyntaxError)performance)
type_utils)util)
write_file
JUndefined)DebugUndefined)TemplateTFzCI_MISSING_JINJA_VAR/c            
       h   ^  \ rS rSrS\SS4U 4S jjrS r\ SS\S\S	\S\4S
 jj5       r	Sr
SrU =r$ )JinjaSyntaxParsingException.   errorreturnNc                    > [         TU ]  UR                  =(       d    SUR                  UR                  UR
                  5        UR                  U l        g )Nzunknown syntax error)super__init__messagelinenonamefilenamesource)selfr   	__class__s     5/usr/lib/python3/dist-packages/cloudinit/templater.pyr   $JinjaSyntaxParsingException.__init__/   sA     	MM33LLJJNN		
 ll    c                     U R                  U R                  U R                  U R                  R	                  5       U R                  S-
     R                  5       S9$ );Avoid jinja2.TemplateSyntaxError multi-line __str__ format.   syntax_errorline_numberline_content)format_error_messager   r   r   
splitlinesstripr   s    r   __str__#JinjaSyntaxParsingException.__str__;   sN    ((//1$++/BHHJ ) 
 	
r   r"   r#   r$   c                 \    U(       a  SU 3OSn[         R                  R                  U UUS9$ )r   z:  r!   )r   message_templateformatr!   s      r   r%   0JinjaSyntaxParsingException.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   )r,   )__name__
__module____qualname____firstlineno__r   r   r)   staticmethodstrr%   r-   __static_attributes____classcell__)r   s   @r   r   r   .   sf    
#"
# 

#
  


 
 
	
 
	= r   r   c                   $    \ rS rSrSrS rS rSrg)UndefinedJinjaVariableY   z>Class used to represent any undefined jinja template variable.c                 .    [         < U R                  < 3$ N)MISSING_JINJA_PREFIX_undefined_namer(   s    r   r)   UndefinedJinjaVariable.__str__\   s    -t/C/CDDr   c                     [        U5      R                  [        S5      n[        SR	                  U R
                  US95      e)Nr,   zhUndefined jinja variable: "{this}-{other}". Jinja tried subtraction. Perhaps you meant "{this}_{other}"?)thisother)r5   replacer=   	TypeErrorr.   r>   )r   rB   s     r   __sub__UndefinedJinjaVariable.__sub___   sI    E
""#7<@@F)) AG A
 	
r    N)r0   r1   r2   r3   __doc__r)   rE   r6   rG   r   r   r9   r9   Y   s    HE
r   r9   zRendering basic templatec                 >   ^ U4S jn[         R                  " SX 5      $ )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           
      \  > U R                  S5      nUc  U R                  S5      nUc  [        S5      e[        R                  " UR	                  S5      5      nTn[        U5      S:  af  UR                  5       n[        U[        5      (       d,  [        SU< S[        R                  " U5      < SU< S35      eX4   n[        U5      S:  a  Mf  UR                  5       n[        U[        5      (       d+  [        S	U< S
U< S[        R                  " U5      < 35      e[        X4   5      $ )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dictrD   tuobj_namer5   )matchr   pathselected_paramskeyparamss        r   replacerbasic_render.<locals>.replacerr   s    {{1~<;;q>D<MNN  C1 $i!m,,.Cot44 'O(DcK  .2O $i!m lln/400_)EG  ?'((r   z)\$\{([A-Za-z0-9_.]+)\}|\$([A-Za-z0-9_.]+))resub)contentr]   r^   s    ` r   basic_renderrc   i   s     )6 664h r   c                    S nU R                  S5      S:w  a  U R                  SS5      u  p#OU nSn[        R                  " SU[        R                  5      nU(       d	  S[
        U 4$ UR                  S5      R                  5       R                  5       nUS;  a  [        S	U-  5      eUS
:X  a)  [        (       d  [        R                  S5        S[
        U4$ US
:X  a  [        (       a  S
X4$ S[
        U4$ )Nc                 d   U R                  S5      (       a  SOSn [        R                  " S5         [        U [        SS/S9R
                  " S	0 UD6U-    sS S S 5        $ ! , (       d  f       g = f! [         a$  nU=R                  S-  sl        [        US9UeS nAf[         a  nXDeS nAff = f)
N
r,   zRendering jinja2 templateTzjinja2.ext.do)	undefinedtrim_blocks
extensionsrK   )r   rG   )
endswithr   Timed	JTemplater9   renderr   r   r   	Exception)rb   r]   addtemplate_syntax_errorunknown_errors        r   jinja_render%detect_template.<locals>.jinja_render   s    &&t,,d"	3""#>?"8$($3#4	
 f '
  &'  @?? # 	)!((A-(-+()  	32	3s@   A2 %A!	A2 !
A/+A2 /A2 2
B/<BB/(B**B/rf   rK   r,   z##\s*template:(.*)basic)jinjaru   z.Unknown template rendering type '%s' requestedrv   zcJinja not available as the selected renderer for desired template, reverting to the basic renderer.)findrR   r`   rY   Irc   rN   lowerr'   
ValueErrorJINJA_AVAILABLELOGwarning)textrr   identrest
type_matchtemplate_types         r   detect_templater      s    3, yy"jjq)t/=Jt,,"((+11399; 22@   G#OOKKF \400g%//\00t,,r   c                     U(       d  0 n[        [        R                  " U 5      5      u  p#n[        R	                  SX5        U" XA5      $ )Nz+Rendering content of '%s' using renderer %s)r   r   load_text_filer|   debug)fnr]   r   rendererrb   s        r   render_from_filer      s>    '6t7J7J27N'O$MWII;ROG$$r   c                 D    [        X5      n[        R                  " XUS9  g )N)mode)r   r   r   )r   outfnr]   r   contentss        r   render_to_filer      s    +HOOE$/r   c                 @    U(       d  0 n[        U 5      u  p#n U" X5      $ )zRender string)r   )rb   r]   _template_typer   s       r   render_stringr      s$    (7(@%NgG$$r   c                 2   [         R                  " U5      nXS.n[        XV5      R                  5       S-   nU(       a*  [         R                  " USS9nU(       d  [        SU-  5      eUS:X  a   [        R                  R                  U5        g [        X%SS9  g )	N)variantprefixrf   T)defaultz.Cannot render template file %s - invalid yaml.-w)omode)
r   r   r   rstrip	load_yamlrO   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  }

"63/r   )i  r<   )&rP   loggingr`   r   typingr   jinja2r   	cloudinitr   r   rW   r   cloudinit.atomic_helperr   __annotations__r
   _DebugUndefinedr   rl   r{   r	   ImportErrorAttributeErrorobject	getLoggerr0   r|   r=   r   r9   timedrc   r   r   r   r   r   rG   r   r   <module>r      s      	 
  & ! &  .
 8,O J
 !. &"5 &V
Z 
  -.% /%P/-d%0
%0g 	^$ OJs   B" "B10B1