是否可以使用 Jinja2 模板对文档中的参数进行逆向工程?

Bal*_*jdu 7 python jinja2

Jinja2的一般工作流程是params + Jinja2 template = generated document

from jinja2 import Template
t = Template("Hello {{ something }}!")
t.render(something="World")
>>> u'Hello World!'
Run Code Online (Sandbox Code Playgroud)

是否可以使用 Jinja2 模板对文档中的参数进行逆向工程?换句话说,我正在寻找以下内容:Jinja2 模板 + 生成的文档 = params

from jinja2 import Template
t = Template("Hello {{ something }}!")
t.reverse("Hello World!")
>>> {"something" : "World"}
Run Code Online (Sandbox Code Playgroud)

json 输出不是必需的,但它会很方便。

如果不是,创建这样的逻辑的好方法是什么?

上下文: 我使用 Jinja2 生成 Cisco 交换机配置文件,如果能够提取过去生成的文档,这将是一个很好的功能,并且我不想显示 1000 多行配置脚本,而是只想列出参数。我知道可以通过将所有参数存储在一个简单的数据库中来解决这个问题,但目前我没有设置数据库,如果可能的话,我会避免它。

小智 0

这可行,但它只是提取所有参数。它不会告诉您顺序或它们之间的关系:

import textfsm
import tempfile
import re
import pprint

j2template = open(<template_file_path>)

find_txt = '(\{\{.+?\}\})'
all_variables = re.findall(find_txt, j2template.read())
variable_set = set()

for variable in all_variables:
    variable_set.add( variable )
    
value_block_txt = ''
for value in variable_set:
    value = value.replace('.', '')
    value_block_txt += "Value List {val_text} (\S+)\n".format(val_text = value.strip('{}\ '))

fsm_regex_block = '''
Start
'''
j2template = open(<filepath>)
for line in j2template.readlines():
    replace_list = [var for var in variable_set if(var in line)]
    if len(replace_list) > 0: 
        for string in replace_list:
                line = line.replace(string, "${"+string.replace('.', '').strip('{}. ')+"}") 
        line = "  ^"+line
        fsm_regex_block += line
        
textfsm_template = value_block_txt
textfsm_template += fsm_regex_block

f = open(<temp_file_path>, 'w+')
f.write(textfsm_template)
f.close()

fsm = textfsm.TextFSM(open(<temp_file_path>))
original_variables_list_of_lists = fsm.ParseText(jinja_device_config_output)

print(original_variables_list_of_lists)

os.unlink(f)
Run Code Online (Sandbox Code Playgroud)

输出列表的列表,例如:

[
    [
        ['1', '1', '1'],
        ['12'],
        ['abcd.1234.0000'],
        ['1', '1', '12'],
        [
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V', 
            'CGNLTEST123V'
            ],
        [
            'fe81:::::/127'
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

然后,您可以对每个变量的输入参数列表进行重复数据删除以获得原始值。