7x50 SR路由器MPLS接口TextFSM模板解析问题求助
7x50 SR路由器MPLS接口表TextFSM模板问题排查与解决
问题背景
解析7x50 SR路由器MPLS接口表CLI输出时,需要捕获包括Admin Groups和SRLG Groups在内的所有信息,并将这两组数据存储为列表。但原模板无法处理组值跨多行的场景,导致两组数据互相污染,出现错误的合并结果。
期望输出
[ ..., { "NAME": "SR1", "IFNAME": "toSR3 ", "PORTID": "1/1/c1/1:0", "ADMINSTATE": "Up", "IPV4OPERATIONALSTATE": "Up", "IPV6OPERATIONALSTATE": "Down", "METRIC": "None", "ADMINGROUPS": [ "Red", "Blue" ], "SRLGGROUPS": [ "One", "Three", "Two" ] }]
实际错误输出
[ ..., { "NAME": "SR1", "IFNAME": "toSR3 ", "PORTID": "1/1/c1/1:0", "ADMINSTATE": "Up", "IPV4OPERATIONALSTATE": "Up", "IPV6OPERATIONALSTATE": "Down", "METRIC": "None", "ADMINGROUPS": [ "Red", "Blue", "Three", "Two" ], "SRLGGROUPS": [ "Blue", "One", "Three", "Two" ] }]
CLI输入示例
System Name : SR1 =============================================================================== MPLS Interfaces =============================================================================== Interface Port-id Adm Opr(V4/V6) TE- metric ------------------------------------------------------------------------------- system system Up Up/Down None Admin Groups None SRLG Groups None toSR2 1/1/c3/1 Up Up/Down None Admin Groups red SRLG Groups seven toSR3 1/1/c1/1:0 Up Up/Down None Admin Groups Red Blue SRLG Groups One Three Two ------------------------------------------------------------------------------- Interfaces : 3 ===============================================================================
原模板问题分析
原模板未区分Admin Groups和SRLG Groups的捕获状态,匹配额外组值的正则表达式是通用的,导致跨多行的组值被错误地同时添加到两个列表中,造成数据污染。
原模板代码:
Value Filldown NAME (\S+) Value Required IFNAME (.*) Value PORTID (\S+) Value ADMINSTATE (Up|Down) Value IPV4OPERATIONALSTATE (Up|Down) Value IPV6OPERATIONALSTATE (Up|Down) Value METRIC (\S+) Value List ADMINGROUPS (\S+) Value List SRLGGROUPS (\S+) Start ^System Name : ${NAME} ^MPLS Interfaces$$ -> MplsInterfaces MplsInterfaces ^\S -> Continue.Record ^${IFNAME}\s+${PORTID}\s+${ADMINSTATE}\s+${IPV4OPERATIONALSTATE}/${IPV6OPERATIONALSTATE}\s+${METRIC}$$ ^\s+Admin Groups\s+${ADMINGROUPS}$$ ^\s+${ADMINGROUPS}$$ -> Continue ^\s+SRLG Groups\s+${SRLGGROUPS}$$ ^\s+${SRLGGROUPS}$$ EOF
解决方案:状态转换式TextFSM模板
通过状态转换明确区分不同组的捕获阶段,解决跨多行组值的匹配问题:
Value Filldown NAME (\S+) Value Required IFNAME (\S+) Value PORTID (\S+) Value ADMINSTATE (Up|Down) Value IPV4OPERATIONALSTATE (Up|Down) Value IPV6OPERATIONALSTATE (Up|Down) Value METRIC (\S+) Value List ADMINGROUPS (\S+) Value List SRLGGROUPS (\S+) Start ^System Name : ${NAME} ^MPLS Interfaces$$ -> MplsInterfaces MplsInterfaces ^${IFNAME}\s+${PORTID}\s+${ADMINSTATE}\s+${IPV4OPERATIONALSTATE}/${IPV6OPERATIONALSTATE}\s+${METRIC}$$ ^\s+Admin Groups\s+${ADMINGROUPS} -> AdminGroups AdminGroups ^\s+${ADMINGROUPS}$$ ^\s+SRLG Groups\s+${SRLGGROUPS} -> SrlgGroups SrlgGroups ^\s+${SRLGGROUPS}$$ ^\S+\s+\S+\s+(Up|Down)\s+(Up|Down)/(Up|Down)\s+\S+$$ -> Continue.Record ^${IFNAME}\s+${PORTID}\s+${ADMINSTATE}\s+${IPV4OPERATIONALSTATE}/${IPV6OPERATIONALSTATE}\s+${METRIC}$$ -> MplsInterfaces ^-+ -> Record ^=+ -> End
模板工作原理
- 状态逐级转换:依次进入
MplsInterfaces(捕获接口基础信息)→AdminGroups(捕获Admin Groups跨多行值)→SrlgGroups(捕获SRLG Groups跨多行值)状态,明确区分当前捕获的对象,避免数据混淆。 - 接口分隔处理:核心逻辑是在
SrlgGroups状态中识别下一个接口行:- 第一行匹配接口行格式,先记录当前接口的完整数据,同时保留当前行供后续解析;
- 第二行正式捕获接口行并切换回
MplsInterfaces状态,开始处理下一个接口。
- 收尾逻辑:匹配分隔线
^-+时记录最后一个接口数据,匹配等号线^=+时结束解析,避免捕获无关的CLI内容。
内容的提问来源于stack exchange,提问作者user1326
相关产品推荐
相关产品推荐

