Академический Документы
Профессиональный Документы
Культура Документы
Sin embargo, antes de embarcarse en una presentación técnica que describe cómo ejecutar
una consulta "get" o "set" en SNMP v2 o v3, proponemos una presentación de los
conceptos de este protocolo. Esto le permitirá comprender mejor los entresijos de la librería
con el fin de llevarlo al Grial absoluto de su completo dominio.
En esta primera parte presentamos el protocolo SNMP y el uso de comandos del sistema
que le permitirán tocar los conceptos que exponemos.
plan
Presentación del protocolo
o SNMP
o MIB
o ASN1
o Marque con agentes usando los comandos del sistema
pysnmp
o Elementos básicos
o Las solicitudes
o Las tablas
o Usa tus MIB con un agente
¿Qué es SNMP?
SNMP significa Protocolo simple de administración de red
Enrutadores, interruptores
Estaciones de trabajo
impresoras
Servicios (mensajería, ftp, ssh, http, proceso, memoria ...)
Por supervisión, es necesario entender "para obtener información" sobre el estado de estos
"elementos". Pero este protocolo también permite llevar a cabo acciones de mantenimiento
como reiniciar un servicio o una máquina, limpiar los cabezales de lectura de una
impresora, etc.
Cómo funciona SNMP
El sitio de wikipedia ofrece una breve presentación de este último en su versión en francés.
La versión en inglés del mismo artículo es mucho más completa y cita el conjunto de RFC
que la describen.
¿Cómo funciona?
A veces, sin embargo, no es muy simple: los MIB son "legibles por el hombre",
pero para citar a uno de mis colegas, a veces, los que llegan allí no son realmente
humanos.
El protocolo es simple pero su implementación puede ser mucho más compleja.
La versión 3 ha implementado su propia capa SSH en lugar de hacer HTTPS (HTTP
sobre SSH). Esto dificulta la comunicación: no hay autonegociación para el cifrado
y debe proporcionar 5 información para crear una conexión segura.
Algunos competidores están empezando a surgir como WMI y ofrecen un lenguaje
de consulta más rico (WQL).
histórico
MIB
Antes de que podamos lanzar nuestras primeras consultas SNMP, es importante entender
qué es una MIB.
Esta no es una base de datos estrictamente hablando como una base de datos relacional.
Existe solo a través del agente que es libre de implementarlo como lo desee. Cuando el
agente no funciona, no hay datos en el MIB. Solo existe la descripción del MIB
(generalmente un archivo de texto).
Es el agente (el software) el que almacena (pero debería decir que gestiona) esta
información, que a menudo es "volátil", como quiere.
Tome el ejemplo de la cantidad de procesos activos en una máquina. Éste está identificado
de manera única por el MIB-II. Pero esta información es solicitada por el agente del sistema
operativo cuando recibe una solicitud para este último, porque estos datos están cambiando
en todo momento. Por lo tanto, no es "almacenado" por el sistema operativo. No es
accesible a través de una consulta SQL. Se proporciona cuando se solicita, y siempre que el
agente no lo haya solicitado al sistema operativo, no está realmente disponible o aún no
existe:
Una gran cantidad de información de MIB es de esta naturaleza, otros a veces se almacenan
en algún lugar, como la persona a cargo de una máquina, el puerto de un servicio o el
estado de una línea de alimentación o un diodo (apagado, encendido) De acuerdo con los
constructores / OS, esta información se almacena físicamente de manera diferente, pero la
MIB se estandariza para la gran mayoría, de modo que el gerente siempre solicita la misma
información de la misma manera. Depende del agente averiguar a dónde ir dependiendo del
material / servicio que se maneja.
MIB-II
Una de las MIB más conocidas es MIB-II, descrita por RFC 1213 .
sistema
las interfaces
Traducción de direcciones
IP
ICMP
TCP
UDP
EGP "
transmisión
y SNMP
Es decir, cualquier información que pueda solicitar sobre MIB-II se colocará en uno de
estos grupos.
Algunos ejemplos de información que puede encontrar en estos conjuntos son:
su nombre, "ifDescr"
su tipo, "DisplayString", una cadena de hasta 255 caracteres
su modo de acceso, "solo lectura"
su estado, "obligatorio"
finalmente su ubicación en el nodo padre "ifEntry": segundo subelemento del nodo
"ifEntry"
Para comprender esta descripción "jerárquica" de los datos "ifDescr", aquí hay un gráfico
que representa la jerarquía principal de todas las MIB:
Jerarquía principal de un MIB ( Servicio de Wikipedia )
Por lo tanto, la información se numera de acuerdo con su orden en el árbol MIB, estos
números se denominan OID (Object IDentifier).
Aquí hay algunos ejemplos de OID:
Se observará en este último que el OID " 1.3.6.1.2.1.2.2.1.2 " proporciona la ruta completa
a la información " ifDescr ".
Esto es lo que haremos PySNMP: enviar consultas preguntando el valor de un nodo
(información) ubicado en una ubicación específica en un MIB o cambiando este valor.
La práctica se acerca.
Un universo de MIB
Comunidades
El acceso a la información de un MIB se filtra por lo que se llama la "comunidad", excepto
la versión 3 del protocolo.
"Comunidad" es un tipo de palabra compartida, "pública" por defecto.
"Público" puede estar cerca del inicio de sesión "anónimo" disponible en la mayoría de los
servidores ftp.
Las órdenes
Antes de lanzar nuestros primeros pedidos, veamos los tipos de solicitudes que el protocolo
propone para permitir que los administradores y agentes intercambien información:
Requisitos previos
Pruebe con una impresora de red o una máquina con una dirección IP
Generalmente son compatibles con el protocolo SNMP
Instale su propio agente siguiendo el tutorial mencionado anteriormente
Inicie sus pedidos al agente "demo.snmplabs.com" de acceso libre a través de
Internet, lo cual haremos.
El comando "OBTENER"
Ejemplo:
Los otros valores debajo de un nodo (.1, .2, etc.) designan los subelementos de este último.
Por lo tanto, la información puede solicitarse a través de la ruta completa en forma de un
OID digital " 1.3.6.1.2.1.1.1. 0 " (o texto) o mediante el nombre corto. Porque es
normalmente único.
Acepta los mismos parámetros que "GET" pero no devuelve el OID solicitado, sino el que
sigue en el árbol. Al agrupar un GET y varios GET NEXT, puede consultar todo el árbol de
un MIB.
Puede ejecutar GET NEXT en cualquier nodo, por lo que la raíz de un MIB.
Para evitar enviar varios comandos "GET" uno después del otro, lo que sobrecarga los
intercambios de red, es posible solicitar consultar varios OID a la vez a través del comando
"GET BULK". Pero no todos los agentes lo admiten.
También puede utilizar el comando "Walk" para navegar por un árbol completo, como lo
haría con "GET" y "GET NEXT". Pero es el comando "WALK" el que los ejecutará por ti.
Traducir OID
El comando "snmptranslate" se utiliza para traducir los OID del modo numérico al modo de
texto y viceversa.
"-u": usuario
"-l": nivel de seguridad para identificarte
"-a": protocolo de autenticación
(encriptación de contraseña)
"-A": contraseña de autenticación
"-x": algoritmo de cifrado para la conexión
"-X": contraseña / sal para encriptar la conexión
Aquí es donde descubrimos el dolor del protocolo v3 que implementa las conexiones SSH
sin hacer SNMP sobre SSH: no hay autonegociación de algoritmos de cifrado, es necesario
especificar todo ¡por uno mismo! Miserable!
Las versiones 1 y 2 del protocolo son insuficientemente seguras y nada para el primero.
Por lo tanto, sea cual sea la solución elegida, siempre apague el modo anónimo o verifique
cada información provista.
Luego, cree acceso ACLS a cada MIB por usuario para tener control completo sobre quién
puede hacer qué.
conclusión
Los comandos básicos de SNMP son bastante simples una vez que comprende cómo
manipular los parámetros que utilizan.
La segunda parte de este tutorial sobre SNMP y PySNMP está dedicada al descubrimiento
de PySNMP:
Instalar PySNMP
Finalmente, la cuarta parte le enseñará cómo crear un agente usando un MIB personalizado.
introducción
Este tutorial le propone descubrir la biblioteca de Python PySNMP que permite dialogar
con cualquier material compatible con el protocolo del mismo nombre.
En esta segunda parte, presentaremos el uso del protocolo SNMP a través de la biblioteca
PySNMP .
plan
Presentación del protocolo
o SNMP
o MIB
o ASN1
o Las solicitudes
pysnmp
o Las solicitudes
o Las tablas
o Usa tus MIB con un agente
pysnmp
Ahora que hemos introducido el protocolo SNMP y algunos comandos para usarlo,
finalmente podemos pasar al tema real de este tutorial: ¡la biblioteca PySNMP!
PySNMP es una biblioteca de Python que implementa todas las versiones del protocolo
SNMP por completo en Python.
Con PySNMP podrá manipular datos en formato ASN.1 ya que es el utilizado por el
protocolo SNMP.
de pyasn1.type.univ import *
a = Entero ( 21 ) * 2
imprimir ( a )
a = Entero ( - 1 ) + Entero ( 1 )
imprimir ( a )
a = int ( Entero ( 42 ))
imprimir ( a )
a = OctetString ( 'Hello' ) + ',' + OctetString ( hexValue =
'5079534e4d5021' )
imprimir ( a , tipo ( a ))
Comandos básicos
PySNMP ofrece varias funciones de "bajo nivel" para usar el protocolo SNMP, pero se
recomienda utilizar el módulo "hlapi" que significa "API de alto nivel".
Este último ofrece funciones de alto nivel, fácil de configurar para ejecutar los comandos
básicos que se pueden enumerar de esta manera
de la importación pysnmp.hlapi *
l = [ x para x en dir () si 'Cmd' en x ]
imprimir ( l )
ayuda ( 'pysnmp.hlapi.getCmd' )
que muestra
[ 'bulkCmd' , 'getCmd' , 'nextCmd' , 'setCmd' ]
Ayuda sobre la función getCmd en pysnmp . hlapi :
pysnmp . hlapi . getCmd = getCmd ( snmpEngine , authData ,
transportTarget , contextData , * varBinds , ** opciones )
Crea un generador para realizar una o más consultas SNMP GET .
Antes de usar estos comandos, aprenderemos cómo manipular los parámetros que
necesitan:
OIDS
". "
Comenzando desde la plaza central, varias calles te miran.
"1"
Toma el primero desde la izquierda
Llegas a un lugar nuevo.
"2"
Varias calles te enfrentan nuevamente.
Toma el segundo a tu izquierda.
Llegas a un lugar nuevo.
"3"
Varias calles te enfrentan nuevamente.
Toma el tercero a tu izquierda.
Llegas a un lugar nuevo.
"0"
Hay una placa en el cuadro, contiene tu información.
Si envió un "GET" lo leyó, si envió un "SET" lo cambia.
Camino en el MIB
Un OID está representado por una secuencia de valores numéricos o por una serie de
nombres que designan cada rama atravesada en el MIB.
Si desea obtener más información sobre estos OID, lo invito a leer la documentación de
PySNMP sobre este tema .
Para crear un OID con PySNMP, es necesario crear una instancia de la clase
"ObjectIdentity"
o = ObjectIdentity ( '1.3.6.1.2.1.1.3.0' )
o = ObjectIdentity (( 1 , 3 , 6 , 1 , 2 , 1 , 1 , 3 , 0 ))
o = ObjectIdentity ( 'SNMPv2-MIB' , 'sysUpTime' , 0 )
o = ObjectIdentity ( 'iso.org.dod.internet.mgmt.mib-
2.system.sysUpTime.0' )
de la importación pysnmp.hlapi *
o = ObjectIdentity ( '1.3.6.1.2.1.1.3.0' )
imprimir ( o . getLabel ())
imprimir ( o . getMibNode ())
imprimir ( o . getMibSymbol ())
imprimir ( o . getOid ())
imprimir ( o . prettyPrint ())
Seguimiento (última llamada más reciente):
Archivo "<...> / oid_example.py", línea 4, en <módulo>
impresión (o.getLabel ())
Archivo "<...> / site-packages / pysnmp / smi / rfc1902.py", línea 185,
en getLabel
elevar SmiError ('% s no completamente inicializado'% self .__ class
__.__ name__)
pysnmp.smi.error.SmiError: el objeto ObjectIdentity no se ha
inicializado por completo
Pero ¿por qué este error? Los ejemplos de la documentación de PySNMP son bastante
torpes a este respecto:
Es necesario buscar realmente este OID en la MIB, no es automático porque hay muchas
MIB. PySNMP viene con todo un arsenal de Mibs, pero tienes que decirle dónde
encontrarlos.
Usted tiene el derecho de molestar; Una vez que sus nervios se hayan calmado, recuerde
que es un producto OpenSource y que tiene la suerte de tener acceso al código.
El comando "ayuda" de Python muestra que hay un método "resolveWithMib".
Pero una pequeña búsqueda en el árbol de PySNMP muestra que aparentemente se obtiene
un "MibViewController" del motor SNMP Engine.
El motor es, de alguna manera, el corazón de la biblioteca PySNMP que le permite
interactuar con los diferentes elementos del protocolo (mensajes, hosts, comunidades, OID,
MIBS, etc.).
Puede tener varios motores para, por ejemplo, trabajar con múltiples MIB.
de la importación pysnmp.hlapi *
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
o resolveWithMib ( mvc )
o = ObjectIdentity ( '1.3.6.1.2.1.1.3.0' )
imprimir ( o . getLabel ())
imprimir ( o . getMibNode ())
imprimir ( o . getMibSymbol ())
imprimir ( o . getOid ())
imprimir ( o . prettyPrint ())
de la importación pysnmp.hlapi *
desde pysnmp.smi.view import MibViewController
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
si no mvc :
mvc = MibViewController ( ver getMibBuilder ())
o = ObjectIdentity ( '1.3.6.1.2.1.1.3.0' )
o resolveWithMib ( mvc )
imprimir ( o . getLabel ())
imprimir ( o . getMibNode ())
imprimir ( o . getMibSymbol ())
imprimir ( o . getOid ())
imprimir ( o . prettyPrint ())
¡Y eso es todo!
El controlador MIB utiliza el MIB PySNMP "generador" predeterminado que almacena las
versiones "pythonized" de MIBS en la subcarpeta de instalación pysnmp: "pysnmp / smi /
mibs /". No dude en echar un vistazo.
"Sí, pero trabajo con MIB patentadas porque soy un constructor de hardware o utilizo un
hardware específico del fabricante y necesitaría mi propio MIB".
No hay problema, los OID pueden hacerlo por usted.
Supongamos que tiene su propia MIB, como la de abajo, que ha sido tomada de este tutorial
:
IMPORTACIONES
OBJETO DE TIPO, Integer32, NOTIFICACIÓN-TIPO, empresas
DESDE SNMPv2-SMI
;
dataValue OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS de solo lectura
ESTADO actual
DESCRIPCIÓN "Un conteo de muestra de algo".
:: = {MakinaCorpus 1}
testTrap NOTIFICATION-TYPE
ESTADO actual
DESCRIPCIÓN "Notificación de prueba"
:: = {MakinaCorpus 3}
FIN
En general, las MIB de los fabricantes se almacenan en las "empresas" de OID: iso. org.
dod. Internet . privado Empresas (1.3.6.1.4.1)
El sitio del monitor IP parece mostrar que el subnodo ".3" es libre, por lo que lo elegí para
instalar el Makina MIB anterior, pero podría tomar un subnodo existente.
Ahora es necesario compilar esta MIB con PySMI . Normalmente esta biblioteca se instala
con PySNMP, de lo contrario ejecuta "pip install pysmi".
PySNMP viene con varios scripts, incluido "build-pysnmp-mib" que nos hará esta
conversión:
Para compilar su MIB, debe utilizar el script "mibdump.py", que generalmente se instala en
la carpeta "/ usr / local / bin"
Finalmente, para construir un OID utilizando este último, ahora debe escribir:
o = ObjectIdentity (( 1 , 3 , 6 , 1 , 4 , 1 , 3 , 1 ))
o addMibSource ( '/ path / to / makina_mib / dot / py / folder ' )
o loadMibs ( "MAKINA_MIB" )
o resolveWithMib ( mvc )
Veremos al ejecutar los comandos básicos que también podemos especificar directamente la
fuente ASN.1 en lugar de compilar la MIB. Desde la versión 4.3, PySNMP puede hacerlo
automáticamente en algunos casos.
El motor SNMP
PySNMP permite el diálogo con todos los componentes SNMP a través de un objeto
"Motor SNMP". Su descripción completa está disponible en la documentación oficial.
Muy a menudo solo necesitas instanciarlo.
de la importación pysnmp.hlapi *
se = SnmpEngine ()
Configuración de autenticación
de la importación pysnmp.hlapi *
cv1 = CommunityData ( 'public' , mpModel = 0 ) # SNMPv1
cv2 = CommunityData ( 'public' , mpModel = 1 ) # SNMPv2c
Los usuarios utilizados para las conexiones a través del protocolo v3 se deben instanciar a
través de la clase "UsmUserData" que acepta 5 parámetros:
Ejemplo:
u = UsmUserData ( 'userlogin'
, authKey = 'authenticationkey'
, privKey = 'encryptionkey'
, privProtocol = usmAesCfb256Protocol )
imprimir ( u )
UsmUserData (userName = 'userlogin', authKey = <AUTHKEY>,
privKey = <PRIVKEY>, authProtocol = (1, 3, 6, 1, 6, 3, 10, 1, 1, 2),
privProtocol = (1, 3, 6, 1, 4, 1, 9, 12, 6, 1, 2),
securityEngineId = '<DEFAULT>', securityName = 'userlogin')
Tipos de transporte
UdpTransportTarget
Udp6TransportTarget
Ejemplo:
Contextos
Estos son contextos SNMP tal como se define en RFC 3411. # 3.3.1
Por lo tanto, el contexto permite indicar a qué subconjunto de MIB se dirige el agente.
ContextEngineId
O el contextName
OID y ObjectType
El comando "OBTENER"
Ahora que hemos revisado todos los elementos necesarios para la llamada de pedidos,
FINALMENTE podremos escribir nuestro primer comando GET
Para enviar un mensaje "OBTENER", use la función "getCmd" enumerada anteriormente.
Finalmente, cuando ejecuta este comando puede solicitar múltiples OID a la vez.
La sintaxis es la siguiente:
O el siguiente comando:
data = (
ObjectType ( ObjectIdentity ( 'SNMPv2-MIB' , 'sysLocation' , 0 )),
ObjectType ( ObjectIdentity ( 'SNMPv2-MIB' , 'sysDescr' , 0 ))
)
g = getCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 0 )
, UdpTransportTarget (( 'demo.snmplabs.com' , 161 ))
, ContextData ()
, * datos )
if errorIndication :
print ( errorIndication )
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) -
1 ] [ 0 ] o '?'
)
)
else :
para varBind en varBinds :
print ( '=' . join ([ x . prettyPrint () para x en varBind ]))
SNMPv2-MIB :: sysLocation.0 = Moscú, Rusia
SNMPv2-MIB :: sysDescr.0 = SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m
Para ejecutarlo con el protocolo "v2c", simplemente cambie el valor del parámetro
"mpModel = 1" en el objeto de la comunidad.
Para ejecutarlo con el protocolo "v3", reemplace la instancia "CommunityData" con una
instancia "UsmUserData".
UsmUserData ( "usr-sha-des"
, authProtocol = usmHMACSHAAuthProtocol
, authKey = "authkey1"
, privProtocol = usmDESPrivProtocol
, privKey = "privkey1" )
El comando GetNEXT
El comando "GetNEXT" se ejecuta exactamente como un comando "get", con los mismos
parámetros.
Recupera el elemento que sigue al OID pasado como argumento.
de la importación pysnmp.hlapi *
g = nextCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 1 )
, UdpTransportTarget (( 'demo.snmplabs.com' , 161 ))
, ContextData ()
, ObjectType ( ObjectIdentity ( 'SNMPv2-MIB' , 'sysObjectID'
, 0 )))
if errorIndication :
print ( errorIndication )
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint ()
, errorIndex y varBinds [ int ( errorIndex ) - 1
] [ 0 ] o '?'
)
)
else :
para varBind en varBinds :
print ( '=' . join ([ x . prettyPrint () para x en varBind ]))
SNMPv2-MIB :: sysUpTime.0 = 280102869
de la importación pysnmp.hlapi *
g = nextCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 1 )
, UdpTransportTarget (( 'demo.snmplabs.com' , 161 ))
, ContextData ()
, ObjectType ( ObjectIdentity ( 'SNMPv2-MIB' , 'sysObjectID'
, 0 )))
if errorIndication :
print ( errorIndication )
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) - 1 ] [ 0 ] o '?'
)
)
else :
para varBind en varBinds :
print ( '=' . join ([ x . prettyPrint () para x en
varBind ]))
SNMPv2-MIB :: sysUpTime.0 = 280140241
SNMPv2-MIB :: sysContact.0 = SNMP Laboratories, info@snmplabs.com
SNMPv2-MIB :: sysName.0 = zeus.snmplabs.com
SNMPv2-MIB :: sysLocation.0 = Moscú, Rusia
SNMPv2-MIB :: sysServices.0 = 72
SNMPv2-MIB :: sysORLastChange.0 = 280140343
SNMPv2-MIB :: sysORID.1 = PYSNMP-MIB :: pysnmpObjects.1
SNMPv2-MIB :: sysORDescr.1 = comentario nuevo
SNMPv2-MIB :: sysORUpTime.1 = 123
El comando "SET"
El comando "SET" se ejecuta exactamente como un comando "get", con los mismos
parámetros.
Excepto que el ObjectType contiene un segundo argumento: el nuevo valor.
de la importación pysnmp.hlapi *
def show_item ( ):
g = getCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 1 )
, UdpTransportTarget (( 'demo.snmplabs.com' , 161 ))
, ContextData ()
, ObjectType ( ObjectIdentity ( 'SNMPv2-MIB' ,
'sysORDescr' , 1 )))
show_item ()
SNMPv2-MIB :: sysORDescr.1 = Aquí está mi nueva nota
SNMPv2-MIB :: sysORDescr.1 = Hola desde Lannion usando el procesador
Kalray en Linux
conclusión
Los comandos básicos de SNMP se usan con bastante facilidad una vez que comprende
cómo configurar los diferentes parámetros que requieren.
introducción
Este tutorial le propone descubrir la biblioteca de Python PySNMP que permite dialogar
con cualquier material compatible con el protocolo del mismo nombre.
En esta tercera parte, le presentamos cómo consultar datos de tipo "tabla" desde la línea de
comando y con la biblioteca PySNMP .
Si no conoce el protocolo SNMP, lo invitamos a leer la primera parte de este tutorial que le
presentará el protocolo SNMP , sus cualidades y defectos, y le proporcionará las
herramientas básicas para comenzar a usarlo y quitárselo. Sin este conocimiento preliminar,
este tercer capítulo puede parecer muy difícil de entender.
Las tablas
Parte de la información de MIB se proporciona en forma de tabla.
IfEntry :: =
SECUENCIA {
ifIndex InterfaceIndex,
ifDescr DisplayString,
ifType IANAifType,
ifMtu Integer32,
ifSpeed Gauge32,
ifPhysAddress PhysAddress,
ifAdminStatus INTEGER,
ifOperStatus INTEGER,
ifLastChange TimeTicks,
ifInOctets Counter32,
ifInUcastPkts Counter32,
ifInNUcastPkts Counter32, - obsoleto
ifInDiscards Counter32,
ifInErrors Counter32,
ifInUnknownProtos Counter32,
ifOutOctets Counter32,
ifOutUcastPkts Counter32,
ifOutNUcastPkts Counter32, - obsoleto
ifOutDiscards Counter32,
ifOutErrors Counter32,
ifOutQLen Gauge32, - obsoleto
ifSpecific OBJECT IDENTIFIER - obsoleto
}
Se lee que el elemento "ifTable" es una secuencia de elementos "ifEntry" y que cada
elemento "ifEntry" está indexado por un elemento "ifIndex".
Finalmente, "ifEntry" en sí es una secuencia de muchos elementos como "ifDescr",
"ifType", "ifSpeed", etc.
En otras palabras, "ifTable" es una matriz de líneas de tipo "ifEntry" con múltiples
columnas "ifDescr", "ifType", etc.
Es posible encontrar los diferentes registros de la tabla gracias al índice "ifIndex" de las
entradas "ifEntry". Aquí tenemos 2 valores para el índice: 1 y 2, por lo tanto, 2 registros.
Por lo tanto, cada columna del registro "ifEntry" estará asociada a su índice:
Esto puede ser complicado cuando una entrada de tabla es indexada por múltiples índices.
Habrá notado que el valor del índice se encuentra en el OID de cada "columna". Es lo
mismo cuando hay varios índices, están encadenados en el OID, te dejo leer la
documentación de PySNMP en las tablas, lo que explica bastante bien.
Pero puede hacerlo de manera muy simple con el comando "nextCmd" si lo configura
correctamente.
Antes de ver cómo hacer esta lectura con buenas prácticas, trataremos de explorar los
diferentes elementos de la MIB "Interfaz" OID (IF-MIB, ifTable) de forma manual y
devolveremos una lista de diccionarios, cada uno con los valores de cada uno. columnas del
nodo "ifEntry".
Esto nos permitirá comprender mejor la mecánica utilizada por PySNMP y nos enseñará a
manipular las sucesivas iteraciones de "nextCmd".
Una vez que implementamos una solución funcional, podemos aplicar algunas
configuraciones adicionales para simplificar la creación de nuestra lista de registros.
Usando el siguiente comando veremos todos los elementos de la entrada (IF-MIB, ifTable):
g = nextCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 1 )
, UdpTransportTarget (( 'demo.snmplabs.com' , 161 )
, ContextData ()
, ObjectType ( ObjectIdentity ( 'IF-MIB' , 'ifTable' ))
, lexicographicMode = False )
if errorIndication :
print ( errorIndication )
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) - 1 ] [ 0 ] o '?'
)
)
else :
para varBind en varBinds :
imprimir ( varBind )
oid = varBind [ 0 ]
value = varBind [ 1 ]
El número del ifEntry al que pertenece cada propiedad viene proporcionado por el
último elemento de la tupla "Mib Symbol" InterfaceIndex (1) o InterfaceIndex ( 2 )
El nombre de la propiedad es provisto por el último elemento de la Etiqueta
('iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2', 'interfaces', 'ifTable', 'ifEntry', ' ifDescr ')
Así que podemos crear una lista de cada elemento "ifEntry" en un diccionario, de la
siguiente manera:
de la importación pysnmp.hlapi *
desde pysnmp.smi.view import MibViewController
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
si no mvc :
mvc = MibViewController ( ver getMibBuilder ())
#
# # 1.3.6.1.2.1.2.2 ('iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2',
'interfaces', 'ifTable')
oid_iftable = ObjectIdentity ( 'IF-MIB' , 'ifTable' )
oid_iftable . resolveWithMib ( mvc )
if errorIndication :
print ( errorIndication )
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) - 1 ] [ 0 ] o '?'
)
)
else :
para varBind en varBinds :
imprimir ( varBind )
oid = varBind [ 0 ]
value = varBind [ 1 ]
si no es clave en dIndex :
dIndex [ clave ] = {}
datos . append ( dIndex [ clave ])
Impresión de artículos
Artículo 1
ifOutUcastPkts: 11277302
ifInErrors: 0
ifInUcastPkts: 22554581
ifOutErrors: 0
ifOutDiscards: 0
ifInNUcastPkts: 2506064
ifType: 'ethernetCsmacd'
ifSpecific: SNMPv2-SMI :: zeroDotZero
ifSpeed: 100000000
ifPhysAddress: 00: 12: 79: 62: f9: 40
ifOutNUcastPkts: 1253033
ifOperStatus: 'up'
ifIndex: 1
ifInOctets: 275667056
ifDescr: eth0
ifLastChange: 150603818
ifInDiscards: 0
ifOutOctets: 125303333
ifAdminStatus: 'arriba'
ifInUnknownProtos: 125301
ifMtu: 1500
ifOutQLen: 0
Artículo 2
ifOutUcastPkts: 11277305
ifInErrors: 0
ifInUcastPkts: 22554583
ifOutErrors: 0
ifOutDiscards: 0
ifInNUcastPkts: 2506065
ifType: 'ethernetCsmacd'
ifSpecific: SNMPv2-SMI :: zeroDotZero
ifSpeed: 100000000
ifPhysAddress: 00: 12: 79: 62: f9: 41
ifOutNUcastPkts: 1253034
ifOperStatus: 'up'
ifIndex: 2
ifInOctets: 250606431
ifDescr: eth1
ifLastChange: 249303192
ifInDiscards: 0
ifOutOctets: 125303346
ifAdminStatus: 'arriba'
ifInUnknownProtos: 125304
ifMtu: 1500
ifOutQLen: 0
Esta técnica es útil para comprender cómo se organizan los registros en una tabla SNMP y
para reconstruirlos manualmente.
Pero el comando "getNext" hace que sea posible recuperarlos mucho más simplemente al
indicarle qué información queremos leer en las entradas "ifEntry" para cada una de sus
llamadas en lugar de leerlas una a una, como anteriormente.
Para eso es suficiente pasarle el OID que nos interesa en solo 1 vez:
de la importación pysnmp.hlapi *
item = 0
para errorIndication , \
errorStatus , \
errorIndex , \
varBinds en nextCmd ( SnmpEngine (),
CommunityData ( 'public' , mpModel = 0 ),
UdpTransportTarget (( 'demo.snmplabs.com' ,
161 )),
ContextData (),
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifDescr' )),
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifType' )),
ObjectType ( ObjectIdentity ( 'IF-MIB' , 'ifMtu'
)),
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifSpeed' )),
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifType' )),
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifPhysAddress' )),
lexicographicMode = False ):
if errorIndication :
print ( errorIndication )
pausa
elif errorStatus :
print ( ' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) - 1 ] [ 0 ] o
'?'
)
)
pausa
else :
para varBind en varBinds :
print ( '=' . join ([ x . prettyPrint () para x en
varBind ]))
Con el siguiente resultado:
Artículo 0
IF-MIB :: ifDescr.1 = eth0
IF-MIB :: ifType.1 = 'ethernetCsmacd'
IF-MIB :: ifMtu.1 = 1500
IF-MIB :: ifSpeed.1 = 100000000
IF-MIB :: ifType.1 = 'ethernetCsmacd'
IF-MIB :: ifPhysAddress.1 = 00: 12: 79: 62: f9: 40
Artículo 1
IF-MIB :: ifDescr.2 = eth1
IF-MIB :: ifType.2 = 'ethernetCsmacd'
IF-MIB :: ifMtu.2 = 1500
IF-MIB :: ifSpeed.2 = 100000000
IF-MIB :: ifType.2 = 'ethernetCsmacd'
IF-MIB :: ifPhysAddress.2 = 00: 12: 79: 62: f9: 41
conclusión
Vimos en esta tercera parte cómo manejar las tablas SNMP con la línea de comandos o la
biblioteca de Python.
PySNMP no tiene un comando especial para navegar por una tabla, por lo que tenemos que
listar todos sus elementos a través de "getNext".
Afortunadamente, es posible recuperar todas las propiedades de una entrada a través de una
sola llamada a "getNext", lo que simplifica enormemente la reconstitución de los registros
de la tabla.