Plugin NFe 2.00 Nagios
Dica publicada em Linux / Internet
Plugin NFe 2.00 Nagios
Plugin que faz verificação do status do serviço da Nota Fiscal eletrônica 2.00.
O plugin foi escrito em Java e Shell Script, os méritos das classes principais são de www.javac.com.br, apenas fiz pequenas modificações para adaptá-lo ao ambiente.
Irei disponibilizar tanto o código fonte, quanto ele já construído. Devido ao fato de eu ter suprimido algumas mensagens de erro do try do Java, o código fonte é necessário, para que as mensagens sejam exibidas.
O projeto foi construído e escrito no Netbeans. Vale lembrar que para o plugin funcionar, claro, é preciso ter o JRE na máquina.
Também irei anexar o projeto já construído chamado NFeBuildCacerts, que gera os certificados CA para cada link.
Os projetos já construídos e prontos para uso encontram-se no diretório "dist".
Usei o banco de dados HSQLDB. Para manter as configurações básicas do aplicativo, existe o HSQL Database Manager que é um front-end para manipular a base, porém não entraremos em detalhes, modificaremos a base com editor de texto de sua preferência.
A base encontra-se no diretório "bd", e o arquivo a ser modificado é o "nfeStatus.script", nele haverá o cadastro dos links da Sefaz a ser verificado. O caminho completo para os certificados (cacert, e pfx), senhas dos certificados. (No projeto em anexo, existe a base já populada para alguns links).
Vamos iniciar à configuração do plugin.
Primeiro, gere os certificados CA para cada link com o projeto NFeBuildCacerts:
# java -jar NFeBuildCacerts.jar nfe-cacerts-sp nfe.fazenda.sp.gov.br
Onde:
Ao executar o aplicativo e tudo ocorrer de acordo, será exibido algo parecido com o que segue abaixo:
Após gerado o certificado para cada link, atualize o BD. Exemplo:
INSERT INTO WEBSERVICE VALUES(35,'https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx','/usr/local/nagios/li bexec/nfeStatus/certsPFX/meu.pfx','senha_pfx','/usr/local/nagios/libexec/nfeStatus/cacerts/nfe- cacerts-sp')
Agora criaremos a estrutura de diretórios no Nagios, ficando assim: "/usr/local/nagios/libexec/nfeStatus".
Após os certificados gerados, o Java instalado na máquina, vamos testar o aplicativo. Dentro do shell script "check_status_nfe" há uma linha que chama o java para executar o aplicativo, assim:
Troque o "$CODIGO_ESTADO" pelo código cadastrado no BD, lembrando que utilizei os códigos oficiais do IBGE (pode ser encontradas na net com facilidade).
Logo, execute no shell informando um dos códigos que tenha no BD, com o certificados. Exemplo para São Paulo seria:
# /usr/java/jre1.6.0_24/bin/java -jar /usr/local/nagios/libexec/nfeStatus/NFeConsultaStatus.jar 35
Serviço em Operação - Tempo medio: 1
Note a resposta: "Serviço em Operação - Tempo medio: 1", isso nos diz que esta tudo OK com os certificados, links e, por consequência, o BD está OK também. (confronte o resultado com os semáforos do site da Sefaz versão 2.00).
Detalhe: Devido a falta de padrão na resposta (Operação, operacao), o shell script tem a linhas que tratam a resposta, são as condições if.
O script trata a resposta do aplicativo que criamos e retorna os estados para o Nagios, logo, não esqueça de alterar o script caso mude os retornos do aplicativo no Java.
Se for utilizar os links de homologação é preciso alterar o tipo de ambiente no código Java na linha 67 aproximadamente (<tpAmb>1</tpAmb>), reconstrua o aplicativo.
Altere de:
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append(" <consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">").append(" <tpAmb>1</tpAmb>").append("<cUF>").append(codigoDoEstado).append("</cUF>") .append(" <xServ>STATUS</xServ>").append("</consStatServ>");
Para:
Agora vamos configurar o Nagios. Adicione no nagios.cfg:
Crie linksSefaz.cfg.
Crie sefazgroups.cfg:
No commands.cfg:
No templates.cfg:
Neste ponto devemos estar com tudo funcionando. Reinicie o Nagios e aguarde a tarefa de checagem ser executada. Lembre-se: sempre verifique as permissões dos arquivos. Caso queira ver as mensagens que suprimi (Exceções), altere as linhas 104 e 105:
( System.out.println("Time out");
para:
Assumi que qualquer coisa diferente de OK, é problema para nós, então suprimi as mensagens de erro.
Os arquivos:
Não retiro o mérito dos autores, que toda base para projeto foi conseguida através da comunidade:
Apenas ajustei e adicionei algumas funções.
Sintam-se a vontade para opinar, alterar, sugerir e distribuir o conteúdo desta dica.
Espero que seja útil. Qualquer dúvida, sugestão... Só comentar, que na medida do tempo disponível vou respondendo.
O plugin foi escrito em Java e Shell Script, os méritos das classes principais são de www.javac.com.br, apenas fiz pequenas modificações para adaptá-lo ao ambiente.
Irei disponibilizar tanto o código fonte, quanto ele já construído. Devido ao fato de eu ter suprimido algumas mensagens de erro do try do Java, o código fonte é necessário, para que as mensagens sejam exibidas.
O projeto foi construído e escrito no Netbeans. Vale lembrar que para o plugin funcionar, claro, é preciso ter o JRE na máquina.
Também irei anexar o projeto já construído chamado NFeBuildCacerts, que gera os certificados CA para cada link.
Os projetos já construídos e prontos para uso encontram-se no diretório "dist".
Usei o banco de dados HSQLDB. Para manter as configurações básicas do aplicativo, existe o HSQL Database Manager que é um front-end para manipular a base, porém não entraremos em detalhes, modificaremos a base com editor de texto de sua preferência.
A base encontra-se no diretório "bd", e o arquivo a ser modificado é o "nfeStatus.script", nele haverá o cadastro dos links da Sefaz a ser verificado. O caminho completo para os certificados (cacert, e pfx), senhas dos certificados. (No projeto em anexo, existe a base já populada para alguns links).
Vamos iniciar à configuração do plugin.
Primeiro, gere os certificados CA para cada link com o projeto NFeBuildCacerts:
# java -jar NFeBuildCacerts.jar nfe-cacerts-sp nfe.fazenda.sp.gov.br
Onde:
- NFeBuildCacerts.jar é o projeto construído.
- NnfeCacerts-sp é o certificado a ser gerado (pode ter qualquer nome, lembre-se que ele deve ser configurado no BD depois).
- nfe.fazenda.sp.gov.br é o link ao qual deverá ser gerado o certificado.
Ao executar o aplicativo e tudo ocorrer de acordo, será exibido algo parecido com o que segue abaixo:
INFO: | Loading KeyStore nfe-cacerts-sp...
INFO: | Opening connection to nfe.fazenda.sp.gov.br:443...
INFO: | Starting SSL handshake...
INFO: | No errors, certificate is already trusted
INFO: | Server sent 3 certificate(s):
INFO: | Added certificate to keystore 'nfe-cacerts-sp' using alias 'nfe.fazenda.sp.gov.br-0'
INFO: | Added certificate to keystore 'nfe-cacerts-sp' using alias 'nfe.fazenda.sp.gov.br-1'
INFO: | Added certificate to keystore 'nfe-cacerts-sp' using alias 'nfe.fazenda.sp.gov.br-2'
INFO: | Cacerts gerado em: D:\Projetos\Projeto NFE\NFeBuildCacerts\nfe-cacerts- sp
Após gerado o certificado para cada link, atualize o BD. Exemplo:
INSERT INTO WEBSERVICE VALUES(35,'https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx','/usr/local/nagios/li bexec/nfeStatus/certsPFX/meu.pfx','senha_pfx','/usr/local/nagios/libexec/nfeStatus/cacerts/nfe- cacerts-sp')
Agora criaremos a estrutura de diretórios no Nagios, ficando assim: "/usr/local/nagios/libexec/nfeStatus".
- bd -> Onde encontra-se o Banco de Dados
- cacerts -> Colocar os certificados gerados com NFeBuildCacerts
- certsPFX -> Certificados propriamente dito. (.pfx)
- lib -> Bibliotecas de dependências do aplicativo Java (NFeConsultaStatus.jar).
- check_status_nfe -> Shell Script que retorna os estados do link para o Nagios, baseado no retorno do NFeConsultaStatus.jar.
- log4j.properties -> Arquivo de propriedades do log4j (Caso queira ver os logs no shell altere a linha log4j.rootCategory=OFF, S , para, log4j.rootCategory=INFO, S)
- NFeConsultaStatus.jar -> O aplicativo que construímos.
Após os certificados gerados, o Java instalado na máquina, vamos testar o aplicativo. Dentro do shell script "check_status_nfe" há uma linha que chama o java para executar o aplicativo, assim:
/usr/java/jre1.6.0_24/bin/java -jar /usr/local/nagios/libexec/nfeStatus/NFeConsultaStatus.jar
$CODIGO_ESTADO
Troque o "$CODIGO_ESTADO" pelo código cadastrado no BD, lembrando que utilizei os códigos oficiais do IBGE (pode ser encontradas na net com facilidade).
Logo, execute no shell informando um dos códigos que tenha no BD, com o certificados. Exemplo para São Paulo seria:
# /usr/java/jre1.6.0_24/bin/java -jar /usr/local/nagios/libexec/nfeStatus/NFeConsultaStatus.jar 35
Serviço em Operação - Tempo medio: 1
Note a resposta: "Serviço em Operação - Tempo medio: 1", isso nos diz que esta tudo OK com os certificados, links e, por consequência, o BD está OK também. (confronte o resultado com os semáforos do site da Sefaz versão 2.00).
Detalhe: Devido a falta de padrão na resposta (Operação, operacao), o shell script tem a linhas que tratam a resposta, são as condições if.
O script trata a resposta do aplicativo que criamos e retorna os estados para o Nagios, logo, não esqueça de alterar o script caso mude os retornos do aplicativo no Java.
Se for utilizar os links de homologação é preciso alterar o tipo de ambiente no código Java na linha 67 aproximadamente (<tpAmb>1</tpAmb>), reconstrua o aplicativo.
Altere de:
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append(" <consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">").append(" <tpAmb>1</tpAmb>").append("<cUF>").append(codigoDoEstado).append("</cUF>") .append(" <xServ>STATUS</xServ>").append("</consStatServ>");
Para:
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append("
<consStatServ versao=\"2.00\"
xmlns=\"http://www.portalfiscal.inf.br/nfe\">").append("
<tpAmb>2</tpAmb>").append("<cUF>").append(codigoDoEstado).append("</cUF>")
.append(" <xServ>STATUS</xServ>").append("</consStatServ>");
Agora vamos configurar o Nagios. Adicione no nagios.cfg:
# Sefaz
cfg_file=/usr/local/nagios/etc/objects/sefazgroups.cfg
cfg_file=/usr/local/nagios/etc/objects/linksSefaz.cfg
cfg_file=/usr/local/nagios/etc/objects/sefazgroups.cfg
cfg_file=/usr/local/nagios/etc/objects/linksSefaz.cfg
Crie linksSefaz.cfg.
#Defina um host
define host{
use linux- server   ;
host_name Links SEFAZ
alias Links SEFAZ
address 127.0.0.1
}
# SP - https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx
define service{
use &n bsp; generic-nfe
host_name Links SEFAZ
service_description NFe 35 - SP
check_command check_nfe_status!35
contact_groups admins,programadores
servicegroups links_sefaz
}
define host{
use linux- server   ;
host_name Links SEFAZ
alias Links SEFAZ
address 127.0.0.1
}
# SP - https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx
define service{
use &n bsp; generic-nfe
host_name Links SEFAZ
service_description NFe 35 - SP
check_command check_nfe_status!35
contact_groups admins,programadores
servicegroups links_sefaz
}
Crie sefazgroups.cfg:
define servicegroup{
servicegroup_name links_sefaz
alias & nbsp; Servicos SEFAZ
}
servicegroup_name links_sefaz
alias & nbsp; Servicos SEFAZ
}
No commands.cfg:
# 'check_nfe_status' command definition
define command{
command_name check_nfe_status
command_line /usr/local/nagios/libexec/nfeStatus/check_status_nfe $ARG1$
}
define command{
command_name check_nfe_status
command_line /usr/local/nagios/libexec/nfeStatus/check_status_nfe $ARG1$
}
No templates.cfg:
define service{
name   ; generic-nfe
active_checks_enabled &nb sp; 1
passive_checks_enabled &n bsp; 1
parallelize_check &n bsp; 1
obsess_over_service   ; 1
check_freshness &n bsp; 0
notifications_enabled   ; 1
event_handler_enabled &nb sp; 1
flap_detection_enabled &nb sp; 1
failure_prediction_enabled 1
process_perf_data & nbsp; 1
retain_status_information & nbsp; 1
retain_nonstatus_information &nbs p; 1
is_volatile &n bsp; 0
check_period   ;24x7
max_check_attempts &nbs p; 5
normal_check_interval &nb sp; 5
retry_check_interval   ; 2
contact_groups &nbs p; admins
notification_options w,u,c,r
notification_interval 8
notification_period & nbsp; 24x7
register &nbs p; &nb sp; 0
}
name   ; generic-nfe
active_checks_enabled &nb sp; 1
passive_checks_enabled &n bsp; 1
parallelize_check &n bsp; 1
obsess_over_service   ; 1
check_freshness &n bsp; 0
notifications_enabled   ; 1
event_handler_enabled &nb sp; 1
flap_detection_enabled &nb sp; 1
failure_prediction_enabled 1
process_perf_data & nbsp; 1
retain_status_information & nbsp; 1
retain_nonstatus_information &nbs p; 1
is_volatile &n bsp; 0
check_period   ;24x7
max_check_attempts &nbs p; 5
normal_check_interval &nb sp; 5
retry_check_interval   ; 2
contact_groups &nbs p; admins
notification_options w,u,c,r
notification_interval 8
notification_period & nbsp; 24x7
register &nbs p; &nb sp; 0
}
Neste ponto devemos estar com tudo funcionando. Reinicie o Nagios e aguarde a tarefa de checagem ser executada. Lembre-se: sempre verifique as permissões dos arquivos. Caso queira ver as mensagens que suprimi (Exceções), altere as linhas 104 e 105:
( System.out.println("Time out");
para:
System.out.println(ex));
Assumi que qualquer coisa diferente de OK, é problema para nós, então suprimi as mensagens de erro.
Os arquivos:
- NFe_Consulta Status.zip -> Projeto Netbeans completo, com fonte e já construido (Dir. dist), aplicativo que verifica o status do serviço.
- nfeStatus.zip -> Projeto já construido com estrutura de diretório pronta para adicionar ao Nagios aplicativo que verifica o status do serviço.
- NFeBuildCacerts.z ip -> Projeto Netbeans completo, com fonte e já construido (Dir. dist), aplicativo que gera o certificados.
Não retiro o mérito dos autores, que toda base para projeto foi conseguida através da comunidade:
Apenas ajustei e adicionei algumas funções.
Sintam-se a vontade para opinar, alterar, sugerir e distribuir o conteúdo desta dica.
Espero que seja útil. Qualquer dúvida, sugestão... Só comentar, que na medida do tempo disponível vou respondendo.
Acontece com os estados 42 Santa Catarina e 33 Rio de Janeiro.
Para corrigir importe a chave em um navegador IE, e depois de importado, exporte ele usando as opções:
Sim,exportar a chave particular e
Incluir todos os certificados no caminho de certificação, se possivel.
A chave de ficar com aproximadamente 8k.