a 'Dg6 @s>UddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z ddlm Z ddl mZeed<z$dd lmZdd lmZd ZeZWneefyd ZeZYn0eeZed ejZedZdZ GdddeZ!GdddeZ"e #dddZ$ddZ%ddZ&d"ddZ'ddZ(d#d d!Z)dS)$N)Any)TemplateSyntaxError) performance) type_utils)util) write_file JUndefined)DebugUndefined)TemplateTFz##\s*template:(.*)z)\$\{([A-Za-z0-9_.]+)\}|\$([A-Za-z0-9_.]+)zCI_MISSING_JINJA_VAR/csJeZdZeddfdd ZddZed eeeedd d Zd Z Z S) JinjaSyntaxParsingExceptionN)errorreturncs*t|jpd|j|j|j|j|_dS)Nzunknown syntax error)super__init__messagelinenonamefilenamesource)selfr  __class__7/usr/lib/python3.9/site-packages/cloudinit/templater.pyr1sz$JinjaSyntaxParsingException.__init__cCs(|j|j|j|j|jddS);Avoid jinja2.TemplateSyntaxError multi-line __str__ format. syntax_error line_number line_content)format_error_messagerrr splitlinesstriprrrr__str__=s z#JinjaSyntaxParsingException.__str__)rrrr cCs$|rd|nd}tjj|||dS)rz: r%r)r message_templateformatrrrrr Es z0JinjaSyntaxParsingException.format_error_messagezfUnable to parse Jinja template due to syntax error: {syntax_error} on line {line_number}{line_content})r%) __name__ __module__ __qualname__rrr$ staticmethodstrr r& __classcell__rrrrr 0s r c@s eZdZdZddZddZdS)UndefinedJinjaVariablez>Class used to represent any undefined jinja template variable.cCsdt|jfS)Nz%s%s)MISSING_JINJA_PREFIX_undefined_namer#rrrr$^szUndefinedJinjaVariable.__str__cCs(t|td}tdj|j|ddS)Nr%zhUndefined jinja variable: "{this}-{other}". Jinja tried subtraction. Perhaps you meant "{this}_{other}"?)thisother)r,replacer/ TypeErrorr'r0)rr2rrr__sub__as zUndefinedJinjaVariable.__sub__N)r(r)r*__doc__r$r5rrrrr.[sr.zRendering basic templatecsfdd}t||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'. cs|d}|dur|d}|dur,tdt|d}}t|dkr|}t|tsvt d|t ||f||}q@|}t|tst d||t |ft ||S)Nrz,Match encountered but no valid group present.zRCan not traverse into non-dictionary '%s' of type %s while looking for subkey '%s'z.replacer) BASIC_MATCHERsub)contentrGrHrrFr basic_renderks rLcCsdd}|ddkr(|dd\}}n|}d}t|}|sHdt|fS|d}|dvrntd ||d krt st d dt|fS|d krt rd ||fSdt|fSdS) Nc Ss|drdnd}zRtd4t|tddgdjfi||WdWS1sX0YWnfty}z&|jd7_t|d|WYd}~n2d}~0t y}z||WYd}~n d}~00dS) N r%zRendering jinja2 templateTz jinja2.ext.do)Z undefinedZ trim_blocks extensionsr7)r ) endswithrZTimed JTemplater.Zrenderrrr Exception)rKrGaddZtemplate_syntax_errorZ unknown_errorrrr jinja_renders.  & z%detect_template..jinja_renderrMr7r%basic)jinjarUz.Unknown template rendering type '%s' requestedrVzcJinja not available as the selected renderer for desired template, reverting to the basic renderer.) findr= TYPE_MATCHERrCrLr9lowerr" ValueErrorJINJA_AVAILABLELOGZwarning)textrSidentrestZ type_match template_typerrrdetect_templates.      racCs4|si}tt|\}}}td|||||S)Nz+Rendering content of '%s' using renderer %s)rarload_text_filer\debug)fnrGr`rendererrKrrrrender_from_files rfcCst||}tj|||ddS)N)mode)rfrr)rdZoutfnrGrhcontentsrrrrender_to_files rjcCs |si}t|\}}}|||S)z Render string)ra)rKrGZ_template_typererrr render_stringsrkcCspt|}||d}t||d}|rHtj|dd}|sHtd||dkr^tj|nt ||dddS) N)variantprefixrMT)defaultz.Cannot render template file %s - invalid yaml.-w)Zomode) rrbrkrstripZ load_yamlr:sysstdoutwriter)rltemplateoutputZis_yamlrmriZ tpl_paramsoutrrrrender_templates  rx)rg)N)*r;ZloggingrerrtypingrZjinja2rZ cloudinitrrrBrZcloudinit.atomic_helperr__annotations__r Z_DebugUndefinedr rPr[r ImportErrorAttributeErrorobjectZ getLoggerr(r\compileIrXrIr/r r.ZtimedrLrarfrjrkrxrrrrs>            + &2