Python CiscoConfParse。如何通过中间的命令获得完整的块?

问题描述 投票:0回答:2

我需要通过中间的某个命令来获取块的完整配置。 在下面的示例中,我得到了一个不完整的块,其中缺少更多缩进的子项“ip 10.2.2.1”。

from ciscoconfparse import CiscoConfParse
from pprint import pprint

config = """
hostname switch
interface Vlan2
  description vlan2
  ip address 10.2.2.3/24
  hsrp 2
    ip 10.2.2.1
interface Vlan3
  description vlan3
  ip address 10.3.3.3/24
  hsrp 3
    ip 10.3.3.1
""".splitlines()
ccp = CiscoConfParse(config=config)
blocks = ccp.find_blocks("10.2.2.3/24")
print(blocks)  # ['interface Vlan2', '  description vlan2', '  ip address 10.2.2.3/24', '  hsrp 2']

帮助我找到获得下一个输出的优雅方法(使用“ip 10.2.2.1”)

['interface Vlan2', '  description vlan2', '  ip address 10.2.2.3/24', '  hsrp 2', 'ip 10.2.2.1']
python cisco ciscoconfparse
2个回答
1
投票
for block in ccp.find_objects_w_child("interface", "ip address 10.2.2.3/24"):  # find interfaces with this ip
    # Print block line and all children
    print([c.text for c in (block, *block.all_children)])

似乎可以解决问题。 我认为可能有一种更简单的方法来打印块及其子块,但我对

ciscoconfparse
API 不太熟悉。


1
投票

使用 CiscoConfParse 1.9.37...

from ciscoconfparse import CiscoConfParse

config = """
hostname switch
interface Vlan2
  description vlan2
  ip address 10.2.2.3/24
  hsrp 2
    ip 10.2.2.1
interface Vlan3
  description vlan3
  ip address 10.3.3.3/24
  hsrp 3
    ip 10.3.3.1
""".splitlines()

ccp = CiscoConfParse(config=config.splitlines())
# Use recurse=True to search through multiple child levels...
#    Use \d to ensure that you select the HSRP address instead of 'ip address'
addrobj = ccp.find_child_objects("interface\s+Vlan2", "ip\s+\d\S+", recurse=True)[0]
hsrp_addr = addrobj.re_match("ip (\S.+)")
print(hsrp_addr)
print("")
print(hsrp_addr.lineage)

打印:

10.2.2.1

[<IOSCfgLine # 1 'interface Vlan2'>, <IOSCfgLine # 4 '  hsrp 2' (parent is # 1)>, <IOSCfgLine # 5 '    ip 10.2.2.1' (parent is # 4)>]

要获取完整的父对象块,只需在该对象上使用

all_parents
...

你应该避免

find_blocks()
,总的来说它不如
find_child_objects()

那么有用
© www.soinside.com 2019 - 2024. All rights reserved.