Access Point Registration Table: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показано 25 промежуточных версий этого же участника) | |||
Строка 3: | Строка 3: | ||
[[Категория:SNMP]] |
[[Категория:SNMP]] |
||
[[Категория:Zabbix]] |
[[Категория:Zabbix]] |
||
+ | |||
+ | |||
=Таблица уровней клиентов для точек доступа Cisco= |
=Таблица уровней клиентов для точек доступа Cisco= |
||
==Задача== |
==Задача== |
||
Строка 89: | Строка 91: | ||
.1.3.6.1.4.1.9.9.273.1.3.1.1.15.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet |
.1.3.6.1.4.1.9.9.273.1.3.1.1.15.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet |
||
</PRE> |
</PRE> |
||
+ | ==Разбор OID== |
||
+ | Как можно видеть, сам OID состоит из нескольких частей |
||
+ | <BR> |
||
+ | Для определенности рассмотрим уровни сигнала: |
||
+ | <PRE> |
||
+ | .1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.3.52.53.48.218.32.96.100.54.149 = INTEGER: -63 dBm |
||
+ | .1.3.6.1.4.1.9.9.273.1.3.1.1.3.2.3.52.53.48.164.69.25.90.239.72 = INTEGER: -89 dBm |
||
+ | </PRE> |
||
+ | <PRE> |
||
+ | CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: da:20:60:64:36:95] = INTEGER: -64 dBm |
||
+ | CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -89 dBm |
||
+ | </PRE> |
||
+ | Часть .1.3.6.1.4.1.9.9.273.1.3.1.1.3 это и есть OID CISCO-DOT11-ASSOCIATION и она общая |
||
+ | <BR> |
||
+ | Далее в самом OID закодировано значение "кому принадлежит сигнал", т е какому клиенту |
||
+ | |||
+ | <BR> Выделенное значение и его описание: |
||
+ | * '''2'''.3.52.53.48.164.69.25.90.239.72 - номер интерфейса, он же ifIndex, dot11Radio0 (1), или dot11Radio1 (2), в примере клиент подключен к 5Ghz интерфейсу (dot11Radio1) |
||
+ | * 2.'''3'''.52.53.48.164.69.25.90.239.72 - Длинна SSID в байтах, в пример 3 символа (SSID в примере "450") |
||
+ | * 2.3.'''52.53.48'''.164.69.25.90.239.72 - коды ASCII символов SSID, их три - "450" |
||
+ | * 2.3.52.53.48.'''164.69.25.90.239.72''' - мак-адрес, 6 байт, записаны в деятичной форме, "a4:45:19:5a:ef:48", например 164(десятичное) = a4(hex), 69(десятичное) = 45 (hex) и так далее. |
||
+ | |||
+ | =Интеграция с Zabbix= |
||
+ | ==SNMP autodiscovery== |
||
+ | Есть дока но мне она не нравится =) |
||
+ | * https://www.zabbix.com/documentation/5.2/ru/manual/discovery/low_level_discovery/snmp_oids |
||
+ | |||
+ | В моем случае правило автообнаружения выглядит так: |
||
+ | <BR> |
||
+ | [[Изображение:Zabbix Discovery.png|600px]] |
||
+ | </BR> |
||
+ | |||
+ | В целом идея такая: |
||
+ | * В поле SNMP OID указываю discovery[{#S},1.3.6.1.4.1.9.9.273.1.3.1.1.3] |
||
+ | * Заббикс сам делает snmpwalk 1.3.6.1.4.1.9.9.273.1.3.1.1.3 и в результате получает список клиентов и их сигналы |
||
+ | <PRE> |
||
+ | snmpwalk -v2c -c MON 192.168.77.2 1.3.6.1.4.1.9.9.273.1.3.1.1.3 -OX |
||
+ | Bad operator (INTEGER): At line 73 in /usr/share/snmp/mibs/ietf/SNMPv2-PDU |
||
+ | CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: 0:8:ca:2b:1:24] = INTEGER: -65 dBm |
||
+ | CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -67 dBm |
||
+ | </PRE> |
||
+ | и на выходе формирует JSON в котором есть поля |
||
+ | "{#SNMPINDEX}" - это часть которую нужно дописать к OID указанному в discovery что бы получить значение |
||
+ | <PRE> |
||
+ | [ |
||
+ | { |
||
+ | "{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36", |
||
+ | "{#S}": "-66" |
||
+ | }, |
||
+ | { |
||
+ | "{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72", |
||
+ | "{#S}": "-66" |
||
+ | } |
||
+ | ] </PRE> |
||
+ | |||
+ | Это выглядит странновато, но суть этого - получить список суффиксов, которые потом можно использовать для получения других значений |
||
+ | <BR> |
||
+ | В поле "{#S}" записан сигнал и его значение я нигде не использую, но в общем случае (для других MIB/OID) тут может быть что-то что можно использовать (в оригинальной документации это имена интерфейсов) |
||
+ | <BR> |
||
+ | В общем случае можно указать несколько OID которые нужно обходить snmpwalk-ом, но при этом нужно держать в голове что SNMPINDEX должен совпадать - так работает для таблицы интерфейсов где по разным префиксам но с одним и тем же ifIndex можно получить данные с интерфейса - имя, дескрипшен, байты и т.п. |
||
+ | |||
+ | Если же указать 2 OID с разной структурой (например интерфейсы и таблицу регистрации клиентов) то ничего хорошего не получится - данные будут перемешаны (подробно я не смотрел код как именно и почему ) |
||
+ | |||
+ | |||
+ | |||
+ | Далее при создании прототипов элементов данных можно использовать "{#SNMPINDEX}" и тогда все остальные переменны в JSON полученном при discovery будут доступны |
||
+ | |||
+ | Например, если при создании прототипа данныхь указать OID=.1.3.6.1.4.1.9.9.273.1.3.1.1.2.{#SNMPINDEX} то (для моего примера будет автоматически создано 2 элемента данных, в именах которых можно использовать например значение макроса "{$S}". Это хорошо ложиться на пример с интерфейсом, но в моем случае этот макрос как и остальные совершенно бесполезен так как вся статическая информация закодирована в OID который собственно доступен через макрос "{SNMPINDEX}" |
||
+ | |||
+ | ==Processing== |
||
+ | Для того что бы получить нужные данные в удобном виде полученный при discovery JSON можно редактировать с помошью встроенного JavaScript |
||
+ | |||
+ | В моем случае на скорую руку вышел вот такой скрипт: |
||
+ | <PRE> |
||
+ | var records = JSON.parse(value); |
||
+ | |||
+ | for (i = 0; i < records.length; i++) { |
||
+ | var OID = records[i]["{#SNMPINDEX}"].split('.') |
||
+ | // IFINDEX AND IFNAME |
||
+ | var dot1RadioIfIndex = OID.shift(); |
||
+ | records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex |
||
+ | records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString() |
||
+ | |||
+ | // get mac as 6 last digits converted dec -> hex and joined with ':' |
||
+ | var MAC = "" |
||
+ | var MACDigitHex |
||
+ | for (j = 0; j < 6; j++) { |
||
+ | MACDigitDec = OID.pop(); |
||
+ | |||
+ | MACDigitHex = parseInt(MACDigitDec).toString(16); |
||
+ | MAC = MACDigitHex + " " + MAC |
||
+ | } |
||
+ | records[i]['{#MAC}'] = MAC.trim().split(" ").join(":") |
||
+ | |||
+ | // SSID. The first octet is length, others are ASCII characters |
||
+ | SSID = "" |
||
+ | ssidLength = OID.shift(); |
||
+ | |||
+ | for (j = 0; j < ssidLength; j++) { |
||
+ | SSID += String.fromCharCode(parseInt(OID[j])); |
||
+ | |||
+ | } |
||
+ | records[i]['{#SSID}'] = SSID |
||
+ | } |
||
+ | return JSON.stringify(records); |
||
+ | </PRE> |
||
+ | Идея в том что бы добавить поля построенные на основе SNMPINDEX в Json, и в дальнейшем они будут доступны при создании элементов данных |
||
+ | |||
+ | |||
+ | В результате из исходного JSON получаю такой |
||
+ | <PRE> |
||
+ | [ |
||
+ | { |
||
+ | "{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36", |
||
+ | "{#S}": "-62", |
||
+ | "{#DOT1RADIO_IFINDEX}": "1", |
||
+ | "{#DOT1RADIO_IFNAME}": "Dot11Radio0", |
||
+ | "{#MAC}": "0:8:ca:2b:1:24", |
||
+ | "{#SSID}": "450" |
||
+ | }, |
||
+ | { |
||
+ | "{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72", |
||
+ | "{#S}": "-79", |
||
+ | "{#DOT1RADIO_IFINDEX}": "2", |
||
+ | "{#DOT1RADIO_IFNAME}": "Dot11Radio1", |
||
+ | "{#MAC}": "a4:45:19:5a:ef:48", |
||
+ | "{#SSID}": "450" |
||
+ | } |
||
+ | ] |
||
+ | </PRE> |
||
+ | который уже содержит статическую информацию о клиенте и который можно использовать для создания элеметов данных |
||
+ | |||
+ | ==Прототпипы элементов данных== |
||
+ | Формируем имя и ключ на основе данных из Json, например |
||
+ | <PRE> |
||
+ | Name cDot11ClientSignalStrength [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ] |
||
+ | </PRE> |
||
+ | где для кажого клиента будет создан отдельный элемент данных, <BR> |
||
+ | при этом используются три уникальных значения. <BR> |
||
+ | <BR> |
||
+ | Другими словами ключ (SNMP OID) составляется из префикса который статичен для каждого типа данных и суффкса который SNMPINDEX и зависит от клиента (мака, SSID и интерфейса) |
||
+ | <BR> |
||
+ | Клиент с тем же маком но подключившись в другом диапазоне (другой интерфейс) рассматривается как другой клиент даже если используется один SSID для разных частот) |
||
+ | <BR> |
||
+ | [[Изображение:Item Prototype.png|600px]] |
||
+ | <BR> |
||
+ | Все элементы данных в целом полностью аналогичны |
||
+ | |||
+ | ==Готовый Темплейт== |
||
+ | {{#spoiler:show=zabbix template| |
||
+ | |||
+ | <PRE> |
||
+ | <?xml version="1.0" encoding="UTF-8"?> |
||
+ | <zabbix_export> |
||
+ | <version>5.0</version> |
||
+ | <date>2022-08-21T13:15:45Z</date> |
||
+ | <groups> |
||
+ | <group> |
||
+ | <name>Templates/Modules</name> |
||
+ | </group> |
||
+ | </groups> |
||
+ | <templates> |
||
+ | <template> |
||
+ | <template>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</template> |
||
+ | <name>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</name> |
||
+ | <groups> |
||
+ | <group> |
||
+ | <name>Templates/Modules</name> |
||
+ | </group> |
||
+ | </groups> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientBytes</name> |
||
+ | </application> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | <application> |
||
+ | <name>cDot11ClientPackets</name> |
||
+ | </application> |
||
+ | <application> |
||
+ | <name>cDot11Clients</name> |
||
+ | </application> |
||
+ | <application> |
||
+ | <name>cDot11ClientSignal</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <discovery_rules> |
||
+ | <discovery_rule> |
||
+ | <name>cDot11ActiveWirelessClientsCount</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>discovery[{#CLIENTSCOUNT},1.3.6.1.4.1.9.9.273.1.1.2.1.1]</snmp_oid> |
||
+ | <key>cDot11ActiveWirelessClientsCount</key> |
||
+ | <lifetime>300d</lifetime> |
||
+ | <item_prototypes> |
||
+ | <item_prototype> |
||
+ | <name>cDot11ActiveWirelessClientsCount [ {#DOT1RADIO_IFNAME} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>1.3.6.1.4.1.9.9.273.1.1.2.1.1.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ActiveWirelessClientsCount[{#DOT1RADIO_IFNAME}]</key> |
||
+ | <units>Devices</units> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11Clients</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | </item_prototype> |
||
+ | </item_prototypes> |
||
+ | <graph_prototypes> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ActiveWirelessClientsCoun [ {#DOT1RADIO_IFNAME} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ActiveWirelessClientsCount[{#DOT1RADIO_IFNAME}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | </graph_prototypes> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>JAVASCRIPT</type> |
||
+ | <params>Zabbix.Log(3, value) |
||
+ | |||
+ | var records = JSON.parse(value); |
||
+ | |||
+ | for (i = 0; i < records.length; i++) { |
||
+ | var dot1RadioIfIndex = records[i]["{#SNMPINDEX}"] |
||
+ | records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex |
||
+ | records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString() |
||
+ | } |
||
+ | Zabbix.Log(3, JSON.stringify(records)) |
||
+ | return JSON.stringify(records);</params> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </discovery_rule> |
||
+ | <discovery_rule> |
||
+ | <name>CISCO-DOT11-ASSOCIATION-MIB</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>discovery[{#S},1.3.6.1.4.1.9.9.273.1.3.1.1.3]</snmp_oid> |
||
+ | <key>CISCO-DOT11-ASSOCIATION-MIB</key> |
||
+ | <lifetime>365d</lifetime> |
||
+ | <item_prototypes> |
||
+ | <item_prototype> |
||
+ | <name>07 cDot11ClientBytesReceived [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.7.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientBytesReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>bytes/s</units> |
||
+ | <description>cDot11ClientBytesReceived OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "byte" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "The number of bytes received from this client." |
||
+ | ::= { cDot11ClientStatisticEntry 7 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientBytes</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>09 cDot11ClientBytesSent [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.9.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientBytesSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>bytes/s</units> |
||
+ | <description>cDot11ClientBytesSent OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "byte" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "The number of bytes sent to this client." |
||
+ | ::= { cDot11ClientStatisticEntry 9 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientBytes</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>10 cDot11ClientDuplicates [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.10.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientDuplicates[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientDuplicates OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This counter increments when a packet for this |
||
+ | client is received and the Sequence Control field |
||
+ | in the packet header indicates the packet is a |
||
+ | duplicate." |
||
+ | ::= { cDot11ClientStatisticEntry 10 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>14 cDot11ClientMicErrors [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.14.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientMicErrors[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientMicErrors OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "error" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This is the number of MIC errors for this client." |
||
+ | ::= { cDot11ClientStatisticEntry 14 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>15 cDot11ClientMicMissingFrames [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.15.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientMicMissingFrames[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientMicMissingFrames OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This is the number of missing MIC packets for |
||
+ | this client.". |
||
+ | ::= { cDot11ClientStatisticEntry 15 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>12 cDot11ClientMsduFails [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.12.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientMsduFails[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientMsduFails OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This counter increments when an MSDU is not |
||
+ | transmitted successfully for this client due to the |
||
+ | number of transmit attempts exceeding some limit. |
||
+ | ::= { cDot11ClientStatisticEntry 12 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>11 cDot11ClientMsduRetries [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.11.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientMsduRetries[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientMsduRetries OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This counter increments when an MSDU is successfully |
||
+ | transmitted after one or more retransmissions for this |
||
+ | client." |
||
+ | ::= { cDot11ClientStatisticEntry 11 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientErrors</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>06 cDot11ClientPacketsReceived [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.6.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientPacketsReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientPacketsReceived OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "The number of packets received from this client." |
||
+ | ::= { cDot11ClientStatisticEntry 6 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientPackets</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>08 cDot11ClientPacketsSent [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.8.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientPacketsSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>pps</units> |
||
+ | <description>cDot11ClientPacketsSent OBJECT-TYPE |
||
+ | SYNTAX Counter32 |
||
+ | UNITS "packet" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "The number of packets sent to this client.". |
||
+ | ::= { cDot11ClientStatisticEntry 8 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientPackets</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>CHANGE_PER_SECOND</type> |
||
+ | <params/> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>03 cDot11ClientSignalStrength [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.3.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientSignalStrength[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <value_type>FLOAT</value_type> |
||
+ | <units>dBm</units> |
||
+ | <description>cDot11ClientSignalStrength OBJECT-TYPE |
||
+ | SYNTAX Integer32 (-100..0) |
||
+ | UNITS "dBm" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This is a device-dependent measure of the signal |
||
+ | strength of the most recently received packet from. |
||
+ | this client. It may be normalized or unnormalized.". |
||
+ | ::= { cDot11ClientStatisticEntry 3 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientSignal</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>04 cDot11ClientSigQuality [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.4.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientSigQuality[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>%</units> |
||
+ | <description>cDot11ClientSigQuality OBJECT-TYPE |
||
+ | SYNTAX Unsigned32 (0..100) |
||
+ | UNITS "percentage" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "This is a device-dependent measure of the signal |
||
+ | quality of the most recently received packet from. |
||
+ | this client.". |
||
+ | ::= { cDot11ClientStatisticEntry 4 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11ClientSignal</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | </item_prototype> |
||
+ | <item_prototype> |
||
+ | <name>02 cDot11ClientUpTime [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <type>SNMP_AGENT</type> |
||
+ | <snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.2.{#SNMPINDEX}</snmp_oid> |
||
+ | <key>cDot11ClientUpTime[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | <units>s</units> |
||
+ | <description>cDot11ClientUpTime OBJECT-TYPE |
||
+ | SYNTAX Unsigned32 |
||
+ | UNITS "second" |
||
+ | MAX-ACCESS read-only |
||
+ | STATUS current |
||
+ | DESCRIPTION |
||
+ | "The time in seconds that this client has been |
||
+ | associated with this device." |
||
+ | ::= { cDot11ClientStatisticEntry 2 }</description> |
||
+ | <applications> |
||
+ | <application> |
||
+ | <name>cDot11Clients</name> |
||
+ | </application> |
||
+ | </applications> |
||
+ | </item_prototype> |
||
+ | </item_prototypes> |
||
+ | <graph_prototypes> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ClientBytes [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientBytesReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>2</sortorder> |
||
+ | <color>F63100</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientBytesSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ClientErrors [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientDuplicates[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>2</sortorder> |
||
+ | <color>F63100</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientMsduRetries[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>3</sortorder> |
||
+ | <color>2774A4</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientMsduFails[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>4</sortorder> |
||
+ | <color>A54F10</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientMicErrors[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>5</sortorder> |
||
+ | <color>FC6EA3</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientMicMissingFrames[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ClientPackets[ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientPacketsReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>2</sortorder> |
||
+ | <color>F63100</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientPacketsSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ClientSignal [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientSignalStrength[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | <graph_item> |
||
+ | <sortorder>2</sortorder> |
||
+ | <color>F63100</color> |
||
+ | <yaxisside>RIGHT</yaxisside> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientSigQuality[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | <graph_prototype> |
||
+ | <name>cDot11ClientUpTime [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <graph_items> |
||
+ | <graph_item> |
||
+ | <sortorder>1</sortorder> |
||
+ | <drawtype>FILLED_REGION</drawtype> |
||
+ | <color>1A7C11</color> |
||
+ | <item> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | <key>cDot11ClientUpTime[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key> |
||
+ | </item> |
||
+ | </graph_item> |
||
+ | </graph_items> |
||
+ | </graph_prototype> |
||
+ | </graph_prototypes> |
||
+ | <preprocessing> |
||
+ | <step> |
||
+ | <type>JAVASCRIPT</type> |
||
+ | <params>//debugPrefix = "TESTING\n" |
||
+ | //Zabbix.Log(3, "------------------------") |
||
+ | //Zabbix.Log(3, debugPrefix + "this is a log entry written with 'Warning' log level") |
||
+ | //Zabbix.Log(3, debugPrefix + value) |
||
+ | //Zabbix.Log(3, "------------------------") |
||
+ | |||
+ | |||
+ | var records = JSON.parse(value); |
||
+ | |||
+ | for (i = 0; i < records.length; i++) { |
||
+ | var OID = records[i]["{#SNMPINDEX}"].split('.') |
||
+ | // IFINDEX AND IFNAME |
||
+ | var dot1RadioIfIndex = OID.shift(); |
||
+ | records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex |
||
+ | records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString() |
||
+ | |||
+ | // get mac as 6 last digits converted dec -> hex and joined with ':' |
||
+ | var MAC = "" |
||
+ | var MACDigitHex |
||
+ | for (j = 0; j < 6; j++) { |
||
+ | MACDigitDec = OID.pop(); |
||
+ | |||
+ | MACDigitHex = parseInt(MACDigitDec).toString(16); |
||
+ | MAC = MACDigitHex + " " + MAC |
||
+ | } |
||
+ | records[i]['{#MAC}'] = MAC.trim().split(" ").join(":") |
||
+ | |||
+ | // SSID. The first octet is length, others are ASCII characters |
||
+ | SSID = "" |
||
+ | ssidLength = OID.shift(); |
||
+ | |||
+ | for (j = 0; j < ssidLength; j++) { |
||
+ | SSID += String.fromCharCode(parseInt(OID[j])); |
||
+ | |||
+ | } |
||
+ | records[i]['{#SSID}'] = SSID |
||
+ | } |
||
+ | //Zabbix.Log(3, "------------------------") |
||
+ | Zabbix.Log(3, JSON.stringify(records)) |
||
+ | return JSON.stringify(records); |
||
+ | |||
+ | //return value |
||
+ | |||
+ | |||
+ | </params> |
||
+ | </step> |
||
+ | </preprocessing> |
||
+ | </discovery_rule> |
||
+ | </discovery_rules> |
||
+ | <screens> |
||
+ | <screen> |
||
+ | <name>cDot11ActiveWirelessClientsBytesRxTx</name> |
||
+ | <hsize>1</hsize> |
||
+ | <vsize>1</vsize> |
||
+ | <screen_items> |
||
+ | <screen_item> |
||
+ | <resourcetype>20</resourcetype> |
||
+ | <style>0</style> |
||
+ | <resource> |
||
+ | <name>cDot11ClientBytes [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | </resource> |
||
+ | <width>500</width> |
||
+ | <height>200</height> |
||
+ | <x>0</x> |
||
+ | <y>0</y> |
||
+ | <colspan>1</colspan> |
||
+ | <rowspan>1</rowspan> |
||
+ | <elements>0</elements> |
||
+ | <valign>0</valign> |
||
+ | <halign>0</halign> |
||
+ | <dynamic>0</dynamic> |
||
+ | <sort_triggers>0</sort_triggers> |
||
+ | <url/> |
||
+ | <application/> |
||
+ | <max_columns>3</max_columns> |
||
+ | </screen_item> |
||
+ | </screen_items> |
||
+ | </screen> |
||
+ | <screen> |
||
+ | <name>cDot11ActiveWirelessClientsCount</name> |
||
+ | <hsize>1</hsize> |
||
+ | <vsize>1</vsize> |
||
+ | <screen_items> |
||
+ | <screen_item> |
||
+ | <resourcetype>20</resourcetype> |
||
+ | <style>0</style> |
||
+ | <resource> |
||
+ | <name>cDot11ActiveWirelessClientsCoun [ {#DOT1RADIO_IFNAME} ]</name> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | </resource> |
||
+ | <width>800</width> |
||
+ | <height>300</height> |
||
+ | <x>0</x> |
||
+ | <y>0</y> |
||
+ | <colspan>1</colspan> |
||
+ | <rowspan>1</rowspan> |
||
+ | <elements>0</elements> |
||
+ | <valign>0</valign> |
||
+ | <halign>0</halign> |
||
+ | <dynamic>0</dynamic> |
||
+ | <sort_triggers>0</sort_triggers> |
||
+ | <url/> |
||
+ | <application/> |
||
+ | <max_columns>3</max_columns> |
||
+ | </screen_item> |
||
+ | </screen_items> |
||
+ | </screen> |
||
+ | <screen> |
||
+ | <name>cDot11ActiveWirelessClientsSignalLevels</name> |
||
+ | <hsize>1</hsize> |
||
+ | <vsize>1</vsize> |
||
+ | <screen_items> |
||
+ | <screen_item> |
||
+ | <resourcetype>20</resourcetype> |
||
+ | <style>0</style> |
||
+ | <resource> |
||
+ | <name>cDot11ClientSignal [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name> |
||
+ | <host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host> |
||
+ | </resource> |
||
+ | <width>500</width> |
||
+ | <height>200</height> |
||
+ | <x>0</x> |
||
+ | <y>0</y> |
||
+ | <colspan>1</colspan> |
||
+ | <rowspan>1</rowspan> |
||
+ | <elements>0</elements> |
||
+ | <valign>0</valign> |
||
+ | <halign>0</halign> |
||
+ | <dynamic>0</dynamic> |
||
+ | <sort_triggers>0</sort_triggers> |
||
+ | <url/> |
||
+ | <application/> |
||
+ | <max_columns>3</max_columns> |
||
+ | </screen_item> |
||
+ | </screen_items> |
||
+ | </screen> |
||
+ | </screens> |
||
+ | </template> |
||
+ | </templates> |
||
+ | </zabbix_export> |
||
+ | </PRE> |
||
+ | }} |
Текущая версия на 10:17, 25 сентября 2022
Таблица уровней клиентов для точек доступа Cisco
Задача
Собирать данные о траффике и уровне сигнала с точек доступа
- Клиенты динамические, их мак-адреса заранее не известны
- SSID добавляются и удаляются по мере необходимости
- Точки могут иметь как один интерфейс так и два
Для того что бы получить информацию по SNMP о клиентах подключенных к точке доступа, существует специальный MIB CISCO-DOT11-ASSOCIATION-MIB
Он доступен достаточно давно, как минимум он работает на точках 1200 и 1100 серий, ну и на более современных тоже.
Просмотр OID
Пример с использованием display-hint
# snmpwalk -v2c -c MON 192.168.77.2 .1.3.6.1.4.1.9.9.273.1.3.1 -OX
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientCurrentTxRateSet[1]["450"][STRING: da:20:60:64:36:95] = Hex-STRING: 07 CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientCurrentTxRateSet[2]["450"][STRING: a4:45:19:5a:ef:48] = Hex-STRING: 01 CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientUpTime[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 15898 second CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientUpTime[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 425 second CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: da:20:60:64:36:95] = INTEGER: -64 dBm CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -89 dBm CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSigQuality[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 24 percentage CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSigQuality[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 9 percentage CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientAgingLeft[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 58 second CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientAgingLeft[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 34 second CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsReceived[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 149529 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsReceived[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 346 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesReceived[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 23101125 byte CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesReceived[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 113287 byte CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsSent[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 617733 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsSent[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 251 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesSent[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 745190393 byte CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesSent[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 47693 byte CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientDuplicates[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 2389 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientDuplicates[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 12 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduRetries[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 159859 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduRetries[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 331 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduFails[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduFails[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientWepErrors[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientWepErrors[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicErrors[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 error CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicErrors[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 error CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicMissingFrames[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicMissingFrames[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet
Или без использования
# snmpwalk -v2c -c MON 192.168.77.2 .1.3.6.1.4.1.9.9.273.1.3.1 -On
.1.3.6.1.4.1.9.9.273.1.3.1.1.1.1.3.52.53.48.218.32.96.100.54.149 = Hex-STRING: 05 .1.3.6.1.4.1.9.9.273.1.3.1.1.1.2.3.52.53.48.164.69.25.90.239.72 = Hex-STRING: 01 .1.3.6.1.4.1.9.9.273.1.3.1.1.2.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 15911 second .1.3.6.1.4.1.9.9.273.1.3.1.1.2.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 439 second .1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.3.52.53.48.218.32.96.100.54.149 = INTEGER: -63 dBm .1.3.6.1.4.1.9.9.273.1.3.1.1.3.2.3.52.53.48.164.69.25.90.239.72 = INTEGER: -89 dBm .1.3.6.1.4.1.9.9.273.1.3.1.1.4.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 31 percentage .1.3.6.1.4.1.9.9.273.1.3.1.1.4.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 10 percentage .1.3.6.1.4.1.9.9.273.1.3.1.1.5.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 58 second .1.3.6.1.4.1.9.9.273.1.3.1.1.5.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 51 second .1.3.6.1.4.1.9.9.273.1.3.1.1.6.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 149587 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.6.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 347 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.7.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 23109939 byte .1.3.6.1.4.1.9.9.273.1.3.1.1.7.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 113333 byte .1.3.6.1.4.1.9.9.273.1.3.1.1.8.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 618046 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.8.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 251 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.9.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 745583754 byte .1.3.6.1.4.1.9.9.273.1.3.1.1.9.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 47693 byte .1.3.6.1.4.1.9.9.273.1.3.1.1.10.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 2392 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.10.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 12 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.11.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 159964 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.11.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 331 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.12.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.12.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.13.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.13.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.14.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 error .1.3.6.1.4.1.9.9.273.1.3.1.1.14.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 error .1.3.6.1.4.1.9.9.273.1.3.1.1.15.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet .1.3.6.1.4.1.9.9.273.1.3.1.1.15.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet
Разбор OID
Как можно видеть, сам OID состоит из нескольких частей
Для определенности рассмотрим уровни сигнала:
.1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.3.52.53.48.218.32.96.100.54.149 = INTEGER: -63 dBm .1.3.6.1.4.1.9.9.273.1.3.1.1.3.2.3.52.53.48.164.69.25.90.239.72 = INTEGER: -89 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: da:20:60:64:36:95] = INTEGER: -64 dBm CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -89 dBm
Часть .1.3.6.1.4.1.9.9.273.1.3.1.1.3 это и есть OID CISCO-DOT11-ASSOCIATION и она общая
Далее в самом OID закодировано значение "кому принадлежит сигнал", т е какому клиенту
Выделенное значение и его описание:
- 2.3.52.53.48.164.69.25.90.239.72 - номер интерфейса, он же ifIndex, dot11Radio0 (1), или dot11Radio1 (2), в примере клиент подключен к 5Ghz интерфейсу (dot11Radio1)
- 2.3.52.53.48.164.69.25.90.239.72 - Длинна SSID в байтах, в пример 3 символа (SSID в примере "450")
- 2.3.52.53.48.164.69.25.90.239.72 - коды ASCII символов SSID, их три - "450"
- 2.3.52.53.48.164.69.25.90.239.72 - мак-адрес, 6 байт, записаны в деятичной форме, "a4:45:19:5a:ef:48", например 164(десятичное) = a4(hex), 69(десятичное) = 45 (hex) и так далее.
Интеграция с Zabbix
SNMP autodiscovery
Есть дока но мне она не нравится =)
В моем случае правило автообнаружения выглядит так:
В целом идея такая:
- В поле SNMP OID указываю discovery[{#S},1.3.6.1.4.1.9.9.273.1.3.1.1.3]
- Заббикс сам делает snmpwalk 1.3.6.1.4.1.9.9.273.1.3.1.1.3 и в результате получает список клиентов и их сигналы
snmpwalk -v2c -c MON 192.168.77.2 1.3.6.1.4.1.9.9.273.1.3.1.1.3 -OX Bad operator (INTEGER): At line 73 in /usr/share/snmp/mibs/ietf/SNMPv2-PDU CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: 0:8:ca:2b:1:24] = INTEGER: -65 dBm CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -67 dBm
и на выходе формирует JSON в котором есть поля "{#SNMPINDEX}" - это часть которую нужно дописать к OID указанному в discovery что бы получить значение
[ { "{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36", "{#S}": "-66" }, { "{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72", "{#S}": "-66" } ]
Это выглядит странновато, но суть этого - получить список суффиксов, которые потом можно использовать для получения других значений
В поле "{#S}" записан сигнал и его значение я нигде не использую, но в общем случае (для других MIB/OID) тут может быть что-то что можно использовать (в оригинальной документации это имена интерфейсов)
В общем случае можно указать несколько OID которые нужно обходить snmpwalk-ом, но при этом нужно держать в голове что SNMPINDEX должен совпадать - так работает для таблицы интерфейсов где по разным префиксам но с одним и тем же ifIndex можно получить данные с интерфейса - имя, дескрипшен, байты и т.п.
Если же указать 2 OID с разной структурой (например интерфейсы и таблицу регистрации клиентов) то ничего хорошего не получится - данные будут перемешаны (подробно я не смотрел код как именно и почему )
Далее при создании прототипов элементов данных можно использовать "{#SNMPINDEX}" и тогда все остальные переменны в JSON полученном при discovery будут доступны
Например, если при создании прототипа данныхь указать OID=.1.3.6.1.4.1.9.9.273.1.3.1.1.2.{#SNMPINDEX} то (для моего примера будет автоматически создано 2 элемента данных, в именах которых можно использовать например значение макроса "{$S}". Это хорошо ложиться на пример с интерфейсом, но в моем случае этот макрос как и остальные совершенно бесполезен так как вся статическая информация закодирована в OID который собственно доступен через макрос "{SNMPINDEX}"
Processing
Для того что бы получить нужные данные в удобном виде полученный при discovery JSON можно редактировать с помошью встроенного JavaScript
В моем случае на скорую руку вышел вот такой скрипт:
var records = JSON.parse(value); for (i = 0; i < records.length; i++) { var OID = records[i]["{#SNMPINDEX}"].split('.') // IFINDEX AND IFNAME var dot1RadioIfIndex = OID.shift(); records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString() // get mac as 6 last digits converted dec -> hex and joined with ':' var MAC = "" var MACDigitHex for (j = 0; j < 6; j++) { MACDigitDec = OID.pop(); MACDigitHex = parseInt(MACDigitDec).toString(16); MAC = MACDigitHex + " " + MAC } records[i]['{#MAC}'] = MAC.trim().split(" ").join(":") // SSID. The first octet is length, others are ASCII characters SSID = "" ssidLength = OID.shift(); for (j = 0; j < ssidLength; j++) { SSID += String.fromCharCode(parseInt(OID[j])); } records[i]['{#SSID}'] = SSID } return JSON.stringify(records);
Идея в том что бы добавить поля построенные на основе SNMPINDEX в Json, и в дальнейшем они будут доступны при создании элементов данных
В результате из исходного JSON получаю такой
[ { "{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36", "{#S}": "-62", "{#DOT1RADIO_IFINDEX}": "1", "{#DOT1RADIO_IFNAME}": "Dot11Radio0", "{#MAC}": "0:8:ca:2b:1:24", "{#SSID}": "450" }, { "{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72", "{#S}": "-79", "{#DOT1RADIO_IFINDEX}": "2", "{#DOT1RADIO_IFNAME}": "Dot11Radio1", "{#MAC}": "a4:45:19:5a:ef:48", "{#SSID}": "450" } ]
который уже содержит статическую информацию о клиенте и который можно использовать для создания элеметов данных
Прототпипы элементов данных
Формируем имя и ключ на основе данных из Json, например
Name cDot11ClientSignalStrength [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]
где для кажого клиента будет создан отдельный элемент данных,
при этом используются три уникальных значения.
Другими словами ключ (SNMP OID) составляется из префикса который статичен для каждого типа данных и суффкса который SNMPINDEX и зависит от клиента (мака, SSID и интерфейса)
Клиент с тем же маком но подключившись в другом диапазоне (другой интерфейс) рассматривается как другой клиент даже если используется один SSID для разных частот)
Все элементы данных в целом полностью аналогичны