我使用python解析器来解析网络设备配置文件。例如,vprn服务的文本内容如下(第一行的缩进为8个空格字符):
vprn 5000122 customer 99999 create
description "LastMod: Jan 28, 2022 2:33:11 AM"
vrf-import "VPRN-5000122-IMPORT"
vrf-export "VPRN-5000122-EXPORT"
router-id 95.95.95.95
autonomous-system 5555
route-distinguisher 4444:8888888
auto-bind-tunnel
resolution-filter
ldp
exit
resolution filter
exit
interface "*dummy-1* L3 interface" create
description "*** single blank-space description ***"
address 199.199.199.199/32
exit
interface "*dummy-2* L3 interface" create
description "*** double blank-space description ***"
address 201.201.201.201/32
exit
service-name "dumy vprn-service"
no shutdown
exit创建ttp模板时,必须有完全相同的缩进才能匹配配置数据中的行,链接如下:
<group name="service">
<group name="vprn.{{ service_id }}**">
vprn {{service_id | _start_ }} customer {{customer_id}} create
description "{{ description | ORPHRASE | default("")}}"
vrf-import "{{ vrf_import }}"
vrf-export "{{ vrf_export }}"
autonomous-system {{ autonous_system }}
route-distinguisher {{ route_distinguisher }}
<group name="interface.{{interface_id}}**">
interface "{{ interface_id | _start_ }}" create
description "{{ description | ORPHRASE }}"
address {{ ipv4_address }}/{{ipv4_mask}}
ip-mtu {{ ip_mtu }}
exit {{ _end_ }}
</group>
service-name "{{ service_name }}"
no shutdown {{ state | set("enabled") | default("disabled") }}
exit {{ _end_ }}
</group>在配置文件中,如果从每行的开头删除4个空格字符,则必须对模板进行类似的更改,否则解析的输出将为空。
解析器中是否有一些设置允许我对具有不同缩进大小的配置数据使用相同的模板?
谢谢
发布于 2022-04-08 15:17:37
我经常使用TTP。在这种情况下,我再添加一个相同的数据,这样它就可以根据差距捕获类似的数据,这样我就可以提供数据。(例如:跳限,跳Limit_2)
示例代码:
ttp_template = """
<group name="MPLS_Lsp_Path_Detail">
LSP Name : {{LSP_Name}}
Path LSP ID : {{Path_LSP_id}}
From : {{From}} To : {{To}}
Admin State : {{Admin_State}} Oper State : {{Oper_State}}
Path Name : {{Path_Name}} Path Type : {{Path_Type}}
Path Admin : {{Path_Admin_State}} Path Oper : {{Path_Oper_State}}
Out Interface : {{Out_Interface}} Out Label : {{Out_Label}}
Path Up Time : {{Path_Uptime_Date}} {{Path_Uptime_Time}} Path Down Time : 0d 00:00:00
Retry Limit : 0 Retry Timer : {{Retry_Time}} sec
Neg MTU : {{Neg_Mtu}} Oper MTU : {{Oper_Mtu}}
Hop Limit : {{Hop_Limit}} Oper HopLimit : {{Oper_Hop_Limit}}
Hop Limit_2 : {{Hop_Limit2}} Oper HopLimit : {{Oper_Hop_Limit2}}
Hold Priority : {{Hold_Priority}} Oper Hold Priority : 0
</group>
"""
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
# print result in JSON format
results = parser.result(format='json')[0]
print(results)示例运行:
[
{
"MPLS_Lsp_Path_Detail": [
{
"Admin_State": "Up",
"From": "10.95.204.13",
"Hold_Priority": "0",
"Hop_Limit": "255",
"LSP_Name": "lsp_to_A_CUSTOMER",
"Neg_Mtu": "1982",
"Oper_Hop_Limit": "255",
"Oper_Mtu": "1982",
"Oper_State": "Up",
"Out_Interface": "1/1/5:481",
"Out_Label": "7452",
"Path_Admin_State": "Up",
"Path_LSP_id": "14922",
"Path_Name": "lsp_to_B_CUSTOMER",
"Path_Oper_State": "Up",
"Path_Type": "Standby",
"Path_Uptime_Date": "10d",
"Path_Uptime_Time": "21:12:42",
"Retry_Time": "30",
"To": "10.36.111.104"
},
{
"Admin_State": "Up",
"From": "156.67.255.16",
"Hold_Priority": "0",
"Hop_Limit": "255",
"LSP_Name": "gla126-1-to-lon38-1",
"Neg_Mtu": "1500",
"Oper_Hop_Limit": "255",
"Oper_Mtu": "1500",
"Oper_State": "Up",
"Out_Interface": "lag-50",
"Out_Label": "34631",
"Path_Admin_State": "Up",
"Path_Oper_State": "Up",
"Path_Uptime_Date": "0d",
"Path_Uptime_Time": "20:36:35",
"Retry_Time": "30",
"To": "78.33.254.104"
}
]
}
]https://stackoverflow.com/questions/71769204
复制相似问题