
"T`                 @   su  d  d l  Z  d  d l Z y d  d l m Z d Z Wn e e f k
 rR d Z Yn Xy* d  d l m Z	 d  d l m
 Z d Z Wn$ e e f k
 r d Z e Z Yn Xd  d l m Z d  d l m Z d  d l m Z e j e  Z e j d	 e j  Z e j d
  Z d Z Gd d   d e  Z d d   Z d d   Z d d   Z d d d  Z  d d d  Z! d d   Z" d S)    N)TemplateTF)DebugUndefined)log)
type_utils)utilz##\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__-   s    zUndefinedJinjaVariable.__str__c             C   s=   t  |  j t d  } t d j d |  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__0   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)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  |  j  d  } | d  k r* |  j  d  } | d  k rB t d   t j | j d   }   } x] t |  d k r | j   } t | t  s t	 d | t
 j |  | f   | | } qc W| 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   replacer@   s*    zbasic_render.<locals>.replacer)BASIC_MATCHERsub)contentr+   r,   r   )r+   r   basic_render8   s    r0   c             C   sy  d d   } d d   } |  j  d  d k rH |  j d d  \ } } n |  } d } t j |  } | s t r t j d  d	 | |  f Sd
 t |  f Sn | j d  j	   j
   } | d k r t d |   | d k r t r t j d  d
 t | f S| d k rt rd | | f S| d	 k rIt rIt j d  d
 t | f S| d	 k rht rhd	 | | f Sd
 t | f Sd  S)Nc             S   s   t  |  d | g j   S)NZ
searchList)	CTemplateZrespond)r/   r+   r   r   r   cheetah_render`   s    z'detect_template.<locals>.cheetah_renderc             S   s>   |  j  d  r d n d } t |  d t d d j |   | S)N
r   Z	undefinedZtrim_blocksT)endswith	JTemplater   Zrender)r/   r+   addr   r   r   jinja_renderc   s    	z%detect_template.<locals>.jinja_renderr3   r   r   z3Using Cheetah as the renderer for unknown template.cheetahbasicjinjaz.Unknown template rendering type '%s' requestedzcJinja not available as the selected renderer for desired template, reverting to the basic renderer.zeCheetah not available as the selected renderer for desired template, reverting to the basic renderer.)r:   r8   r9   )findr!   TYPE_MATCHERr'   CHEETAH_AVAILABLELOGdebugr0   r   lowerstrip
ValueErrorJINJA_AVAILABLEZwarning)textr2   r7   ZidentrestZ
type_matchtemplate_typer   r   r   detect_template^   s6    
rH   c             C   sY   | s i  } t  t j |  d d j d   \ } } } t j d |  |  | | |  S)NdecodeFzutf-8z+Rendering content of '%s' using renderer %s)rH   r   Z	load_filerI   r?   r@   )fnr+   rG   rendererr/   r   r   r   render_from_file   s    *rL   i  c             C   s)   t  |  |  } t j | | d | d  S)Nmode)rL   r   
write_file)rJ   outfnr+   rM   contentsr   r   r   render_to_file   s    rQ   c             C   s)   t  |  |  } t j | | d | d S)zpRender string (or py2 unicode) to file.
    Warning: py2 str with non-ascii chars will cause UnicodeDecodeError.rM   N)render_stringr   rN   )r/   rO   r+   rM   rP   r   r   r   render_string_to_file   s    rS   c             C   s.   | s i  } t  |   \ } } }  | |  |  S)zhRender string (or py2 unicode).
    Warning: py2 str with non-ascii chars will cause UnicodeDecodeError.)rH   )r/   r+   Z_template_typerK   r   r   r   rR      s    rR   )#r   reZCheetah.Templater   r1   r>   ImportErrorAttributeErrorZjinja2r5   r   Z
JUndefinedrD   objectZ	cloudinitr   Zloggingr   r&   r   Z	getLoggerr   r?   compileIr=   r-   r   r   r0   rH   rL   rQ   rS   rR   r   r   r   r   <module>   s6   

&-