有没有办法在TextFSM中继续使用同一行的状态更改?

2024-10-05 11:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我不能将状态转换与continue语句结合起来

我试图用ansible解析网络配置,其中唯一清晰的一行结尾是下一行的开头

例如,我想如下解析配置:

line vty 0 4
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
line vty 5 16
 access-class 95 in vrf-also
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
 history size 25
 transport input ssh
line vty 15 116
 access-class 95 in
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
 history size 25

我正在使用的模板:

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
  ^line vty ${LINE}.*$$ -> Continue.Record

因此,我必须知道的唯一确定的方法是,我已经完成了vty04,例如,vty516启动

因此,可以继续使用该行以保存新的vty? 当前我的模板正在nextone中保存前一行的配置。我没有办法知道哪条线是最后的可能

Current result:
[
    {
        "LINE": "0 4",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "5 16",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "15 116",
        "aclDir": "in",
        "vrfAlso": "vrf-also",
        "vtyAcl": "95"
    }
]

Desired Result:
[
    {
        "LINE": "0 4",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "5 16",
        "aclDir": "in",
        "vrfAlso": "vrf-also",
        "vtyAcl": "95"
    },
    {
        "LINE": "15 116",
        "aclDir": "in",
        "vrfAlso": "",
        "vtyAcl": "95"
    }
]

更新:这里是针对此特定问题的解决方案更新。谢谢

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^line vty -> Continue.Record
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
  ^line vty ${LINE}.*$$ 

Tags: inaccessvaluelinetimeoutclassaccountingexec
1条回答
网友
1楼 · 发布于 2024-10-05 11:42:58

我一直在寻找同一个问题的答案,但没有找到(只找到了你的问题:)。 阿法克:

  1. TextFSM不支持前向/后向正则表达式功能
  2. 正如您已经写过的,TextFSM不支持记录+继续(状态更改),正如他们在文档中所述:“注意,继续操作不接受状态转换。这确保了状态机是无循环的。”
  3. 如果在“line vty X Y”行之前有一个空字符串(或信息块的任何其他分隔符),我们可以使用TextFSM的states

我现在使用的解决方法是什么?因此,我使用了几个模板,一个模板提取VTY编号和一个用于此行的参数。然后将结果组合在一起

但在您的情况下,每个“line vty X Y”块只有一个“有趣的”行,而这一行不是“line vty X Y”块中的最后一行,因此您可以使用正确的正则表达式(我稍微更正一下您的模板-vrfAlso“may be”或“may NOT”存在)和一点TextFSM技巧:)

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^line vty ${LINE}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s*(${vrfAlso})?.*$$ -> Record
  ^.* -> Record

EOF

在这里,我们使用“^.*->;记录”来记录没有“有趣”字符串的行

你会得到你想要的结果(我想):

LINE    vtyAcl    aclDir    vrfAlso
                     -
0 4
5 16    95        in        vrf-also
15 116  95        in

不幸的是,在我的例子中,我有多个“有趣的”字符串,它们可能是一个块中的最后一个,因此它对我不起作用(

更新:我无意中发现了TextFSM展望未来的方式。它给了我一个如何为我的任务找到解决方案的想法,主要思想如下所述:https://github.com/google/textfsm/issues/22

相关问题 更多 >

    热门问题