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:
- 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
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
}
Crie sefazgroups.cfg:
define servicegroup{
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$
}
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
}
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.