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

时间:2016-06-14 13:30:51

标签: python jinja2

Jinja2的一般工作流程是 params + Jinja2模板=生成文档

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

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

from jinja2 import Template
t = Template("Hello {{ something }}!")
t.reverse("Hello World!")
>>> {"something" : "World"}

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

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

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

1 个答案:

答案 0 :(得分: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)

输出列表列表,例如: [[['1','1','1'],['12'],['abcd.1234.0000'],['1','1','12'],['CGNLTEST123V',' CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V :: / 127']]]

然后可以将每个变量的输入参数列表去重复,以获取原始值。