2010-12-31 17 views
8

Utilizando el marco de trabajo pysnmp, obtengo algunos valores realizando una caminata snmp. Por desgracia para el OIDConvierta cadena de octetos snmp a formato de fecha legible para humanos

1.3.6.1.21.69.1.5.8.1.2 (DOC-CABLE-DISPOSITIVO-MIB)

obtengo un resultado extraño, que no puedo imprimir correctamente aquí, ya que contiene caracteres ASCII como BELACK

cuando se hace una repr me sale:

OctetString ('\ x07 \ xd8 \ t \ x17 \ x03 \ x184 \ x00')

embargo, la salida debería verse como:

2008-9-23,3: 24: 52,0

el formato se llama "DateAndTime". ¿Cómo puedo traducir el resultado de OctetString a una fecha/hora "legible para humanos"?

Respuesta

15

El formato es here.

A date-time specification. 
      field octets contents     range 
      ----- ------ --------     ----- 
       1  1-2 year*      0..65536 
       2  3 month      1..12 
       3  4 day      1..31 
       4  5 hour      0..23 
       5  6 minutes     0..59 
       6  7 seconds     0..60 
          (use 60 for leap-second) 
       7  8 deci-seconds    0..9 
       8  9 direction from UTC  '+'/'-' 
       9  10 hours from UTC*   0..13 
      10  11 minutes from UTC   0..59 
* Notes: 
      - the value of year is in network-byte order 
      - daylight saving time in New Zealand is +13 For example, 
       Tuesday May 26, 1992 at 1:30:15 PM EDT would be displayed as: 
       1992-5-26,13:30:15.0,-4:0 
       Note that if only local time is known, then timezone 
       information (fields 8-10) is not present. 

Puede utilizar struct.unpack:

>>> import struct, datetime 
>>> s = '\x07\xd8\t\x17\x03\x184\x00' 
>>> datetime.datetime(*struct.unpack('>HBBBBBB', s)) 
datetime.datetime(2008, 9, 23, 3, 24, 52) 
+0

Tenga en cuenta que este objeto tiene una longitud variable, por lo que este código puede fallar en algunos objetos y omite la información de la zona horaria. – Keith

+0

También tenga en cuenta que el campo 7 es deci-segundos (0..9) mientras que el cuadro de tiempos [6] es microsegundos (0 <= x <1000000); las implementaciones correctas se dejan como un ejercicio para el lector. –

2

Enchufe desvergonzado aquí: Los módulos SNMP y SMI Pycopia manejan correctamente este objeto, y otros también. Pycopia se instala desde la fuente, y no se olvide de mibs file si lo intenta.

3

@Paulo Scardine: Esta fue la mejor respuesta que encontré en línea cuando trabajaba para resolver un problema muy similar. Todavía me tomó un poco de tiempo resolver mi problema incluso con esta respuesta, por lo que quería publicar una respuesta de seguimiento que pueda agregar más claridad. (específicamente el problema con la fecha con diferentes opciones de longitud).

La siguiente pieza de código se conecta a un servidor y toma la hora del sistema y luego la muestra como una cadena para ilustrar el método.

import netsnmp 
import struct 
oid = netsnmp.Varbind('hrSystemDate.0') 
resp = netsnmp.snmpget(oid, Version=1, DestHost='<ip>', Community='public') 
oct = str(resp[0]) 
# hrSystemDate can be either 8 or 11 units in length. 
oct_len = len(oct) 
fmt_mapping = dict({8:'>HBBBBBB', 11:'>HBBBBBBcBB'}) 
if oct_len == 8 or oct_len == 11: 
    t = struct.unpack(fmt_mapping[oct_len], oct) 
    print 'date tuple: %s' % (repr(t)) 
else: 
    print 'invalid date format' 

Espero que esto ayude a otras personas que están teniendo problemas similares tratando de trabajar con este tipo de datos.

Cuestiones relacionadas