Sondando dispositivos de impressão usando SNMP enquanto a impressora está imprimindo



Vou contar minha experiência na criação de um aplicativo que coleta estatísticas sobre dispositivos de impressão usando o protocolo SNMP. No total, mais de 1000 dispositivos e a pesquisa são realizados em tempo real enquanto a impressora está imprimindo. Como tudo isso é implementado, você aprenderá com o artigo.



Introdução


O SNMP é um protocolo de Internet padrão para gerenciar dispositivos em redes IP com base nas arquiteturas TCP / UDP.

O uso do SNMP não coleta informações sobre o usuário que enviou o arquivo para impressão. Além disso, o SNMP não pode ser usado para impressoras locais conectadas via USB.
Para resolver esses problemas, você precisa criar um cliente que deve coletar informações e enviar todas as estatísticas para o servidor. A organização foi tão estabelecida que o mesmo sistema operacional Linux foi instalado em todas as máquinas clientes. Consequentemente, o cliente para coletar estatísticas de impressão é gravado no sistema Linux como um daemon (um análogo do serviço no Windows).

Cliente de coleta de informações de impressão


O cliente de coleção de impressão (escrito em Python) executa as seguintes tarefas:

  1. intercepta mensagens do serviço de impressão CUPS
  2. salva informações de impressão em um arquivo CSV
  3. envia arquivos CSV para uma pasta no servidor via FTP

O arquivo CSV contém os seguintes campos:

  1. Data e hora do trabalho de impressão
  2. Endereço IP ou nome de domínio do computador a partir do qual o documento foi enviado para impressão
  3. Endereço IP ou host do dispositivo de impressão
  4. Cups Job ID - ID do trabalho do Serviço de impressão do CUPS
  5. Nome do trabalho - esse geralmente é o nome do arquivo
  6. Nome do usuário que enviou para imprimir
  7. Número de páginas
  8. Tamanho do trabalho de impressão (tamanho do trabalho em KB)
  9. Status de impressão (status do trabalho)
  10. Número de cópias (Número de cópias)
  11. O número de cópias no arquivo do trabalho - é usado para determinar com mais precisão o número de cópias;
  12. Número de páginas pelo protocolo SNMP - usado para determinar com mais precisão o número de páginas
  13. SNMP está disponível - isso é um sinal de que o dispositivo deve ser pesquisado continuamente usando o protocolo SNMP enquanto o documento está sendo impresso
  14. O contador do dispositivo de impressão no momento do início da impressão (valor variável SNMP) é o contador de verificação que determina o início da pesquisa SNMP pelo servidor

O cliente não possui uma interface GUI, todas as configurações são registradas no arquivo de configuração

Exemplo de arquivo de configuração
[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


Assim, o cliente está gravado, agora precisamos de um servidor que não apenas colete informações de todos os clientes, mas também o servidor deve monitorar situações anormais - pausa na impressão, falta de papel ou atolamento, etc.

Arquitetura do servidor de coleta de informações de impressão


O servidor está escrito em C #, o DBMS é MSSQL.

  1. O Database Configurator é um aplicativo GUI que permite criar e excluir um banco de dados.
    O banco de dados é normalizado no máximo, para que não haja campos de texto na tabela principal de estatísticas para economizar espaço em disco.
  2. , GUI SNMP-, OID, .



  3. ( Windows)



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


Antes que o serviço monitore a impressão em tempo real, é necessário analisar os arquivos CSV antigos (acumulados até o servidor estar funcionando) e salvar as informações no banco de dados. Vamos chamar esse ponto de “a primeira leitura do diretório de arquivos CSV”, que pode ajudar a coletar rapidamente as estatísticas da impressão antiga e salvá-la no banco de dados.

Em seguida, o serviço alterna para o monitoramento constante da aparência dos arquivos CSV em uma pasta em um fluxo separado com um intervalo de 1 segundo. Cada arquivo CSV é processado em um fluxo separado.

Se houver muitos arquivos CSV na pasta, nesse caso, haverá um limite no número de fluxos de leitura simultâneos de arquivos, para que o aplicativo funcione de maneira estável. Quando o serviço é iniciado, pode haver muitos arquivos CSV na pasta e esses arquivos são processados ​​sem a pesquisa SNMP; portanto, a primeira leitura do diretório tem um limite separado para o número de threads de processamento de arquivos CSV (foi experimentalmente estabelecido que o número de threads na primeira leitura de CSV os arquivos devem ser muito menores que o número de threads depois de processar um grande número de arquivos).

O algoritmo fornece a determinação do endereço IP pelo nome do dispositivo e vice-versa (determinação do nome do dispositivo pelo endereço IP) usando o método System.Net.Dns.GetHostEntry (). Se não houver conexão com o dispositivo, o método System.Net.Dns.GetHostEntry () leva muito tempo, em conexão com isso, o cliente que fornece essas informações em CSV foi finalizado. Mas essa verificação permaneceu no servidor e o método System.Net.Dns.GetHostEntry () ainda é um gargalo.

Salvando informações no banco de dados


Além de informações sobre impressão, o banco de dados armazena informações para estatísticas:

  1. Horário de início e término da pesquisa SNMP
  2. número total de linhas no arquivo CSV
  3. O número de linhas com a pesquisa SNMP ativada.

É fornecida uma lista de dispositivos que não devem ser pesquisados, as chamadas exceções para as quais nada é armazenado no banco de dados.

Depois de ler o arquivo CSV inteiro, as informações sobre todos os trabalhos de impressão são coletadas no objeto Lista, que deve ser monitorado pela pesquisa SNMP. Depois de ler o arquivo CSV, ele é transferido para o arquivo morto, se especificado pelas configurações, e o arquivo CSV é excluído.

Depois que o arquivo CSV é totalmente lido, é verificado se as configurações de pesquisa são definidas usando o protocolo SNMP e os dispositivos são classificados por prioridade:

  1. O grupo padrão, no qual existem todos os dispositivos da base ricoh_dmnx, é o nome do banco de dados do sistema de monitoramento do fabricante Ricoh, no qual tiramos a lista de dispositivos a serem pesquisados.
  2. Dispositivos que estão no banco de dados ricoh_dmnx, mas não em grupos
  3. Dispositivos que estão no banco de dados ricoh_dmnx e estão em grupos
  4. Dispositivos que não estão no banco de dados ricoh_dmnx, mas estão no nosso banco de dados de serviço

Cada dispositivo possui uma fila de impressão para que, em um determinado momento, uma pesquisa SNMP funcione com apenas um trabalho de impressão. Assim, enquanto o dispositivo está sendo interrogado usando o protocolo SNMP, o usuário pode enviar outro arquivo para impressão e um novo arquivo CSV pode ser recebido no servidor, que é salvo imediatamente no banco de dados, mas a pesquisa será realizada após a atualização atual. documento.

A pesquisa SNMP rastreia alterações no contador de impressão, status do dispositivo e um sinal de erro no dispositivo durante a impressão. A latência entre as pesquisas SNMP é de 300 ms.

Rochas subaquáticas


O algoritmo do servidor foi aprimorado constantemente, pois havia muitas situações diferentes nas quais o contador era considerado incorretamente. Aqui estão algumas dicas da experiência pessoal:

1) Não continue pesquisando enquanto o dispositivo estiver em um estado de erro (por exemplo: o papel está preso)

2) Um erro de impressora pode mudar com o tempo, portanto, o tempo limite da pesquisa SNMP não funcionará se o erro mudar (por exemplo, a impressora ficou sem papel, mas depois de adicionar papel à bandeja, o status da impressora mudou)

3) Se vários trabalhos forem enviados para o dispositivo de impressão ao mesmo tempo, o contador depois de imprimir o primeiro trabalho:
- não altera o status
- altera o contador

OIDs do sistema de dispositivos de impressão


Com base na análise desses três OIDs, meu pedido para pesquisar dispositivos SNMP foi escrito:

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] - Status do dispositivo



3) [1.3.6.1.2.1.25.3.2.1.5.1] - Erro no dispositivo durante a impressão

Relatórios


Os relatórios são implementados usando o SQL Server Reporting Services.

Relatório mensal de comparação de impressão




Trabalhos Impressos por Usuário




Relatório Resumo de Solicitações SNMP




Estatísticas de solicitação SNMP




Conclusão


Fiquei feliz em compartilhar minha experiência na implementação de um dos meus aplicativos mais complexos, que opera com sucesso desde 2018.

Uma peculiaridade na implementação do projeto de coleta de impressão foi que eu não tinha uma única impressora comigo. Trabalhou através de um emulador que pode ser instalado e configurado rapidamente (basta ter um arquivo MIB para as configurações do dispositivo de impressão).

No futuro, escreverei sobre como foi feito o gerenciamento dos agentes de impressão.

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


All Articles