Выберите список интерфейсов с помощью Python CISCOCONFPARSE и regex

Я использую двойной цикл для выбора всех интерфейсов GigabitEthernet1/0/1 до 1/0/16 и 2/0/1 до 2/0/16 с помощью эффективного инструмента CISCOCONFPARSE: вот пример, который работает:

CONFIG_PARSED = CiscoConfParse(CONFIG)
for i in range(1,3):
    for j in range(1,17):
        INT = CONFIG_PARSED.find_objects('^interface GigabitEthernet'+str(i)+'/0/'+str(j)+'$')

Вопрос: есть ли способ сделать то же самое, используя простой цикл с регулярным выражением, такой как мой неправильный пример ниже?

for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/[1-16]$')

Этот другой пример ниже является допустимым регулярным выражением, но не позволяет выбирать от 1 до 16 чисел:

для INT в CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/')

спасибо за любую помощь

1 ответ

У вас по сути есть два варианта...

ВАРИАНТ A: Анализируйте номера портов самостоятельно, используя стабильный и поддерживаемый код CiscoConfParse...

import re
from ciscoconfparse import CiscoConfParse

CONFIG_PARSED = CiscoConfParse(CONFIG)
intf_rgx = re.compile(r'interface GigabitEthernet(\d+)\/(\d+)\/(\d+)$')
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
    mm = intf_rgx.search(obj.text))
    card = int(mm.group(1))
    port = int(mm.group(3))
    if card>2:
        continue
    if port>16:
        continue
    ## Do something here with obj

ВАРИАНТ Б: Разбор номера порта разгрузки для парсера номера порта CiscoConfParse (начиная с версии 1.1.5)...

import re
from ciscoconfparse import CiscoConfParse

CONFIG_PARSED = CiscoConfParse(CONFIG, factory=True)
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
    card = obj.ordinal_list[0]
    port = obj.ordinal_list[-1]
    if card>2:
        continue
    if port>16:
        continue
    ## Do something here with obj

FYI, obj.ordinal_list возвращает список целых чисел python, представляющих карту, слот и номер порта интерфейса. Например ordinal_list для "GigabitEthernet2/0/11" есть [2, 0, 11], Вы должны использовать версию 1.1.5 (или выше) и проанализировать с factory=True получить ordinal_list,


НЕ ДЕЛАЙТЕ ЭТОГО:

Приведенный вами пример действительно плох с точки зрения производительности, потому что find_objects() обходит всю конфигурацию Cisco IOS, начинает заканчивать поиск предоставленного регулярного выражения. В случае, если это не очевидно, обходя всю конфигурацию Cisco IOS 32 разных раза с find_objects() очень медленно

CONFIG_PARSED = CiscoConfParse(CONFIG)
for i in range(1,3):
    for j in range(1,17):
        INT = CONFIG_PARSED.find_objects('^interface GigabitEthernet'+str(i)+'/0/'+str(j)+'$')
Другие вопросы по тегам