Sondeo de dispositivos de impresión utilizando SNMP mientras la impresora está imprimiendo



Le contaré mi experiencia en la creación de una aplicación que recopila estadísticas sobre dispositivos de impresión utilizando el protocolo SNMP. En total, más de 1000 dispositivos y la encuesta se realiza en tiempo real mientras la impresora está imprimiendo. Cómo se implementa todo esto, aprenderá del artículo.



Introducción


SNMP es un protocolo estándar de Internet para administrar dispositivos en redes IP basadas en arquitecturas TCP / UDP.

El uso de SNMP no recopila información sobre el usuario que envió el archivo a imprimir. Además, SNMP no se puede utilizar para impresoras locales conectadas a través de USB.
Para resolver estos problemas, debe crear un cliente que debe recopilar información y enviar todas las estadísticas al servidor. La organización estaba tan establecida que se instaló el mismo sistema operativo Linux en todas las máquinas cliente. En consecuencia, el cliente para recopilar estadísticas de impresión está escrito en el sistema Linux como un demonio (un análogo del servicio en Windows).

Cliente de recopilación de información impresa


El cliente de la colección de impresión (escrito en Python) realiza las siguientes tareas:

  1. intercepta mensajes del servicio de impresión CUPS
  2. guarda la información de impresión en un archivo CSV
  3. envía archivos CSV a una carpeta en el servidor a través de FTP

El archivo CSV contiene los siguientes campos:

  1. Fecha y hora del trabajo de impresión.
  2. Dirección IP o nombre de dominio de la computadora desde la cual se envió el documento para imprimir
  3. Dirección IP o host del dispositivo de impresión
  4. ID de trabajo de Cups: ID de trabajo del servicio de impresión CUPS
  5. Nombre del trabajo: este suele ser el nombre del archivo
  6. Nombre del usuario que envió a imprimir
  7. Número de páginas
  8. Tamaño del trabajo de impresión (tamaño del trabajo en KB)
  9. Estado de impresión (estado del trabajo)
  10. Número de copias (Número de copias)
  11. El número de copias en el archivo de trabajo: se utiliza para determinar con mayor precisión el número de copias;
  12. Número de páginas por protocolo SNMP: se utiliza para determinar con mayor precisión el número de páginas
  13. SNMP está disponible: esta es una señal de que el dispositivo debe sondearse continuamente utilizando el protocolo SNMP mientras se imprime el documento
  14. El contador del dispositivo de impresión en el momento del inicio de la impresión (valor variable SNMP) es el contador de verificación que determina el inicio del sondeo SNMP por parte del servidor

El cliente no tiene una interfaz GUI, todas las configuraciones están registradas en el archivo de configuración

Ejemplo de archivo de configuración
[main]
#    
app_directory = /opt/printwatcher

#  .    
#        )
stat_file_directory = /opt/printwatcher/data

# ,      
state_file = /opt/printwatcher/data/state.pickle

# ,       
command_state_file = /opt/printwatcher/data/command.state

#    
#   :
#  datetime -     ISO 8601
#  random -    8 
stat_filename_template = {random}_print_jobs.csv

#      
# (    )
max_stat_file_size_mb = 10

#  CSV.  : TAB, SPACE, SEMICOLON, COMMA
csv_delimiter = SEMICOLON

#      
start_service = start


[logging]

#   (DEBUG, INFO, TRACE)
level = DEBUG

#  
log_file = /var/log/printwatcher.log

#      
restart_log_file = /var/log/printwatcher-restart.log

#   
# (  /   logrotate)
max_log_file_size_mb = 10


[cups]

# ,      CUPS
spool_directory = /var/spool/cups/

#    CUPS    
# ( )
job_file_lifetime_hours = 48

#           
# ( )
job_info_lifetime_hours = 48


#  FTP
[ftp]

host = 192.168.1.39
user = ftpuser
password = P@ssw0rd
port = 21

#         FTP
# ( )
connection_retry_seconds = 10

#  ,       FTP
# ( )
connection_timeout_seconds = 3600

#        FTP 
# ( )
polling_interval = 30

#     ftp-
management_directory = /management

#       ftp-
response_directory = /management

#   
update_directory = /update

#      
data_directory = /data

#  SNMP
[snmp]
#      SNMP
retrieve_snmp_info = false
community = public
oid = 1.3.6.1.2.1.43.10.2.1.4.1.1
port = 161


Entonces, el cliente está escrito, ahora necesitamos un servidor que no solo recopile información de todos los clientes, sino que también el servidor debe monitorear situaciones anormales: pausar la impresión, el papel ausente o atascado, etc.

Arquitectura del servidor de recopilación de información impresa


El servidor está escrito en C #, el DBMS es MSSQL.

  1. Database Configurator es una aplicación GUI que le permite crear y eliminar una base de datos.
    La base de datos se normaliza al máximo para que no haya campos de texto en la tabla de estadísticas principal para ahorrar espacio en disco.
  2. , GUI SNMP-, OID, .



  3. ( Windows)



  1. CSV-
  2. CSV
  3. CSV-
  4. CSV- ( ) [ ]
  5. CSV-
  6. OID'
  7. ,


Antes de que el servicio supervise la impresión en tiempo real, es necesario analizar los archivos CSV antiguos (que se acumularon hasta que el servidor estaba funcionando) y guardar la información en la base de datos. Llamaremos a este punto "la primera lectura del directorio de archivos CSV", que puede ayudar a recopilar rápidamente estadísticas de la impresión anterior y guardarlas en la base de datos.

Luego, el servicio cambia a un monitoreo constante de la apariencia de los archivos CSV en una carpeta en una secuencia separada con un intervalo de 1 segundo. Cada archivo CSV se procesa en una secuencia separada.

Si hay muchos archivos CSV en la carpeta, entonces en este caso hay un límite en la cantidad de secuencias de lectura simultánea de archivos para que la aplicación funcione de manera estable. Cuando se inicia el servicio, puede haber muchos archivos CSV en la carpeta y estos archivos se procesan sin sondeo SNMP; en consecuencia, la primera lectura del directorio tiene un límite separado en el número de subprocesos de procesamiento de archivos CSV (se estableció experimentalmente que el número de subprocesos en la primera lectura de CSV los archivos deben ser mucho más pequeños que la cantidad de subprocesos después de procesar una gran cantidad de archivos).

El algoritmo permite determinar la dirección IP por el nombre del dispositivo y viceversa (determinar el nombre del dispositivo por la dirección IP) utilizando el método System.Net.Dns.GetHostEntry (). Si no hay conexión con el dispositivo, el método System.Net.Dns.GetHostEntry () tarda mucho tiempo, en relación con esto, el cliente que proporciona esta información en CSV se ha finalizado. Pero esta comprobación se mantuvo en el servidor y el método System.Net.Dns.GetHostEntry () sigue siendo un cuello de botella.

Guardar información en la base de datos


Además de la información sobre la impresión, la base de datos almacena información para estadísticas:

  1. Hora de inicio y finalización de sondeo SNMP
  2. número total de líneas en el archivo CSV
  3. El número de líneas con sondeo SNMP habilitado.

Se proporciona una lista de dispositivos que no deben sondearse, las llamadas excepciones para las que no se almacena nada en la base de datos.

Después de leer todo el archivo CSV, la información sobre todos los trabajos de impresión se recopila en el objeto Lista, que debe supervisarse mediante sondeo SNMP. Después de leer el archivo CSV, se transfiere al archivo, si así lo especifica la configuración, y luego se elimina el archivo CSV.

Después de que el archivo CSV se haya leído completamente, se verifica que las configuraciones de sondeo se configuran utilizando el protocolo SNMP, luego los dispositivos se ordenan por prioridad:

  1. El grupo predeterminado, en el que hay todos los dispositivos de la base ricoh_dmnx, es el nombre de la base de datos del sistema de monitoreo del fabricante Ricoh, de la cual tomamos la lista de dispositivos a sondear.
  2. Dispositivos que están en la base de datos ricoh_dmnx, pero no en grupos
  3. Dispositivos que están en la base de datos ricoh_dmnx y están en grupos
  4. Dispositivos que no están en la base de datos ricoh_dmnx, pero están en nuestra base de datos de servicio

Cada dispositivo tiene una cola de impresión para que, en un momento dado, una encuesta SNMP funcione con un solo trabajo de impresión. Por lo tanto, mientras se interroga al dispositivo utilizando el protocolo SNMP, el usuario puede enviar otro archivo para imprimir y se puede recibir un nuevo archivo CSV en el servidor, que se guarda inmediatamente en la base de datos, pero la encuesta se realizará después de la actual documento.

El sondeo SNMP rastrea los cambios en el contador de impresión, el estado del dispositivo y una señal de un error del dispositivo durante la impresión. La latencia entre las encuestas SNMP es de 300 ms.

Rocas bajo el agua


El algoritmo del servidor se ha mejorado constantemente, ya que hubo muchas situaciones diferentes en las que el contador se consideró incorrectamente. Aquí hay algunos consejos de la experiencia personal:

1) No continúe sondeando mientras el dispositivo está en un estado de error (por ejemplo: papel atascado)

2) Un error de la impresora puede cambiar con el tiempo, por lo que el tiempo de espera de sondeo SNMP no debería funcionar si el error cambia (por ejemplo, la impresora se quedó sin papel, pero después de agregar papel a la bandeja, el estado de la impresora cambió)

3) Si se envían varios trabajos al dispositivo de impresión al mismo tiempo, el contador después de imprimir el primer trabajo:
- no cambia el estado
- cambia el contador

OID del sistema de dispositivos de impresión


Basado en el análisis de estos tres OID, mi solicitud para sondear dispositivos SNMP fue escrita:

1) [1.3.6.1.2.1.43.10.2.1.4.1.1] - Contador total de dispositivos

2) [1.3.6.1.2.1.25.3.5.1 .1.1] - Estado del dispositivo



3) [1.3.6.1.2.1.25.3.2.1.5.1] - Error del dispositivo durante la impresión

Informes


Los informes se implementan utilizando SQL Server Reporting Services.

Informe mensual de comparación de impresiones




Trabajos impresos por usuario




Informe resumido de solicitud SNMP




SNMP Request Statistics




Conclusión


Me alegró compartir mi experiencia en la implementación de una de mis aplicaciones más complejas, que funciona con éxito desde 2018.

Una peculiaridad en la implementación del proyecto de colección de impresión fue que no tenía una sola impresora conmigo. Funcionó a través de un emulador que se puede instalar y configurar rápidamente (es suficiente tener un archivo MIB para la configuración del dispositivo de impresión).

En el futuro, escribiré sobre cómo se realizó la gestión de los agentes de impresión.

Source: https://habr.com/ru/post/undefined/


All Articles