Как стать автором
Обновить

Как читать MIB файлы

Уровень сложностиПростой
Время на прочтение17 мин
Количество просмотров1.9K

Если для общения по 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 файлов немного быстрее, чем я к этому шел :-)

Теги:
Хабы:
+14
Комментарии0

Публикации

Работа

Ближайшие события