собирать показывать вывод соседа 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'}]