首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python解析器和模板缩进

python解析器和模板缩进
EN

Stack Overflow用户
提问于 2022-04-06 15:04:50
回答 1查看 397关注 0票数 1

我使用python解析器来解析网络设备配置文件。例如,vprn服务的文本内容如下(第一行的缩进为8个空格字符):

代码语言:javascript
复制
    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模板时,必须有完全相同的缩进才能匹配配置数据中的行,链接如下:

代码语言:javascript
复制
<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个空格字符,则必须对模板进行类似的更改,否则解析的输出将为空。

解析器中是否有一些设置允许我对具有不同缩进大小的配置数据使用相同的模板?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-04-08 15:17:37

我经常使用TTP。在这种情况下,我再添加一个相同的数据,这样它就可以根据差距捕获类似的数据,这样我就可以提供数据。(例如:跳限,跳Limit_2)

示例代码:

代码语言:javascript
复制
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)

示例运行:

代码语言:javascript
复制
[
    {
        "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"
            }
        ]
    }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71769204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档