"Después del juego es antes del juego"
Sepp Herberger

viernes, 11 de julio de 2014

Monitorizar una impresora de red con snmpwalk

En todos los sitios donde he trabajado había una o varias "impresoras críticas", esto es, una impresora comunitaria usada por todo tipo de usuarios y que era sistemáticamente maltratada, sobreexplotada y humillada. Muchas veces esa impresora presenta un problema y nadie se ocupa de resolverlo o avisar de él, con lo cual la cosa suele pasar a mayores y el culpable es el informático, claro está.
 
Si es una impresora de red y tiene opción para activar el SNMP (esto se hace entrando en la página web de configuración de la impresora  o bien con el menú del panel de estado) , podremos acceder a su árbol MIB y obtener información sobre su estado desde un programa externo. Es el método usado por suites como Nagios, que es demasiado compleja para lo que queremos hacer nosotros.
 
 
El árbol MIB es una estructura jerárquica formada por objetos, identificados cada uno de ellos por su OID (identificador de objeto), que describe (y en ocasiones permite cambiar) un elemento de la configuración o el estado del dispositivo. Un OID es por ejemplo:
 iso.3.6.1.2.1.43.10.2.1.4.1.1
que permite acceder al contador de páginas impresas de una impresora Samsung ML-2250 (y de varias marcas de impresoras más). En algunos dispositivos en lugar de una ristra de números se puede usar un alias mas comprensible, del tipo:
 Iso(1).org(3).dod(6).internet(1).private(4).transition(868).products(2).chassis(4).card(1).slotCps(2)­.-cpsSlotSummary(1).cpsModuleTable(1). cpsModuleEntry(1).cpsModuleModel(3).3562.3.
la verdad sea dicha, tampoco es mucho mas clara.
 
Mediante OIDs podemos acceder a todo tipo de parámetros de la impresora: estado, contadores, configuración, nivel de tóner, etc; pero, para nuestra desgracia, la organización interna del MIB de cada dispositivo no es estándar y muchas veces es "secreta" y no se revela por los fabricantes. La única manera de conocerlo es escanear todo el árbol MIB del aparato e interpretar la salida buscando lo que queramos saber, o bien buscar en Internet si alguien lo ha hecho por nosotros y ha documentado en alguna medida el MIB. Con el paquete snmp-mibs-downloader  podemos bajar una lista de MIBs, muy poco extensa para ser sinceros, de distintos aparatos. Otra fuente de MIBs es la página de Oidview.
 
Independientemente de que conozcamos o no la estructura y los alias del MIB, siempre podemos acceder a ellos con los comandos snmp y husmear dentro para sacar información útil.

Nosotros vamos a usar el comando snmpwalk. Con:

 IP=XX.XX.XX.XX
 snmpwalk -v 2c -c public $IP iso
sacamos toda la estructura del MIB de nuestra impresora con la IP indicada. En mi caso es una Samsung ML-2250.
 
Luego nos la empollamos con calma y, por ejemplo, nos daremos cuenta de que en el OID iso.3.6.1.2.1.43.16.5.1.2.1.1 se guarda el "status" de la impresora. Es decir, el estado de la impresora que aparece en el panel frontal. Podemos extraer dicho estado con:
 IP=XX.XX.XX.XX
 AGENT_STATUS=iso.3.6.1.2.1.43.16.5.1.2.1.1
 snmpwalk -v 2c -c public $IP $AGENT_STATUS | cut -d":" -f2
Pues una vez obtenido esto es fácil hacer un script que monitorice el estado de la impresora cada minuto y si ve que está en algún estado preocupante nos avise, por ejemplo con un correo electrónico usando la sencilla utilidad mailsend.

En /etc/crontab

 */1 * * * * root /root/scripts/watch-printer

En /root/scripts/watch-printer

 #!/bin/bash
 function mailSend() {
     mailsend -smtp smtp.gmail.com \
          -port 587 \
          -starttls -auth \
          -user miusuario@gmail.com \
          -pass mipassword \
          -f miusuario@gmail.com \
          -t miusuario@gmail.com \
          -sub "$1" -M "$2"
 }
 FECHA=$(date +%F-%H:%M)
 IP=172.22.44.12
 AGENT_DATA=iso.3.6.1.4.1.11.2.3.9.1.1.7.0
 AGENT_STATUS=iso.3.6.1.2.1.43.16.5.1.2.1.1
 AGENT_PAGES=iso.3.6.1.2.1.43.10.2.1.4.1.1
 AGENT_ST_VALUE=iso.3.6.1.2.1.25.3.5.1.1.1
 FILE=/var/log/printer-status.log
 #Verificamos que la impresora responde a los ping.
 ping -c 1 $IP > /dev/null 2>&1
 if [ "$?" == "0" ]
 then
   touch $FILE
   #Leemos del fichero de log el último estado de la impresora.
   LAST_STATUS=$(tail -1 $FILE | cut -d"," -f3 | cut -d'"' -f2)

   #sacar todas las rutas: snmpwalk -v 2c -c public $IP iso

   #String con estado de la impresora
   STATUS=$(snmpwalk -v 2c -c public $IP $AGENT_STATUS | cut -d":" -f2)

   #Le quitamos las comillas al principio y al final.
   #Los posibles estados catalogados son: Printing, Ready, Sleeping, Paper jam, Cover Open, Paper empty, ...
   NOW_STATUS=$(echo $STATUS | cut -d'"' -f2)

   #Contador de paginas
   PAGES=$(snmpwalk -v 2c -c public $IP $AGENT_PAGES | cut -d":" -f2)

   #Este valor parecia almacenar el estado con un codigo numérico, pero al final se quedo en agua de borrajas.
   ST_VALUE=$(snmpwalk -v 2c -c public $IP $AGENT_ST_VALUE | cut -d":" -f2)

   #Si ha cambiado el estado actual respeto al último estado
   if [ "$LAST_STATUS" != "$NOW_STATUS" ]
   then
    case $NOW_STATUS in
      Printing|Ready|Sleeping)
       #Estados OK, no hay que avisar de ellos.
       ;;
      *)
       #Si pasa de Sleeping a estado de error (Paper jam, Cover Open, Paper empty... no se avisa
       #ya que muchas veces de estado de error pasa a Sleeping
       if [ "$LAST_STATUS" != "Sleeping" ]
       then
          mailSend "Aviso impresora ML-2250" "Estado: $NOW_STATUS"
       fi
       ;;
    esac
   fi
   #Guardamos la información en el fichero de log, para tener un histórico del estado de la impresora.
   echo "$FECHA,$ST_VALUE,$STATUS,$PAGES" >> $FILE
 fi
Y con esto ya tenemos nuestro vigilante. Para adaptarlo a tu impresora te va a tocar pelearte con el árbol MIB y averiguar los OID de los atributos que quieras vigilar. ¡Ánimo, que luego merece la pena presentarte en la sala donde está la impresora y vociferar desde la puerta "ponedle papel a esa impresora, venga ya", ante la mirada estupefacta de los usuarios que se están preguntado por qué diablos no imprime!.
Addendum: además de impresoras, con snmpwalk se pueden monitorizar switchs de comunicaciones y acceder, por ejemplo, al tráfico y estado de sus puertos. Lástima que esté todo tan mal documentado, ya que podríamos monitorizar, entre otras cosas, desde dónde se está consumiendo el ancho de banda de nuestra red.
 

4 comentarios:

  1. Respuestas
    1. Como ya comento está todo sin documentar por lo general y depende de la impresora que tengo. Por eso aconsejo hacer

      IP=XX.XX.XX.XX
      snmpwalk -v 2c -c public $IP iso

      Y mirar la larga salida buscando el MIB para tu caso concreto.

      Eliminar
    2. Ok, gracias, creo que ya lo he encontrado, estaba buscando para printers Ricoh

      Eliminar
  2. Una vez más me has dado la vida, voy a empezar a gestionar el nivel de tóner de unas brother, el tema del repo con la ingenieria inversa me ha resuelto el problema de conseguir el porcentaje concreto.

    Thanks for share, ya tengo medio montado el script de monitorización gracias a ti

    ResponderEliminar