a '¡Dg6ã @s>UddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z ddlm Z ddl mZeed<z$dd lmZdd lmZd ZeZWneefy´d ZeZYn0e e¡Ze d ej¡Ze d¡ZdZ Gdd„deƒZ!Gdd„deƒZ"e  #d¡dd„ƒZ$dd„Z%dd„Z&d"dd„Z'dd„Z(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/csJeZdZeddœ‡fdd„ Zdd„Zed eeeedœd d „ƒZd Z ‡Z S) ÚJinjaSyntaxParsingExceptionN)ÚerrorÚreturncs*tƒ |jpd|j|j|j¡|j|_dS)Nzunknown syntax error)ÚsuperÚ__init__ÚmessageÚlinenoÚnameÚfilenameÚsource)Úselfr ©Ú __class__©ú7/usr/lib/python3.9/site-packages/cloudinit/templater.pyr1süz$JinjaSyntaxParsingException.__init__cCs(|j|j|j|j ¡|jd ¡d�S)ú;Avoid jinja2.TemplateSyntaxError multi-line __str__ format.é©Ú syntax_errorÚ line_numberÚ line_content)Úformat_error_messagerrrÚ splitlinesÚstrip©rrrrÚ__str__=s ýz#JinjaSyntaxParsingException.__str__Ú)rrrr cCs$|rd|›�nd}tjj|||d�S)rz: r%r)r Úmessage_templateÚformatrrrrr 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$Ú staticmethodÚstrr r&Ú __classcell__rrrrr 0sý ýüÿr c@s eZdZdZdd„Zdd„ZdS)Ú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|d�ƒ‚dS)Nr%zhUndefined jinja variable: "{this}-{other}". Jinja tried subtraction. Perhaps you meant "{this}_{other}"?)ÚthisÚother)r,Úreplacer/Ú TypeErrorr'r0)rr2rrrÚ__sub__as þÿzUndefinedJinjaVariable.__sub__N)r(r)r*Ú__doc__r$r5rrrrr.[sr.zRendering basic templatecs‡fdd„}t ||¡S)zìThis 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,tdƒ‚t | d¡¡}ˆ}t|ƒdkr€| ¡}t|tƒsvt d|t   |¡|fƒ‚||}q@| ¡}t|tƒsªt d||t   |¡fƒ‚t ||ƒS)Nérz,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_MATCHERÚsub)ÚcontentrGrHrrFrÚ basic_renderks rLcCs²dd„}| d¡dkr(| dd¡\}}n|}d}t |¡}|sHdt|fS| d¡ ¡ ¡}|dvrntd |ƒ‚|d krŽt sŽt   d ¡dt|fS|d kr¤t r¤d ||fSdt|fSdS) Nc SsÐ| d¡rdnd}zRt d¡�4t|tddgd�jfi|¤Ž|WdƒWS1sX0YWnfty¢}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)rKrGÚaddZtemplate_syntax_errorZ unknown_errorrrrÚ jinja_render“s. ü ûúÿ& ÿþz%detect_template..jinja_renderrMéÿÿÿÿr7r%Úbasic)ÚjinjarUz.Unknown template rendering type '%s' requestedrVzcJinja not available as the selected renderer for desired template, reverting to the basic renderer.) Úfindr=Ú TYPE_MATCHERrCrLr9Úlowerr"Ú ValueErrorÚJINJA_AVAILABLEÚLOGZwarning)ÚtextrSÚidentÚrestZ type_matchÚ template_typerrrÚdetect_template’s.  ÿÿ ÿ   racCs4|si}tt |¡ƒ\}}}t d||¡|||ƒS)Nz+Rendering content of '%s' using renderer %s)rarÚload_text_filer\Údebug)ÚfnrGr`ÚrendererrKrrrÚrender_from_fileÄs rfé¤cCst||ƒ}tj|||d�dS)N)Úmode)rfrr)rdZoutfnrGrhÚcontentsrrrÚrender_to_fileÌs rjcCs |si}t|ƒ\}}}|||ƒS)z Render string)ra)rKrGZ_template_typererrrÚ render_stringÑsrkcCspt |¡}||dœ}t||ƒ ¡d}|rHtj|dd�}|sHtd|ƒ‚|dkr^tj |¡nt ||dd�dS) N)ÚvariantÚprefixrMT)Údefaultz.Cannot render template file %s - invalid yaml.ú-Úw)Zomode) rrbrkÚrstripZ load_yamlr:ÚsysÚstdoutÚwriter)rlÚtemplateÚoutputZis_yamlrmriZ tpl_paramsÚoutrrrÚrender_templateÙs  ÿrx)rg)N)*r;ZloggingÚrerrÚtypingrZjinja2rZ cloudinitrrrBrZcloudinit.atomic_helperrÚ__annotations__r Z_DebugUndefinedr rPr[rÚ ImportErrorÚAttributeErrorÚobjectZ getLoggerr(r\ÚcompileÚIrXrIr/r r.ZtimedrLrarfrjrkrxrrrrÚs>            + &2