
Если для общения по SNMP со своими «железками» вы начинаете поиск не в документации бренда а ищете mib файлы для нее, эта статья не для вас.
Ну а если слова SNMP, Net-SNMP, snmpwalk, snmpget вам уже встречались, но открыв любой «*.mib» вы предпочитаете его закрыть и обратиться к какому либо из mib browsers — вам стоит это почитать.
Небольшое предисловие
Книга “Основы SNMP” издательства Символ (O’REILLY в оригинале), стояла на моей книжной полке много лет, иногда что то в ней смотрел, но первые главы с теорией были абсолютно непонятной тяжелой информацией. Пока не было реальной потребности, это было как читать о «сферическом коне в вакууме»
Лет 5 назад дошли руки до установки Zabbix в организации. И, если шаблоны для коммутаторов и маршрутизаторов легко поправил, меняя некоторые OID в зависимости от модели, выискивая их с помощью snmpwalk, то взявшись за только что установленные Системы Гарантированного Питания (СГП) Huawei ETP-48/200(60) понял, что без MIB файлов не обойтись. Шаблон Zabbix делал “с нуля”.
Сопоставление web-интерфейса:

и выгрузки всего дерева информации с помощью snmpwalk в файл не помогло, железка мне была незнакома совсем, аналогии не помогали. На github’e был найден HUAWEI-SITE-MONITOR-MIB.txt, почти подходящий для наших СГП, но я и его, как сейчас понимаю, использовал бездарно — превратил в Excel файл вида OID <-> “его название”.
Но мне все равно это сильно помогло, СГП я мониторю уже Zabbix’ом.
Стал вопрос о шаблоне для аппаратуры ВЧ связи ССТМ «ES100» (система связи и телемеханики), взгляд упал на вышеназванную книгу и теория вдруг оказалась очень понятной. (После создания то с нуля шаблона для Zabbix sic!)
Итак, как лучше “понимать” свои железки используя их MIB файлы
Я не буду расписывать с нуля что такое SNMP, OID, как установить snmpwalk, snmpget и т.п. Информации в сети предостаточно.
Здесь, на Хабре есть прекрасная статья SNMP MIBs и как их готовить где описан другой подход к «ковырянию» в MIB но там уже требуется понимание «что внутри у животинки»
Но, по порядку..
Говоря о разных параметрах устройств, поддерживающих SNMP, пользуются термином информация для управления. Но из чего она состоит и как представлена?
Для описания этого существует целый стандарт “The Structure of Management Information ver. 1/Структура информации для управления” (SMIv1, RFC1155) и дополнения для SNMPv2 (SMIv2, RFC 2578). Если не указано, я буду использовать определения SMIv2, он сейчас встречается гораздо чаще.
Определение управляемых объектов может содержать три атрибута:
Имя
Имя, или идентификатор объекта (OID — Object identifier) уникально определяет управляемый объект. Имена обычно бывают двух видов — цифровые и «удобочитаемые».
В любом случае имена получаются длинные и неудобные. В SNMP-приложениях делается очень много работы для того, чтобы помочь нам удобно ориентироваться в пространстве имен.
Тип и синтаксис
Тип данных управляемого объекта определяется при помощи части языка ASN.1 (Abstract Syntax Notation One). ASN.1 — это способ указать, как данные представляются и передаются между менеджерами и агентами в контексте SNMP. Преимущество ASN.1 заключается в том, что он независим от машины. Это означает, что компьютер с ОС Windows может связываться с любым Unix или мэйнфреймом и не беспокоиться о таких вещах, как порядок байтов.
Если интересны подробности, дальше Хабра ходить не нужно, вот очень подробная статья: ASN.1 простыми словами (кодирование типа REAL)
Кодировка
Конкретный управляемый объект кодируется в строку октетов с использованием правил «Basic Encoding Rules» (BER стандарта ASN.1). Правила BER определяют, как объекты кодируются и декодируются, чтобы их можно было транспортировать по среде передачи, например Ethernet.
Имена OID
Все объекты организованы в древовидную иерархическую структуру (только корень root обычно рисуется сверху). Идентификаторы (имена) объектов состоят из ряда целых чисел, определяемых узлами дерева и разделенных точками. Более удобочитаемая форма, состоящая из слов разделенных точками по сути тоже самое, только каждому узлу соответствует свое имя (слово) а наиболее часто употребляемые кусты (куски) дерева описаны одним именем:
так OID .1.3.6.1.2.1.1.2 вместо .iso.org.dod.internet.mgmt.mib-2.sysObjectID описывается как SNMPv2-MIB::sysObjectID (кстати запомните этот OID, к нему вернемся позже)
Начало дерева имен можно представить следующей картинкой

рисовал картинку не сам…
(да я взял ее в блоге компании Selectel, хорошая статья (https://selectel.ru/blog/snmp/) и это не реклама компании — статья просто хорошая
На таких рисунках чаще всего не отображают ветви ccitt(0) и joint(2), это следы зарождения SNMP еще до согласования с международной организацией по стандартизации ISO.
Вот определение поддерева internet и его поддеревьев на языке ANS.1 (именно на нем написаны все MIB файлы, в которых нам предстоит разбираться)
|
internet |
OBJECT |
IDENTIFIER |
::= |
{ iso org(3) dod(6) 1} |
|---|---|---|---|---|
|
directory |
OBJECT |
IDENTIFIER |
::= |
{ internet 1 } |
|
mgmt |
OBJECT |
IDENTIFIER |
::= |
{ internet 2 } |
|
experimental |
OBJECT |
IDENTIFIER |
::= |
{ internet 3 } |
|
private |
OBJECT |
IDENTIFIER |
::= |
{ internet 4 } |
|
|
|
|
|
|
directory сейчас не используется,
experimental зарезервирована для целей тестирования,
mgmt (management) определяет стандартный набор управляемых объектов интернета,
за объекты в private люди и организации отвечают сами.
Если запустить:

без указания какого либо OID, команда вернет все дерево, что найдет перебором по пути .1.3.6.1.2.1. это её поведение по умолчанию. Но это будет общая, стандартная информация, которая нам мало что расскажет о самой “железке”.
Все, что относится к конкретному оборудованию конкретного производителя находится в ветке enterprises и всю информацию из нее можно получить, запустив:
snmpwalk -v 2c -c MySeCrEt IP_addr_host .1.3.6.1.4.1.
или же “спросить поточнее” у самой железки, запросив вышеупомянутый мною OID:
snmpwalk -v 2c -c MySeCrEt IP_addr_host .1.3.6.1.2.1.1.2
вернет, например для Huawei ETP 48/200
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.2011.6.164.1.2
если вам необходимо получить информацию в числовом виде, используйте ключ -On (options numerical) команды snmpwalk, ответ будет
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2011.6.164.1.2
Кстати вы заметили, что мы спрашивали OID .1.3.6.1.2.1.1.2
а получили OID .1.3.6.1.2.1.1.2.0?
Далее будет сказано подробнее, объекты в SMI могут быть одиночными (скалярами) или организованы в виде таблицы.
sysObjectID именно скаляр — и это является причиной частых ошибок при использовании snmpget
snmpget имеет тот же синтаксис что и snmpwalk но возвращает только один OID, тот что запрошен. Так что при изучении “железок” проще пользоваться snmpwalk, ну или с точностью “до нуля” указывать OID
Описание MIB
Изучать MIB лучше на конкретном примере. Я буду использовать части HUAWEI-SITE-MONITOR-MIB.mib, не самое очевидное может для вас, но тем интереснее — понять что то, с чем не связаны
начнем с заголовков:
HUAWEI-SITE-MONITOR-MIB DEFINITIONS ::= BEGIN IMPORTS huaweiUtility FROM HUAWEI-MIB OBJECT-GROUP, NOTIFICATION-GROUP FROM SNMPv2-CONF Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE FROM SNMPv2-SMI TEXTUAL-CONVENTION FROM SNMPv2-TC; -- September 15, 2010 at 11:00 GMT hwSiteMonitorMIB MODULE-IDENTITY LAST-UPDATED "201103040000Z" -- March 04, 2011 at 00:00 GMT ORGANIZATION "Huawei Technologies Co.,Ltd." CONTACT-INFO "Floor 5, Block 4, R&D Building, Huawei Longgang Production Base, Shenzhen, P.R.C. http://www.huawei.com Zip: 518129." DESCRIPTION "Site Monitor MIB defines MIB objects which provides load and backup management, patch management NMS interfaces. The current version is V1.01" REVISION "201103040000Z" -- March 04, 2011 at 00:00 GMT DESCRIPTION "Add hwAcOffLongTimeAlarmTraps, hwAcOffLongTimeAlarmResumeTraps" REVISION "201010310000Z" -- October 31, 2010 at 00:00 GMT DESCRIPTION "Huawei site monitor mib V1.00" ::= { huaweiUtility 164 }
любой MIB файл начинается с импорта из других MIB, (посмотрите на досуге SNMPv2-TC или SNMPv2-CONF вы увидите что такое хорошо структурированная информация),
контактной информации, описания, версий и т.п. и определяет отправную точку этого MIB файла, его положения в дереве.
hwSiteMonitorMIB ::= { huaweiUtility 164 }
и, зная числовое обозначение 1.3.6.1.4.1.2011.6.164 даже не имея под рукой HUAWEI-MIB я могу предположить, что:
huaweiUtility ::= { huaweiMIB 6 }
huaweiMIB ::= { enterprises 2011 }
насчет названия huaweiMIB я могу ошибаться, но смысл понятен.
Далее следует описание текстовых обозначений. Они введены только в SMIv2 и позволяют создавать управляемые объекты более абстрактно.
-- -- Textual conventions -- DisplayString ::= TEXTUAL-CONVENTION STATUS current DESCRIPTION "Description." SYNTAX OCTET STRING (SIZE (1..64)) RowStatus ::= TEXTUAL-CONVENTION STATUS current DESCRIPTION "Description." SYNTAX INTEGER { active(1), notInService(2), notReady(3), createAndGo(4), createAndWait(5), destroy(6) }
Вообще все текстовые обозначения могут быть следующих типов:
Типы текстовых обозначений
|
обозначение |
описание |
|
DisplayString |
Строка символов NVT ASCII не более 255 символов |
|
PhysAddress |
Адрес физического уровня или уровня среды в виде OCTET STRING |
|
MacAddress |
MAC-адрес для IEEE 802 в каноническом формате (с наименьшим значащим битом в начале). В виде 6 октетов |
|
TruthValue |
Булевые значения true или false |
|
TestAndIncr |
Используется чтобы избежать одновременного изменения одного объекта двумя станциями управления |
|
AutonomousType |
OID используемый для определения субдерева с дополнительными определениями |
|
VariablePointer |
Указатель на конкретного представителя объекта например ifDescr для интерфейса 3. В этом случае будет OID ifDescr.3 |
|
RowPointer |
Указатель на строку таблицы. Например ifIndex.3 указывает на третью строку ifTable |
|
RowStatus |
Используется для управления созданием и удалением строк в таблице, так как в SNMP не предусмотрено выполнение этих действий средствами самого протокола, оно создано для обеспечения целостности таблицы когда строка обновляется более чем одним менеджером. Команды и переменные состояний определяются следующими значениями: active(1), notInService(2), notReady(3), createAndGo(4), createAndWait(5) и anddestroy(6) |
|
TimeStamp |
Измеряет время между последней загрузкой системы и каким-либо событием |
|
TimeInterval |
Измеряет период времени в сотых долях секунды. Любые целочисленные значения в диапазоне 0 — 2 147 483 647 |
|
DateAndTime |
OCTET STRING для представления даты и времени |
|
StorageType |
Тип памяти используемой агентом: other(1), volatile(2), nonVolatile(3), permanent(4) и readOnly(5) |
|
TDomain |
Тип транспортной службы |
|
TAddress |
Адрес транспортной службы. Размер определен от 1 до 255 октетов |
Теперь подробнее о синтаксисе определений объектов. Общий вид следующий:
<имя> OBJECT-TYPE
SYNTAX <тип данных>
UnitsParts <дополнительно, см. Дополнения в определении объекта в SMIv2>
MAX-ACCESS <см. Дополнения в определении объекта в SMIv2>
STATUS <см. Дополнения в определении объекта в SMIv2>
DESCRIPTION
“Текстовое описание, характеризующее этот объект”
AUGMENTS { <имя таблицы> }
::= { <Уникальный OID, определяющий этот объект> }
Атрибут SYNTAX обеспечивает определение управляемых объектов. Типы данных просто способ определить какой вид информации может содержать управляемый объект. Эти типы аналогичны тем, которые можно встретить в языках программирования, например C
Типы данных, определенные в SMIv1
|
Типы данных |
Описание |
|
INTEGER |
32-битное число, используемое для перечисляемых типов данных. Например статус — исправен(1), неисправен(2), тестируется(3). Ноль(0) не должен использоваться в соответствии с RFC 1155 |
|
OCTET STRING |
Строка из нуля или более октетов (байт) обычно используемая для представления текстовых строк а иногда и физических адресов |
|
Counter |
32-битное число от 0 до 232 — 1 (4 294 967 295). При достижения максимума сбрасывается в 0 и стартует сначала. Используется для отслеживания такой информации, как количество отправленных и полученных пакетов на интерфейсе и т.п. При нормальной работе значение никогда не уменьшается. При перезагрузке стартует с 0 |
|
OBJECT IDENTIFIER |
Строка разделенных точками чисел, представляющая управляемый объект в дереве объектов. Например 1.3.6.1.4.1.9 OID частной структуры Cisco Systems |
|
NULL |
В настоящее время не используется |
|
SEQUENCE |
Определяет списки содержащие ноль или более других типов данных ASN.1 |
|
SEQUENCE OF |
Определяет управляемый объект, состоящий из SEQUENCE (последовательности) типов данных ASN.1 |
|
IpAddress |
32-битный адрес IPv4. 128 битные адреса IPv6 не рассматриваются ни в SMIv1 ни в SMIv2 |
|
NetworkAddress |
То же самое, что и тип IpAddress, но может представлять различные типы сетевых адресов |
|
Gauge |
32-битное число от 0 до 232 — 1 (4 294 967 295). Но в отличие от Counter может произвольно увеличиваться или уменьшаться но не может превзойти максимального значения |
|
TimeTicks |
32-битное число от 0 до 232 — 1 (4 294 967 295). Измеряет время в сотых долях секунды. При помощи этого типа измеряется время работы устройства. |
|
Opaque |
Позволяет занести любую другую кодировку ASN.1 в OCTET STRING |
В SMIv2 добавлено еще несколько типов данных
Типы данных добавленные в SMIv2
|
Типы данных |
Описание |
|
Integer32 |
Тоже самое, что INTEGER |
|
Counter32 |
Тоже самое, что Counter |
|
Gauge32 |
Тоже самое, что Gauge |
|
Unsigned32 |
Десятичные значения в диапазоне от 0 до 232 — 1 |
|
Counter64 |
Аналогичен Counter32 но имеет максимальное значение 18 446 744 073 709 551 615, идеально подходит для ситуаций когда Counter32 за короткое время может достигнуть максимума и обнулиться |
И, наконец, мы дошли до описания оставшихся атрибутов объектов
Дополнения в определении объекта в SMIv2
|
Типы данных |
Описание |
|
UnitsParts |
Текстовое описание единиц (например секунды, миллиамперы и т.п.) используемые для представления объекта |
|
MAX-ACCESS |
в SMIv1 имя этого атрибута ACCESS и он может быть read-only, read-write, write-only, not-accessible в SMIv2 может быть read-only, read-write, read-create, not-accessible и accessible-for-notify |
|
STATUS |
в SMIv1 может быть mandatory (обязательный), optional (необязательный), obsolete (устаревший) в SMIv2 current, obsolete, deprecated (current то же самое что mandatory в SMIv1) |
|
AUGMENTS |
В некоторых случаях полезно добавить в существующую таблицу столбец. Оператор AUGMENTS позволяет расширить таблицу, дополнив одним или несколькими столбцами, представленными каким-либо объектом. |
Этой теории вполне достаточно, чтобы понять весь MIB файл.
-- -- Node definitions -- -- 1.3.6.1.4.1.2011.6.164.1 hwSiteMonitorMIBObjects OBJECT IDENTIFIER ::= { hwSiteMonitorMIB 1 } -- 1.3.6.1.4.1.2011.6.164.1.1 hwSiteInfo OBJECT IDENTIFIER ::= { hwSiteMonitorMIBObjects 1 } -- 1.3.6.1.4.1.2011.6.164.1.1.1 hwSiteSummary OBJECT IDENTIFIER ::= { hwSiteInfo 1 } -- 1.3.6.1.4.1.2011.6.164.1.1.1.1 hwSiteId OBJECT-TYPE SYNTAX Unsigned32 MAX-ACCESS read-only STATUS current DESCRIPTION "Site ID, default value: 000,000. Naming rule of the site device ID (six digits): The first three digits indicate the device name and the last three digits indicate the serial number (SN) of the device. If the last three digits are 000, it indicates a virtual device. " ::= { hwSiteSummary 1 }
В начале описывается объекты структуры hwSiteMonitorMIBObjects как составляющая hwSiteMonitorMIB и т.д. и наконец первый “настоящий” объект hwSiteId
как видите, это скаляр и
snmpget -v 2c -c MySeCrEt 10.XX.XX.197 .1.3.6.1.4.1.2011.6.164.1.1.1.1
вернет
SNMPv2-SMI::enterprises.2011.6.164.1.1.1.1 = No Such Instance currently exists at this OID
поэтому, поняв из MIBа что это скаляр, мы выполняем
snmpget -v 2c -c MySeCrEt 10.XX.XX.197 .1.3.6.1.4.1.2011.6.164.1.1.1.1.0
и получаем
SNMPv2-SMI::enterprises.2011.6.164.1.1.1.1.0 = STRING: «Mayak»
как видим, хотя объект и read-only, подрядчик при первоначальной настройке изменил на имя подстанции, или, что вероятнее, этот MIB не совсем от этой СГП
А вот пример отсутствия у нас дизеля, и он действительно не предусмотрен проектом СГП
-- 1.3.6.1.4.1.2011.6.164.1.1.1.9 hwSiteDGWorkStatus OBJECT-TYPE SYNTAX INTEGER { idle(1), working(2), unknown(255) } MAX-ACCESS read-only STATUS current DESCRIPTION "State of the diesel working state. It is an enumeration type: If the enumeration value is 1, it indicates that the diesel is in the idle state; If the enumeration value is 2, it indicates that the diesel is in the working state; If the enumeration value is 255, it indicates diesel operation status unknown. " ::= { hwSiteSummary 9 }
snmpget -v 2c -c MySeCrEt 10.XX.XX.197 .1.3.6.1.4.1.2011.6.164.1.1.1.9.0
SNMPv2-SMI::enterprises.2011.6.164.1.1.1.9.0 = No Such Object available on this agent at this OID
С одиночными (скалярами) объектами разобрались, они все подобны.
Рассмотрим объекты таблицы.
Например батареи, которыми укомплектована СГП. Они имеют установочные параметры — имена, ID, пороги алармов по температуре. Батарей может быть от 0 до какого то числа.
(не бесконечности)
-- 1.3.6.1.4.1.2011.6.164.1.4.4 hwBattString OBJECT IDENTIFIER ::= { hwSiteBatterys 4 } -- 1.3.6.1.4.1.2011.6.164.1.4.4.1 hwBattStringConfigTable OBJECT-TYPE SYNTAX SEQUENCE OF HwBattStringConfigEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "Battery string config table. Use this table to get battery string equipment ID and equipment name, to set battery standard capacity and battery install time as well. This table's index is hwBattStringConfigIndex, clone battery string config table." ::= { hwBattString 1 }
Объект hwBattStringConfigTable, обратите внимание, он not-accessible и snmpget c этим OID вернет No Such Object и добавление нуля к этому OID не поможет, это объект контейнер*(таблица)* , он не содержит данных, только другие объекты (строки таблицы), а точнее последовательность (sequence of) объектов типа HwBattStringConfigEntry — обратите внимание название ВСЕГДА с большой буквы, это название ТИПА ОБЪЕКТА, определяемого далее в MIB файле
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1 hwBattStringConfigEntry OBJECT-TYPE SYNTAX HwBattStringConfigEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "Battery string config table entry." INDEX { hwBattStringConfigIndex } ::= { hwBattStringConfigTable 1 }
Объект hwBattStringConfigEntry одна КОНКРЕТНАЯ строка таблицы (название всегда с маленькой буквы) имеющая тип HwBattStringConfigEntry (название с большой буквы) и дальше следует описание самого типа, это по сути СПИСОК (SEQUENCE) столбцов, входящих в эту строку
HwBattStringConfigEntry ::= SEQUENCE { hwBattStringConfigIndex Integer32, hwBattStringEquipId Unsigned32, hwBattStringEquipName OCTET STRING, hwSetBattsTempUpperLimit Integer32, hwSetBattsTempLowerLimit Integer32, hwSetBattsTempMeasureUpperLimit Integer32, hwSetBattsTempMeasureLowerLimit Integer32, hwSetBattStdCapacity Integer32, hwSetBattInstallTime OCTET STRING, hwBattStringConfigRowStatus RowStatus }
Дальше следуют описания объектов (столбцов) составляющих строку hwBattStringConfigEntry
Самый первый объект INDEX и он входит в состав всех объектов, составляющих hwBattStringConfigEntry
небольшое отступление: я раньше представлял себе “строение” SNMP “по человечески”, считал что если 1.1.1.2 например это какой то объект, то 1.1.1.2.1.5, 1.1.1.2.2.6, 1.1.1.2.3.7 это какие-то параметры (атрибуты) этого объекта (я жестоко ошибался),
а на самом деле:
164.1.4.4.1.1.4.2289
164.1.4.4.1.1.4.2290
164.1.4.4.1.1.5.2289
164.1.4.4.1.1.5.2290
это два параметра 164.1.4.4.1.1.4 и 164.1.4.4.1.1.5 двух объектов(строк) 2289 и 2290
так вот 2289 и 2290 — это и есть INDEX, присваивается в момент загрузки устройства и может измениться после перезагрузки
именно поэтому, если вы хотите, чтобы например интерфейсы не меняли в SNMP свой ifIndex рекомендуют прописывать в конфигурации:
на оборудовании Cisco: snmp-server ifindex persist
а на оборудовании Huawei: ifindex constant
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.1 hwBattStringConfigIndex OBJECT-TYPE SYNTAX Integer32 (1..100) MAX-ACCESS read-only STATUS current DESCRIPTION "Device table index of the battery string, which value range: 1 to 100." ::= { hwBattStringConfigEntry 1 } -- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.2 hwBattStringEquipId OBJECT-TYPE SYNTAX Unsigned32 (3001..3100) MAX-ACCESS read-only STATUS current DESCRIPTION "Batteries device ID, can be configured by users. Value range: 003,001 to 003,100, in which the first three digits specify the device type and the last three specify the device SN." ::= { hwBattStringConfigEntry 2 }
Идентификатор оборудования hwBattStringEquipId, ранее в этом файле (я не показываю) были описаны группы оборудования: 1000 — Монитор, 2000 — Выпрямители, 3000 — Батареи и т.д. поэтому конкретные батареи в группе будут иметь идентификаторы 3001, 3002 и т.д
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.3 hwBattStringEquipName OBJECT-TYPE SYNTAX OCTET STRING (SIZE (0..63)) MAX-ACCESS read-write STATUS current DESCRIPTION "Batteries device name, of the character string type, is used to specify the batteries. Users can configure it. Otherwise, the configured character can not be any other languages except English." ::= { hwBattStringConfigEntry 3 }
Вот пример целочисленного объекта измеряемого в градусах по Цельсию, позволяющего хранить (в Integer объекте) до десятых долей градуса.
Как? Посмотрите описание, возвращаемое значение необходимо делить на 10:
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.4 hwSetBattsTempUpperLimit OBJECT-TYPE SYNTAX Integer32 (-50..100) UNITS "centigrades" MAX-ACCESS read-write STATUS current DESCRIPTION "Upper threshold of the battery temperature alarm, can be configured by users. Value range: -50 to 100, Unit: centigrade (°„C), and the value is an integer (.0)." ::= { hwBattStringConfigEntry 4 }
А вот элемент возвращающий Ампер-часы (тоже integer но хранит до десятых долей)
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.8 hwSetBattStdCapacity OBJECT-TYPE SYNTAX Integer32 (0..10000) UNITS "Ah" MAX-ACCESS read-write STATUS current DESCRIPTION "Set battery standard capacity, is an inherent attribute of the device. Value range: 0 to 10000, unit: Ah, the value is an integer (.0). " ::= { hwBattStringConfigEntry 8 }
-- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.9 hwSetBattInstallTime OBJECT-TYPE SYNTAX OCTET STRING (SIZE (0..128)) MAX-ACCESS read-write STATUS current DESCRIPTION "Set battery install time, of the character string type, can be configured by users. Otherwise, the configured character can not be any other languages except English. " ::= { hwBattStringConfigEntry 9 } -- 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.100 hwBattStringConfigRowStatus OBJECT-TYPE SYNTAX RowStatus MAX-ACCESS read-create STATUS current DESCRIPTION "RowStatus of battery string config table." ::= { hwBattStringConfigEntry 100 }
Я пропустил несколько объектов таблицы, по сути все одно и тоже. На моем конкретном оборудовании snmpwalk -v 2c -c MySeCrEt 10.XX.XX.197 1.3.6.1.4.1.2011.6.164.1.4.4.1 возвращает:
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.1.5 = INTEGER: 5
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.1.6 = INTEGER: 6
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.2.5 = Gauge32: 3001
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.2.6 = Gauge32: 3002
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.3.5 = STRING: «Battery String1»
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.3.6 = STRING: «Battery String2»
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.4.5 = INTEGER: 50
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.4.6 = INTEGER: 50
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.5.5 = INTEGER: -10
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.5.6 = INTEGER: -10
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.8.5 = INTEGER: 190
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.8.6 = INTEGER: 190
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.100.5 = INTEGER: 1
SNMPv2-SMI::enterprises.2011.6.164.1.4.4.1.1.100.6 = INTEGER: 1
Вы же видите hwBattStringConfigIndex у меня принимает значения 5 и 6, установлены 2 батареи и все объекты(столбцы) представлены 2 раза для каждого INDEX’а (строки) отдельно
не всегда индекс нужного вам параметра будет последним числом в строке
озаботился созданием в Zabbx триггера состояния канала. Часто это не падение интерфейса, это может быть резервный канал, редко попадающий в таблицу маршрутизации, или стойка ВЧ связи, у которой с Ethernet портом все хорошо, а ВЧ тракт лёг. Самое простое это триггер на состояние Cisco IPSLA или Huawei NQA, но у Huawei, если настроен больше чем один NQA test, один от другого можно отделить с помощью ‘#SNMPINDEX’, из строки:
‘1.3.6.1.4.1.2011.5.25.111.4.1.1.3.{#SNMPINDEX}.{переменный_увеличивающийся на 1 индекс}’
и даже если настроить один запрос и не хранение последних значений, последняя часть превратится в {в длинный постоянный индекс}, все равно опрашивать надо:
«1.3.6.1.4.1.2011.5.25.111.4.1.1.3.11.80.105.110.103.79.118.101.114.82.82.76.7.80.105.110.103.78.69.83″
«1.3.6.1.4.1.2011.5.25.111.4.1.1.3.12.80.105.110.103.79.118.101.114.86.79.76.83.7.80.105.110.103.78.69.83″
где 11 и 12 как раз определяют номер NQA test
Вышеописанную таблицу проще понять если представить в виде ….. да, таблицы Excel:
hwBattStringConfigTable oid: 1.3.6.1.4.1.2011.6.164.1.4.4.1
|
hwBattStringConfigIndex |
hwBattStringEquipId |
hwBattStringEquipName |
|
|---|---|---|---|
|
1.3.6.1.4.1.2011.6.164.1.4.4.1.1.1 |
1.3.6.1.4.1.2011.6.164.1.4.4.1.1.2 |
1.3.6.1.4.1.2011.6.164.1.4.4.1.1.3 |
и так далее |
|
index: 5 oid:1.3.6.1.4.1.2011.6.164.1.4.4.1.1.1.5 |
value: 3001 oid:1.3.6.1.4.1.2011.6.164.1.4.4.1.1.2.5 |
value:»Battery String1″ oid:1.3.6.1.4.1.2011.6.164.1.4.4.1.1.3.5 |
и тому подобное |
|
index: 6 oid: 1.3.6.1.4.1.2011.6.164.1.4.4.1.1.1.6 |
3002 oid:1.3.6.1.4.1.2011.6.164.1.4.4.1.1.2.6 |
«Battery String2» oid:1.3.6.1.4.1.2011.6.164.1.4.4.1.1.3.6 |
|
А каждая вместе взятая строка таблицы (не заголовки), это объект HwBattStringConfigEntry описатель структуры данных (строки)
Надеюсь этот небольшой опус кому-нибудь поможет прийти к пониманию SNMP и MIB файлов немного быстрее, чем я к этому шел 🙂
ссылка на оригинал статьи https://habr.com/ru/articles/904634/
Добавить комментарий