SNMP: obtener ODIs de un archivo MIB

A la hora de monitorizar vía SNMP hay que verificar si la herramienta que estamos utilizando permite cargar la información a través del archivo MIB (Base de Información Gestionada) o si por el contrario requiere especificar el OID (Identificador de Objeto) del objeto a monitorizar.

Si permite cargar el archivo MIB, perfecto. Si no es así, tendremos que averiguar como extraer el OID de cada objeto a partir del MIB. Para ello, el propio paquete snmpd en sistemas GNU/Linux ofrece herramientas y comandos para facilitar la tarea.

El comando que vamos a utilizar para realizar la conversión es snmptranslate. Para hacer el trabajo más cómodo, lo primero que hacemos es copiar el archivo MIB a una de las rutas en las que snmpd cargará automátimente el archivo.

/usr/share/snmp/mibs/
$HOME/.snmp/mibs
[...]

En este caso he copiado el archivo STREAMLINE-TAPE-LIBRARY-MIB.txt y el objeto del cual necesito averiguar el OID es slFanTable:

slFanTable OBJECT-TYPE
    SYNTAX  SEQUENCE OF SLFanEntry
    MAX-ACCESS  not-accessible
    STATUS  current
    DESCRIPTION  "A table of the library's fans"
::= { slPhysHardware 6 }

Ejecutando snmptranslate con los siguientes parámetros se visualiza el OID del objeto:

$ snmptranslate -m +STREAMLINE-TAPE-LIBRARY-MIB -On -IR slFanCount
.1.3.6.1.4.1.1211.1.15.4.5

En la página man de snmptranslate encontraréis muchos más ejemplos con mucha utilidad para la gestión de archivos MIB:

$ snmptranslate -On -IR sysDescr 
will translate "sysDescr" to a more qualified form:
system.sysDescr

$ snmptranslate -Onf -IR sysDescr 
.iso.org.dod.internet.mgmt.mib-2.system.sysDescr

$ snmptranslate -Td -OS system.sysDescr 
SNMPv2-MIB::sysDescr
sysDescr OBJECT-TYPE
  -- FROM SNMPv2-MIB
  -- TEXTUAL CONVENTION DisplayString
  SYNTAX OCTET STRING (0..255)
  DISPLAY-HINT "255a"
  MAX-ACCESS read-only
  STATUS current
  DESCRIPTION "A textual description of the entity. This
               value should include the full name and
               version identification of the system's
               hardware type, software operating-system,
               and networking software."
::= { system(1) 1 }

$ snmptranslate -Tp -OS system 
+--system(1)
   |
   +-- -R-- String    sysDescr(1)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -R-- ObjID     sysObjectID(2)
   +-- -R-- TimeTicks sysUpTime(3)
   +-- -RW- String    sysContact(4)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -RW- String    sysName(5)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -RW- String    sysLocation(6)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -R-- Integer   sysServices(7)
   +-- -R-- TimeTicks sysORLastChange(8)
   |        Textual Convention: TimeStamp
   |
   +--sysORTable(9)
      |
      +--sysOREntry(1)
         |
         +-- ---- Integer   sysORIndex(1)
         +-- -R-- ObjID     sysORID(2)
         +-- -R-- String    sysORDescr(3)
         |        Textual Convention: DisplayString
         |        Size: 0..255
         +-- -R-- TimeTicks sysORUpTime(4)
                  Textual Convention: TimeStamp

$ snmptranslate -Ta | head 
dump DEFINITIONS ::= BEGIN
org ::= { iso 3 }
dod ::= { org 6 }
internet ::= { dod 1 }
directory ::= { internet 1 }
mgmt ::= { internet 2 }
experimental ::= { internet 3 }
private ::= { internet 4 }
security ::= { internet 5 }
snmpV2 ::= { internet 6 }

$ snmptranslate -Tl | head 
will produce the following dump:
.org(3)
.dod(6)
.internet(1)
.directory(1)
.mgmt(2)
.mib-2(1)
.system(1)
.sysDescr(1)
.sysObjectID(2)
.sysUpTime(3)

$ snmptranslate -To | head 
.1.3
.1.3.6
.1.3.6.1
.1.3.6.1.1
.1.3.6.1.2
.1.3.6.1.2.1
.1.3.6.1.2.1.1
.1.3.6.1.2.1.1.1
.1.3.6.1.2.1.1.2
.1.3.6.1.2.1.1.3

$ snmptranslate -Ts | head 
.iso.org
.iso.org.dod
.iso.org.dod.internet
.iso.org.dod.internet.directory
.iso.org.dod.internet.mgmt
.iso.org.dod.internet.mgmt.mib-2
.iso.org.dod.internet.mgmt.mib-2.system
.iso.org.dod.internet.mgmt.mib-2.system.sysDescr
.iso.org.dod.internet.mgmt.mib-2.system.sysObjectID
.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime

$ snmptranslate -Tt | head 
  org(3) type=0
    dod(6) type=0
      internet(1) type=0
        directory(1) type=0
        mgmt(2) type=0
          mib-2(1) type=0
            system(1) type=0
              sysDescr(1) type=2 tc=4 hint=255a
              sysObjectID(2) type=1
              sysUpTime(3) type=8