a 'Dg@sVUddlZddlZddlZddlZddlmZddlmZmZddl m Z ddl m Z m Z ddlmZddlmZddlmZmZmZmZdd lmZmZeeed <zdd lmZdd lm Z Wn e!yeZe"d Z Yn0e#e$Z%GdddeZ&GdddeZ'Gddde j(Z)d!ddZ*d"ddZ+e,ee,dddZ-d#dd Z.dS)$N)EACCES)OptionalType)handlers)b64d json_dumps)Paths) PER_ALWAYS)MISSING_JINJA_PREFIXJinjaSyntaxParsingExceptiondetect_template render_string) load_jsonload_text_fileJUndefinedError)UndefinedError) operator_rez[-.]c@s eZdZdS)JinjaLoadErrorN__name__ __module__ __qualname__rrE/usr/lib/python3.9/site-packages/cloudinit/handlers/jinja_template.pyr"src@s eZdZdS) NotJinjaErrorNrrrrrr&src@s(eZdZdgZedddZddZdS)JinjaTemplatePartHandlerz## template: jinja)pathscKsLtjj|tdd||_i|_|dgD]}|D]}||j|<q6q*dS)N)version sub_handlers)rHandler__init__r rrgetZ list_types)selfr_kwargsZhandlerctyperrrr!.s  z!JinjaTemplatePartHandler.__init__c Cs|tjvrdS|jd}zt|||}Wn8tyb} z td|t| WYd} ~ dSd} ~ 00|sldSt |} |j | } | std|| dS| j dkr| ||||||n| j dkr| |||||dS)NZinstance_data_sensitivez=Ignoring jinja template for %s. Failed to render template. %szPIgnoring jinja template for %s. Could not find supported sub-handler for type %sr)rZCONTENT_SIGNALSrZ get_runpathrender_jinja_payload_from_filer LOGwarningstrZtype_from_starts_withrr"Zhandler_version handle_part) r#datar%filenamepayloadZ frequencyZheadersZjinja_json_filerendered_payloadeZsubtypeZ sub_handlerrrrr+6sB        z$JinjaTemplatePartHandler.handle_partN)rrrprefixesrr!r+rrrrr*srFc Cst|ddkrtdi}d}tj|s8td|ztt|}WnRty}z:d}t |t t fr||j t kr|d|}t||WYd}~n d}~00t||||}|sdS|S)aKRender a jinja template sourcing variables from jinja_vars_path. @param payload: String of jinja template content. Should begin with ## template: jinja\n. @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. rZjinjazPayload is not a jinja templateNzFCannot render jinja template vars. Instance data not yet present at %sz"Loading Jinja instance data failedzGCannot render jinja template vars. No read permission on '%s'. Try sudo)r rospathexistsrrr Exception isinstanceIOErrorOSErrorerrnorrender_jinja_payload)r. payload_fnZinstance_data_filedebug instance_datar/r0msgrrrr']s6   r'c Cst||dgdd}|r*tdt|zt||}Wn<ttfyt}z td|t |WYd}~dSd}~00ddt dt |D}|rtd |d ||S) Nzbase64-encoded-keysT) decode_pathsinclude_key_aliaseszConverted jinja variables %sz"Ignoring jinja template for %s: %scSsg|]}d|tdqS)z'%s')replacer ).0varrrr sz(render_jinja_payload..z%s[^\s]+z:Could not render jinja template variables in file '%s': %sz, )convert_jinja_instance_datar"r(r<rr TypeErrorrr)r*refindallr join)r.r;r=r<Zinstance_jinja_varsr/r0warningsrrrr:s4 r:) orig_namereturncCsttd|}||kr|SdS)aReturn a jinja variable alias, replacing any operators with underscores. Provide underscore-delimited key aliases to simplify dot-notation attribute references for keys which contain operators "." or "-". This provides for simpler short-hand jinja attribute notation allowing one to avoid quoting keys which contain operators. {{ ds.v1_0.config.user_network_config }} instead of {{ ds['v1.0'].config["user.network-config"] }}. :param orig_name: String representing a jinja variable name to scrub/alias. :return: A string with any jinja operators replaced if needed. Otherwise, none if no alias required. _N)rHsubr)rL alias_namerrrget_jinja_variable_aliassrQrA/rc Csi}dd|D}t|D]\}}|r8d|||n|}||vrLt|}t|trt|||||d||<td|r||D]\} } t | || <qn|||<|rt |} | rt |||| <q|S)zProcess instance-data.json dict for use in jinja templates. Replace hyphens with underscores for jinja templates and decode any base64_encoded_keys. cSsg|]}|ddqS)-rN)rB)rCr3rrrrEz/convert_jinja_instance_data..z {0}{1}{2})sepr?r@zv\d+$) sorteditemsformatrr6dictrFrHmatchcopydeepcopyrQ) r,prefixrUr?r@resultkeyvalueZkey_pathZsubkeyZsubvaluerPrrrrFs.   rF)F)F)rArRrF)/r[Zloggingr2rHr9rtypingrrZ cloudinitrZcloudinit.atomic_helperrrZcloudinit.helpersrZcloudinit.settingsr Zcloudinit.templaterr r r r Zcloudinit.utilrrr5__annotations__Zjinja2.exceptionsrrZ jinja2.lexerr ImportErrorcompileZ getLoggerrr(rrr rr'r:r*rQrFrrrrs8         4 -