
Aleksandr
02.09.2016
16:05:58
DLink.DXS
и DLink.DXS_Cisco_CLI

Andrey
02.09.2016
16:06:45
да, надо допиливать профиль
он не собирает ifindex

Google

Aleksandr
02.09.2016
16:07:20
у какого подсмотреть?

Andrey
02.09.2016
16:07:22
2 варианта. Либо приделывать сбор индексов по snmp, либо искать команду на оборудовании, которая показывает индексы для интерфейсов

Aleksandr
02.09.2016
16:07:23
ios?
snmp правильнее в разы
это все стандартный функционал
удивелен, что его до сих пор нет
в том же generic

Andrey
02.09.2016
16:08:27
просто, более правильная политика, когда ifindex отдаёт железка по команде в CLI

Aleksandr
02.09.2016
16:09:12
это очень-очень-очень спорное утверждение

Andrey
02.09.2016
16:09:39
нет. потому что когда отрабатывает профиль SNMP на железке может быть отключён
а ifindex много где могут быть полезны

Aleksandr
02.09.2016
16:09:52
собрать полную таблицу интерфейсов с описаниями - в разы быстрее и проще по snmp, чем лопатить cli
почему это он может быть отключен?

Google

Andrey
02.09.2016
16:10:19
да хоть почему, сети везде разные
def get_ifindex(self):
try:
c = self.cli("show snmp mib ifmib ifindex")
except self.CLISyntaxError:
return {}
r = {}
for l in c.split("\n"):
match = self.rx_ifindex.match(l.strip())
if match:
r[match.group("interface")] = int(match.group("ifindex"))
return r
для циско всё просто
есть аналогичная команда для длинка?

Aleksandr
02.09.2016
16:10:48
в погоне не пойми зачем - ломаете полноценный функционал, который работает везде и отключать snmp - это частный случай
приплыли... через cli смотрим в snmp

Andrey
02.09.2016
16:11:14
никто его не ломал
просто, получение индексов для профиля Длинка не неписано
сложно сломать то, чего нет

Aleksandr
02.09.2016
16:11:57
это реально закат солнца вручную

Andrey
02.09.2016
16:12:29
не понял аналогии. минуту, я найду профиль где это сделано через SNMP

Ivan
02.09.2016
16:13:53
Можно ведь волк сделать, из этого построить соответствие

Andrey
02.09.2016
16:14:58
def get_ifindex_map(self):
"""
Retrieve name -> ifindex map
"""
m = {}
if self.has_snmp():
try:
# IF-MIB::ifDescr
t = self.snmp.get_table("1.3.6.1.2.1.2.2.1.2")
for i in t:
if t[i].startswith("ControlEthernet"):
continue
m[self.profile.convert_interface_name(t[i])] = i
except self.snmp.TimeOutError:
pass
else:
s = self.cli("show snmp interface")
for l in s.splitlines():
match = self.rx_ifindex.match(l)
if match:
if match.group("name").startswith("ControlEthernet"):
continue
m[self.profile.convert_interface_name(match.group("name"))] = match.group("ifindex")
return m
вот, эту функцию можно использовать, для допиливания профиля
если есть SNMP - делаем через таблицу, если нет - выполняем команду
возвращает словарь вида {имя_интерфейса: индекс}. Сама функция из IOSXR профиля
поскольку, профиль для Dlink, можно проконсультироваться у @dmitryluhtionov


Aleksandr
02.09.2016
16:21:15
для меня дико на это смотреть.... даже представить не мог, что сбора счетчиков и описания по интерфейсам не используется snmp... который быстрее и легче cli и стандартный для огромного количества железа

Andrey
02.09.2016
16:22:25
стандартный, это сильно сказано. Там тоже есть свои заморочки
НОКу SNMP никогда, особо, был не нужен
он понадобился только с включением PM

Google

Aleksandr
02.09.2016
16:23:06
что касается ifmib - именно стандартный

Andrey
02.09.2016
16:23:28
и как по нему получить поддерживает интерфейс CDP или нет?

Aleksandr
02.09.2016
16:23:31
прочие выкрутасы с прошивками - да

Andrey
02.09.2016
16:23:38
или включён там STP или нет?
по интерфейсам собирается огромное количество информации
индексы, это только малая часть
вланы, поддерживаемые протоколы, IP адреса ...

Алексей
02.09.2016
16:24:57

Aleksandr
02.09.2016
16:25:17
дык в generic засунуть?
если snmp включен - собрать по snmp
есть же часть

Алексей
02.09.2016
16:25:38
Ну вот скрипт как раз
Его просто никто не делал

Andrey
02.09.2016
16:26:02
можно get_ifindex вынести в Generic
или в __init__.py прописать функцию

Алексей
02.09.2016
16:26:25
А он там вроде и есть

Aleksandr
02.09.2016
16:26:31
ifindex,ifname,ifdescr,ifalias

Алексей
02.09.2016
16:26:53
Ну да

Andrey
02.09.2016
16:26:54
нет, нету

Алексей
02.09.2016
16:27:03
Вот как раз их и надо сделать

Google

Andrey
02.09.2016
16:27:20
ой)
в смысле есть такой
можно пользоваться
get_ifindexes.py
вызывать из скрипта интерфейсов
self.scripts.get_ifindexes()

Aleksandr
02.09.2016
16:29:48
только его надо бы допилить, чтоб и имена интерфейсов собирал все - ifname,ifdescr,ifailas и использовал то, что ему будет сказано использовать, ибо удобочитаемые описания портов сидят в ifalias обычно

Andrey
02.09.2016
16:29:57
зачем?
это всё и без него собирается

Aleksandr
02.09.2016
16:31:07
я привел пример для dxs_cisco_cli - на графиках висит описание, которое вообще висит на вилане, но оно висит на всех физических интерфейсах, вместо описаний на этих интерфейсах, а чисто dxs пока еще толком не рисовал

Andrey
02.09.2016
16:31:45
это означает что надо поправить скрипт, в плане забирания описания интерфейсов.
через cli можно забрать

Aleksandr
02.09.2016
16:51:30
ifdescr у dlink выглядит так 'D-Link DGS-3120-24SC R4.00.B02 Port 1 on Unit 1' а описание лежит в ifalias
и не все так просто... с self.scripts.get_ifindexes() , т.к. он возвращает {'1': 1,
'10': 10,
'11': 11,
'12': 12,
'13': 13,
'14': 14,
'15': 15,
'16': 16,
'17': 17,
'18': 18,
'19': 19,
'2': 2, '802.1Q Encapsulation Tag 2269': 3292,
'9': 9, тогда как имена портов идут, в данном случае, 1:1 1:10 1:24, а если железка будет в стеке, то будут 2:1 2:11 и т.д. а индекс будет только накручиваться, т.ч. тут пилить и пилить

Andrey
02.09.2016
17:29:00
он возвращает ifmib, таблицу
что в ней, то и возвращает
различные преобразования и разбор делаются в get_interfaces
и не саму таблицу, а ifDescr: ifIndex

Aleksandr
03.09.2016
08:18:27
не все так просто, как хотелось бы.... des3526,des3200 по snmp отдают ifname как 1/1-1/24 при этом cli показывает порты как 1-24, при этом ifdescr для 3526 пишет RMON Port 19 on Unit 1, а 3200 пишет D-Link DES-3200-28 R4.38.B010 Port 28, но по snmp тоже 1/28, т.е. настроить однообразный вывод имени интерфейса для сопоставления snmp ifindex с cli port index - не просто... видимо придется для каждой модели свой метод прописывать
на свичах аля 3120 и 3420 D-Link DGS-3420-28SC R1.77.B00 Port 6 on Unit 1 в cli порт идут как slot:port, а по snmp тоже slot/port

Google

Алексей
03.09.2016
10:31:38

Aleksandr
03.09.2016
12:34:03
нужно как-то замапить альтернативные имена интерфейсов... по snmp идет как 1/1, локально 1:1, по lldp на удаленной машине - 1/1... прикрутил 1:1 к индексам, но теперь lldp отвалился - Trying to guess remote port 1/1 ... куда копать?
а 1/1 он видит с удаленного свича

Алексей
03.09.2016
12:45:48
там метод есть для этого
convert_interface_name
в __init__.py обычно лежит

Aleksandr
03.09.2016
12:50:32
этого мало
ибо тут смотрит на lldp
метод нашел и поправил, только с lldp не вяжется, потому что видит на удаленной стороне 1/1 а локально на этом свиче такого интерфейса нет

Ivan
03.09.2016
12:53:13
Может, везде делать перебор slot:port, slot:port, slot-port?

Aleksandr
03.09.2016
12:56:18
тут перебирает /services/discovery/jobs/box/lldp.py
можно как-то сохранять два имени интерфейса под одним индексом?
т.с. альтернативные имена...
это косяк длинка, тут без вариантов, по snmp и в сеть одно отдает, в cli другое

Andrey
03.09.2016
13:48:19
lldp при линковке интерфесов выполняет для них convert_interface_name
соответственно профилю
вернее не lldp а discovery

kk
03.09.2016
14:47:23

Aleksandr
03.09.2016
15:37:45
lldp при линковке интерфесов выполняет для них convert_interface_name
это сложнее сделать, когда опрашиваешь cisco а в удаленном порту dlink , который светит порт как отдает в snnp, а все локально хранит как в cli, т.е. откуда cisco знать, как конвертировать чужое оборудование, поэтому тут либо все порты приводить к виду как в snmp, либо писать глобальный костыль в base.py

Andrey
03.09.2016
15:44:34
когда линкуются интерфесы, уже есть определённость по MO, а значит, понятно, чей конвертер применять