собирать показывать вывод соседа cdp

Здесь я зашел в тупик со своим кодом. Не знаю, как мне исходить из этого.

Описание моего проекта: Я хочу получить топологию своей сети. С помощью сценария я хочу войти на свое основное устройство, а затем запустить команду show cdp neighbour details. Получив вывод, я хочу составить список подключенных устройств, а затем он будет подключаться к этим устройствам одно за другим, чтобы делать для них то же самое, что и для основного устройства, пока не останется больше устройств. Возвращение я хочу поместить в файл.csv.

Мне нужна следующая информация: Имя устройства Устройство IP Модель устройства Интерфейсы, которые соединяют устройство с его родительским устройством. Если какой-либо VTP, я тоже хочу это, возможно, захочу добавить к нему больше позже. Возможно, серийный номер и программное обеспечение из выставочной версии. (Но это на потом)

В приведенном ниже коде я вхожу в систему и получаю выходные данные от двух соседних коммутаторов. У меня проблемы с созданием нового списка или словаря, который, вероятно, лучше для каждого устройства.

import netmiko
import re
from functions import connect_switch
 
# Connect_switch is from another .py that login to the device
connect_switch()
 
device = connect_switch()
 
net_connect = netmiko.ConnectHandler(**device)
net_connect.enable()
command = net_connect.send_command('show cdp neighbors detail')
net_connect.disconnect()
 
output = command.split('\n')
print(output)
 
find_devices = [output.index(i) for i in output if 'Device ID:' in i]
find_ips = [output.index(i) for i in output if 'IP address:' in i]
find_ips = list(dict.fromkeys(find_ips)) #Had to add this line. To not have dublicate returns in my find_ips list. Without this it returns <class 'list'>: [3, 3, 25, 25]
find_platform = [output.index(i) for i in output if 'Platform: cisco ' in i]
find_src_int = [output.index(i) for i in output if 'Interface:' in i]
find_dst_int = [output.index(i) for i in output if '(outgoing port):' in i]
find_vtp = [output.index(i) for i in output if 'VTP Management Domain:' in i]
 
for i in find_devices:
    dev = re.match(r'Device ID: (.*)', output[i].rstrip(), re.M | re.I)
    if dev:
        device = dev.group(1)
        print('Device is: ' + device)
 
for i in find_ips:
    ip_adr = re.match(r'  IP address: (.*)', output[i].rstrip(), re.M | re.I)
    if ip_adr:
        ip_address = ip_adr.group(1)
        print('IP is: ' + ip_address)
 
# for some reason the find_platform returns <class 'list'>: [4, 4] where i would have expected [4, 26]
# Dont know if its because its the same platform on both devices
for i in find_platform:
    plat = re.match(r'(.*): (.*),', output[i].rstrip(), re.M | re.I)
    if plat:
        platform = plat.group(2)
        print('Remote Switch model is: ' + platform)
 
for i in find_src_int:
    int = re.match(r'Interface: (.*),  (.*) (.*) (.*)', output[i].rstrip(), re.M | re.I)
    if int:
        src_int = int.group(1)
        dst_int = int.group(4)
        print('Src Int is: ' + src_int)
        print('Dst Int is: ' + dst_int)
 
for i in find_vtp:
    vtp = re.match(r"VTP Management Domain: '(.*)'", output[i].rstrip(), re.M | re.I)
    if vtp:
        vtp_domain = vtp.group(1)
        print('VTP is: ' + vtp_domain)

Вывод переменной: output находится здесь:

['-------------------------', 'Идентификатор устройства: Устройство1', 'Адрес (а) входа:', 'IP-адрес: 1.1.1.1 ',' Платформа: cisco WS-C3560CG-8PC-S, Возможности: Switch IGMP ', ' Интерфейс: GigabitEthernet0/10, ID порта (исходящий порт): GigabitEthernet0/9', ' Время удержания: 172 сек ',' ', 'Версия:', 'Программное обеспечение Cisco IOS, Программное обеспечение C3560C (C3560c405ex-UNIVERSALK9-M), Версия 15.2(2)E7, ВЫПУСКАТЬ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (fc3)', 'Техническая поддержка: http://www.cisco.com/techsupport', 'Copyright (c) 1986-2017 компанией CiscoSystems, Inc. ',' Скомпилировано, среда, 12 июля-17, 16:08, prod_rel_team ',', 'Рекламная версия: 2', 'Протокол Hello: OUI=0x00000C, Идентификатор протокола =0x0112; полезная нагрузка len=27, значение =00000000FFFFFFFF010221FF000000000000BC16F5073B00FF0000', "Домен управления VTP: 'VTP1', 'Собственная VLAN: 1', 'Дуплекс: полный', 'Адрес (а) управления:', 'IP-адрес: 1.1.1.1', '', '------ ------------------- ',' Идентификатор устройства: Device2 ',' Адрес (а) входа: ',' IP-адрес: 2.2.2.2 ',' Платформа: cisco WS-C3560CG-8PC-S, Возможности: Switch IGMP ', ' Интерфейс: GigabitEthernet0/9, ID порта (исходящий порт): GigabitEthernet0/10 ',' Holdtime: 136 sec ',' ',' Version: ',' Cisco Программное обеспечение IOS, программное обеспечение C3560C (C3560c405ex-UNIVERSALK9-M), версия 15.2(2)E7, RELEASE SOFTWARE (fc3)', ' Техническая поддержка: http://www.cisco.com/techsupport ',' Copyright (c) 1986-2017, компания CiscoSystems, Inc. ',' Скомпилировано, среда, 12 июля-17, 16:08, prod_rel_team', '', 'версия рекламы: 2 ',' Протокол Hello: OUI=0x00000C, ID протокола =0x0112; полезная нагрузка len=27, значение =00000000FFFFFFFF010221FF000000000000A41875F29B00FF0000', "Домен управления VTP:' VTP2 '", "Собственная VLAN: 1", "Дуплексный режим: полный", "Адреса управления:', 'IP-адрес: 2.2.2.2, '', '', 'Всего отображено записей cdp: 2']

Вывод с устройства, ip_address, platform, src_int, dst_int и vtp_domain

Устройство: Device1

Устройство: Device2

IP: 1.1.1.1

IP: 2.2.2.2

Модель удаленного коммутатора: cisco WS-C3560CG-8PC-S

Модель удаленного коммутатора: cisco WS-C3560CG-8PC-S

Src Int: GigabitEthernet0/10

Dst Int: GigabitEthernet0/9

Src Int: GigabitEthernet0/9

Dst Int: GigabitEthernet0/10

VTP - это: VTP1

VTP - это: VTP2

1 ответ

Решение

Как вы сказали, лучше использовать словарь:

#!/usr/bin/python3
import pprint, re
 
output = [
 '-------------------------',
 'Device ID: Device1',
 'Entry address(es): ',
 '  IP address: 1.1.1.1',
 'Platform: cisco WS-C3560CG-8PC-S,  Capabilities: Switch IGMP ',
 'Interface: GigabitEthernet0/10,  Port ID (outgoing port): GigabitEthernet0/9',
 'Holdtime : 172 sec',
 '',
 'Version :',
 'Cisco IOS Software, C3560C Software (C3560c405ex-UNIVERSALK9-M), Version '
 '15.2(2)E7, RELEASE SOFTWARE (fc3)',
 'Technical Support: http://www.cisco.com/techsupport',
 'Copyright (c) 1986-2017 by Cisco Systems, Inc.',
 'Compiled Wed 12-Jul-17 16:08 by prod_rel_team',
 '',
 'advertisement version: 2',
 'Protocol Hello:  OUI=0x00000C, Protocol ID=0x0112; payload len=27, '
 'value=00000000FFFFFFFF010221FF000000000000BC16F5073B00FF0000',
 "VTP Management Domain: 'VTP1'",
 'Native VLAN: 1',
 'Duplex: full',
 'Management address(es): ',
 '  IP address: 1.1.1.1',
 '',
 '-------------------------',
 'Device ID: Device2',
 'Entry address(es): ',
 '  IP address: 2.2.2.2',
 'Platform: cisco WS-C3560CG-8PC-S,  Capabilities: Switch IGMP ',
 'Interface: GigabitEthernet0/9,  Port ID (outgoing port): GigabitEthernet0/10',
 'Holdtime : 136 sec',
 '',
 'Version :',
 'Cisco IOS Software, C3560C Software (C3560c405ex-UNIVERSALK9-M), Version '
 '15.2(2)E7, RELEASE SOFTWARE (fc3)',
 'Technical Support: http://www.cisco.com/techsupport',
 'Copyright (c) 1986-2017 by Cisco Systems, Inc.',
 'Compiled Wed 12-Jul-17 16:08 by prod_rel_team',
 '',
 'advertisement version: 2',
 'Protocol Hello:  OUI=0x00000C, Protocol ID=0x0112; payload len=27, '
 'value=00000000FFFFFFFF010221FF000000000000A41875F29B00FF0000',
 "VTP Management Domain: 'VTP2'",
 'Native VLAN: 1',
 'Duplex: full',
 'Management address(es): ',
 '  IP address: 2.2.2.2',
 '',
 '',
 'Total cdp entries displayed : 2'
]
 
device      = { }
device_list = [ ]
for line in output:
    if '-------------------------' in line:
        device       = { }
        device_list += [ device ]
 
    dev = re.match(r'Device ID: (.*)', line, re.M | re.I)
    if dev:
        device["id"] = dev.group(1)
 
    ip_adr = re.match(r'  IP address: (.*)', line, re.M | re.I)
    if ip_adr:
        device["ip"] = ip_adr.group(1)
 
    plat = re.match(r'(.*): (.*),', line, re.M | re.I)
    if plat:
        device["platform"] = plat.group(2)
 
 
pprint.pprint(device_list)

Выход:

[{'id': 'Устройство1',

'ip': '1.1.1.1',

'платформа': ' OUI=0x00000C, ID протокола =0x0112; полезная нагрузка len =27'},

{'id': 'Устройство2',

'ip': '2.2.2.2',

'платформа': ' OUI=0x00000C, ID протокола =0x0112; полезная нагрузка len=27'}]

Другие вопросы по тегам