
    }f                        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 eed<   	 d dlmZ d d	lmZ d
ZeZ ej0                  e      Z ej6                  dej8                        Z ej6                  d      ZdZ G d de      Z  G d de      Z!d Z"d Z#d Z$ddZ%d Z&ddZ'y# eef$ r dZeZY {w xY w)    N)Any)TemplateSyntaxError)
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            
       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__0   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_messageD   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)r/   replacer5   	TypeErrorr*   r6   )r   r9   s     r   __sub__zUndefinedJinjaVariable.__sub__`   sI    E
""#7<@@F)) AG A
 	
r   N)r+   r,   r-   __doc__r&   r<    r   r   r2   r2   Z   s    HE
r   r2   c                 :    fd}t         j                  ||       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_namer/   )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   )BASIC_MATCHERsub)contentrS   rT   s    ` r   basic_renderrX   j   s    )6 Xw//r   c                    d }| j                  d      dk7  r| j                  dd      \  }}n| }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                     | j                  d      rdnd}	  t        | t        ddg      j                  di ||z   S # t        $ r'}|xj
                  dz  c_        t        |      |d }~wt        $ r}||d }~ww xY w)	N
r(   Tzjinja2.ext.do)	undefinedtrim_blocks
extensionsrA   )r   r>   )endswith	JTemplater2   renderr   r   r   	Exception)rW   rS   addtemplate_syntax_errorunknown_errors        r   jinja_renderz%detect_template.<locals>.jinja_render   s    &&t,d"	3	4 $ /0	
 &#
 "#  # 	)!((A-(-+()  	3]2	3s!   &> 	A="A))A=5A88A=r[   rA   r(   basic)jinjarh   z.Unknown template rendering type '%s' requestedri   zcJinja not available as the selected renderer for desired template, reverting to the basic renderer.)findrH   TYPE_MATCHERrO   rX   rD   lowerr$   
ValueErrorJINJA_AVAILABLELOGwarning)textrf   identrest
type_matchtemplate_types         r   detect_templaterv      s    3* yy"jjq)t##E*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)rv   r   load_text_filero   debug)fnrS   ru   rendererrW   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   )rz   outfnrS   r~   contentss        r   render_to_filer      s    F+HOOE8$/r   c                 :    |si }t        |       \  }}}  || |      S )zRender string)rv   )rW   rS   _template_typer{   s       r   render_stringr      s(    (7(@%NHgGV$$r   c                 b   t        |d      5 }|j                         }d d d        | |d}t        |      j                         dz   }|r't	        j
                  |d      }|st        d|z        |dk(  r t        j                  j                  |       y t        ||d	       y # 1 sw Y   xY w)
Nr)variantprefixr[   T)defaultz.Cannot render template file %s - invalid yaml.-w)omode)openreadr   rstripr   	load_yamlrE   sysstdoutwriter   )	r   templateoutputis_yamlr   fhr   
tpl_paramsouts	            r   render_templater      s    	h	 779$7Jh
3;;=DHnnXt4@8K  }

"683/ s   B%%B.)i  r4   )(rF   loggingrer   typingr   jinja2r   	cloudinitr   rM   r   cloudinit.atomic_helperr   __annotations__r	   _DebugUndefinedr
   r`   rn   r   ImportErrorAttributeErrorobject	getLoggerr+   ro   compileIrk   rU   r5   r   r2   rX   rv   r|   r   r   r   r>   r   r   <module>r      s      	 
  & &  .
 8,O J
 g!rzz/6

GH. &"5 &V
Z 
 #0L.-b%0
%0c 	^$ OJs   B4 4CC