
"T`                 @   s.  d  d l  m Z d  d l Z d  d l Z y d  d l m Z Wn e k
 rV e Z Yn Xd  d l	 m
 Z
 d  d l	 m Z d  d l m Z d  d l m Z m Z d  d l m Z m Z m Z m Z d  d	 l m Z e j e  Z Gd
 d   d e
 j  Z d d d  Z d d d  Z d d f  d d  Z  d S)    )EACCESN)UndefinedError)handlers)log)INSTANCE_JSON_FILE)render_stringMISSING_JINJA_PREFIX)b64d	load_file	load_json
json_dumps)
PER_ALWAYSc               @   s1   e  Z d  Z d g Z d d   Z d d   Z d S)JinjaTemplatePartHandlerz## template: jinjac             K   sp   t  j j |  t d d | |  _ i  |  _ x> | j d g   D]* } x! | j   D] } | |  j | <qQ Wq> Wd  S)Nversion   sub_handlers)r   Handler__init__r   pathsr   getZ
list_types)selfr   Z_kwargsZhandlerctype r   C/usr/lib/python3/dist-packages/cloudinit/handlers/jinja_template.pyr      s    		z!JinjaTemplatePartHandler.__init__c             C   s   | t  j k r d  St j j |  j j t  } t | | |  } | sJ d  St  j	 |  }	 |  j
 j |	  }
 |
 s t j d | |	  d  S|
 j d k r |
 j | | | | | |  n( |
 j d k r |
 j | | | | |  d  S)NzPIgnoring jinja template for %s. Could not find supported sub-handler for type %sr      )r   ZCONTENT_SIGNALSospathjoinr   Zrun_dirr   render_jinja_payload_from_fileZtype_from_starts_withr   r   LOGwarningZhandler_versionhandle_part)r   datar   filenamepayloadZ	frequencyZheadersZjinja_json_filerendered_payloadsubtypeZsub_handlerr   r   r   r!   $   s(    
z$JinjaTemplatePartHandler.handle_partN)__name__
__module____qualname__prefixesr   r!   r   r   r   r   r      s   	r   Fc             C   s   i  } d } t  j j |  s. t d |   y t t |   } WnM t t f k
 r } z' | j t	 k r t d |  |  WYd d } ~ Xn Xt
 |  | | |  } | s d S| S)aR  Render a jinja template payload sourcing variables from jinja_vars_path.

    @param payload: String of jinja template content. Should begin with
        ## template: jinja
.
    @param payload_fn: String representing the filename from which the payload
        was read used in error reporting. Generally in part-handling this is
        'part-##'.
    @param instance_data_file: A path to a json file containing variables that
        will be used as jinja template variables.

    @return: A string of jinja-rendered content with the jinja header removed.
        Returns None on error.
    NzFCannot render jinja template vars. Instance data not yet present at %szGCannot render jinja template vars. No read permission on '%s'. Try sudo)r   r   existsRuntimeErrorr   r
   IOErrorOSErrorerrnor   render_jinja_payload)r$   
payload_fnZinstance_data_filedebuginstance_datar%   er   r   r   r   ;   s&    
r   c             C   s   t  | d | j d g   } | r: t j d t |   y t |  |  } WnH t t f k
 r } z" t j d | t	 |   d  SWYd  d  } ~ Xn Xd d   t
 j d t |  D } | r t j d | d	 j |   | S)
Ndecode_pathszbase64-encoded-keyszConverted jinja variables
%sz"Ignoring jinja template for %s: %sc             S   s&   g  |  ] } d  | j  t d   q S)z'%s' )replacer   ).0varr   r   r   
<listcomp>n   s   	z(render_jinja_payload.<locals>.<listcomp>z%s[^\s]+z:Could not render jinja template variables in file '%s': %sz, )convert_jinja_instance_datar   r   r2   r   r   	TypeErrorJUndefinedErrorr    strrefindallr   r   )r$   r1   r3   r2   Zinstance_jinja_varsr%   r4   warningsr   r   r   r0   `   s(    		r0   r6   /c       
      C   s  i  } d d   | D } x t  |  j    D] \ } } d | k rV | j d d  } | rq d j | | |  n | } | | k r t |  } t | t  r t | | d | d | | | <t j	 d |  rx5 | | j   D] \ } }	 |	 | | <q Wq, | | | <q, W| S)	zProcess instance-data.json dict for use in jinja templates.

    Replace hyphens with underscores for jinja templates and decode any
    base64_encoded_keys.
    c             S   s"   g  |  ] } | j  d  d   q S)-_)r7   )r8   r   r   r   r   r:      s   	 z/convert_jinja_instance_data.<locals>.<listcomp>rC   rD   z	{0}{1}{2}sepr5   zv\d+)
sorteditemsr7   formatr	   
isinstancedictr;   r?   match)
r"   prefixrE   r5   resultkeyvalueZkey_pathZsubkeyZsubvaluer   r   r   r;   x   s     !r;   )!r/   r   r   r?   Zjinja2.exceptionsr   r=   ImportError	ExceptionZ	cloudinitr   r   ZloggingZcloudinit.sourcesr   Zcloudinit.templaterr   r   Zcloudinit.utilr	   r
   r   r   Zcloudinit.settingsr   Z	getLoggerr'   r   r   r   r   r0   r;   r   r   r   r   <module>   s"   "$$