ó oBú]c@s$ddlmZddlZddlZyddlmZWnek rUeZnXddl m Z ddl m Z ddl mZddlmZmZddlmZmZmZmZdd lmZe jeƒZd e jfd „ƒYZed „Zed „Z dddd„Z!dS(iÿÿÿÿ(tEACCESN(tUndefinedError(thandlers(tlog(tINSTANCE_JSON_FILE(t render_stringtMISSING_JINJA_PREFIX(tb64dt load_filet load_jsont json_dumps(t PER_ALWAYStJinjaTemplatePartHandlercBs#eZdgZd„Zd„ZRS(s## template: jinjacKsptjj|tddƒ||_i|_x>|jdgƒD]*}x!|jƒD]}||j|WdS(Ntversionit sub_handlers(RtHandlert__init__R tpathsRtgett list_types(tselfRt_kwargsthandlertctype((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyRs   c Cså|tjkrdStjj|jjtƒ}t|||ƒ}|sJdStj |ƒ} |j j | ƒ} | sˆt j d|| ƒdS| jdkr¶| j||||||ƒn+| jdkrá| j|||||ƒndS(NsPIgnoring jinja template for %s. Could not find supported sub-handler for type %sii(RtCONTENT_SIGNALStostpathtjoinRtrun_dirRtrender_jinja_payload_from_filettype_from_starts_withRRtLOGtwarningthandler_versiont handle_part( RtdataRtfilenametpayloadt frequencytheaderstjinja_json_filetrendered_payloadtsubtypet sub_handler((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyR"$s( (t__name__t __module__tprefixesRR"(((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyR s  cCs¨i}d}tjj|ƒs1td|ƒ‚nytt|ƒƒ}Wn;ttfk r„}|j t kr…td|ƒ‚q…nXt ||||ƒ}|s¤dS|S(sRRender 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. sFCannot render jinja template vars. Instance data not yet present at %ssGCannot render jinja template vars. No read permission on '%s'. Try sudoN( tNoneRRtexistst RuntimeErrorR RtIOErrortOSErrorterrnoRtrender_jinja_payload(R%t payload_fntinstance_data_filetdebugt instance_dataR)te((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyR;s$ c Csèt|d|jdgƒƒ}|r=tjdt|ƒƒnyt||ƒ}Wn3ttfk r…}tjd|t |ƒƒdSXgt j dt |ƒD]}d|jt dƒ^q}|rätjd|d j|ƒƒn|S( Nt decode_pathssbase64-encoded-keyssConverted jinja variables %ss"Ignoring jinja template for %s: %ss%s[^\s]+s'%s'ts:Could not render jinja template variables in file '%s': %ss, (tconvert_jinja_instance_dataRRR8R Rt TypeErrortJUndefinedErrorR tstrR/tretfindallRtreplaceR( R%R6R9R8tinstance_jinja_varsR)R:tvartwarnings((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyR5_s( 0R<t/c Cs*i}g|D]}|jddƒ^q }xøt|jƒƒD]ä\}}d|krk|jddƒ}n|r†dj|||ƒn|}||kr§t|ƒ}nt|tƒrt||d|d|ƒ|||||W|S(s¢Process instance-data.json dict for use in jinja templates. Replace hyphens with underscores for jinja templates and decode any base64_encoded_keys. t-t_s {0}{1}{2}tsepR;sv\d+( RCtsortedtitemstformatRt isinstancetdictR=RAtmatch( R#tprefixRJR;tresultRtkeytvaluetkey_pathtsubkeytsubvalue((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyR=ws % ! (("R4RRRAtjinja2.exceptionsRR?t ImportErrort Exceptiont cloudinitRRtloggingtcloudinit.sourcesRtcloudinit.templaterRRtcloudinit.utilRRR R tcloudinit.settingsR t getLoggerR,RRR tFalseRR5R=(((sE/usr/lib/python2.7/site-packages/cloudinit/handlers/jinja_template.pyts"    "$ #