Commit 1d65806440849adcb5913d6b9feb6043c3139455
1 parent
15823b63
Exists in
master
and in
1 other branch
Adicionando arquivo python verificar-pendencias-represadas.py para as ferramenta…
…s de monitoramento alertarem caso haja processo parado no barramento há xx minutos
Showing
1 changed file
with
140 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,140 @@ | @@ -0,0 +1,140 @@ | ||
1 | +""" | ||
2 | +Rotina verificadora para notificar ferramentas de monitoramento sobre tramites parados | ||
3 | +sem processamento no barramento | ||
4 | +Lista todos os tramites e salva em um arquivo a situacao com a data/hora | ||
5 | +Nas execucoes seguintes, compara as datas com os tramites atuais para definir o | ||
6 | +tempo que estah parado no barramento | ||
7 | + | ||
8 | +Autor: Marcelo Linhares Castro (marlinhares@gmail.com) | ||
9 | +Original em: | ||
10 | +https://softwarepublico.gov.br/gitlab/sei/mod-sei-pen | ||
11 | + | ||
12 | +Modo de uso: | ||
13 | +- certifique-se q hah permissao de leitura e escrita na pasta atual | ||
14 | +- certifique-se q o certificado esteja na pasta atual como certall.pem, ou | ||
15 | +que o parametro esteja corretamente apontando para o caminho | ||
16 | +- certifique-se que hah rota para o barramento | ||
17 | +- execute como indicado abaixo | ||
18 | + | ||
19 | +Execute: | ||
20 | +python pendencias-represadas.py | ||
21 | +ou, usando argumentos para sobrescrever os valores default de execucao: | ||
22 | +python pendencias-represadas.py intMaxTimeWarning intMaxTimeCritical strCaminhoCert strURL | ||
23 | +onde | ||
24 | +- intMaxTimeWarning: tempo (mins) do tramite parado no barramento para gerar warning | ||
25 | +- intMaxTimeCritical: tempo (mins) do tramite parado no barramento para gerar critical | ||
26 | +- strCaminhoCert: caminho completo do certificado para conectar no barramento | ||
27 | +- strURL: url do barramento para recuperar as pendencias | ||
28 | + | ||
29 | +Retornos da rotina: | ||
30 | +exit 0 - sucesso | ||
31 | +exit 1 - warning (processo ha no minimo MAXTIME_WARNING parado no barramento) | ||
32 | +exit 2 - critical (processo ha pelo menos MAXTIME_CRITICAL parado no barramento) | ||
33 | +""" | ||
34 | + | ||
35 | +import json | ||
36 | +import os | ||
37 | +import sys | ||
38 | +from datetime import datetime | ||
39 | + | ||
40 | +# tempo (mins) para gerar warning. Programa retorna com exit 1 - Warning do Nagios | ||
41 | +MAXTIME_WARNING = 60 | ||
42 | +# tempo (mins) para gerar critical. Programa retorna com exit 2 - Critical do Nagios | ||
43 | +MAXTIME_CRITICAL = 90 | ||
44 | +# caminho completo do certificado para conectar no barramento | ||
45 | +CERT = "./certall.pem" | ||
46 | +# url para recuperar as pendencias no barramento | ||
47 | +API_URL = "https://api.conectagov.processoeletronico.gov.br/interoperabilidade/rest/v2/tramites/pendentes" | ||
48 | + | ||
49 | +# vamos sobrescrever os valores padrao, caso existam argumentos | ||
50 | +try: | ||
51 | + args = sys.argv | ||
52 | + if( len(sys.argv) > 1): MAXTIME_WARNING = int(args[1]) | ||
53 | + if( len(sys.argv) > 2): MAXTIME_CRITICAL = int(args[2]) | ||
54 | + if( len(sys.argv) > 3): CERT = str(args[3]) | ||
55 | + if( len(sys.argv) > 4): API_URL = str(args[4]) | ||
56 | + | ||
57 | +except Exception, e: | ||
58 | + print('Falha ao ler ou setar parametros: '+ str(e)) | ||
59 | + exit(4) | ||
60 | + | ||
61 | +COMANDO_PENDENCIAS = 'curl -s -S --cert ' + CERT + ' ' + API_URL | ||
62 | + | ||
63 | +# buscar as pendencias | ||
64 | +try: | ||
65 | + strPends = os.popen(COMANDO_PENDENCIAS).read() | ||
66 | + tmp = json.loads(strPends) | ||
67 | +except Exception, e: | ||
68 | + print('Falha ao ler ou abrir a lista de pendencias do barramento. ' + str(e)) | ||
69 | + print('Verifique se o certificado eh aceito pelo barrramento. Rode o seguinte comando e ') | ||
70 | + print('certifique-se que retorne um json valido: ' + COMANDO_PENDENCIAS) | ||
71 | + exit(4) | ||
72 | + | ||
73 | +# transformar pendencias em um json plano (cada elemento um idt unico) | ||
74 | +jsoPends = {} | ||
75 | +for t in tmp: | ||
76 | + j = { | ||
77 | + str(t['IDT']): | ||
78 | + { | ||
79 | + "status": t['status'] | ||
80 | + } | ||
81 | + } | ||
82 | + jsoPends.update(j) | ||
83 | + | ||
84 | + | ||
85 | +# ler arquivo de pendencias anterior | ||
86 | +if not os.path.isfile('pendencias.json'): | ||
87 | + with open('pendencias.json', 'w') as json_file: | ||
88 | + json.dump({'1': '1'}, json_file) | ||
89 | + | ||
90 | +try: | ||
91 | + with open('pendencias.json', 'r') as json_file: | ||
92 | + jsoAntigos = json.load(json_file) | ||
93 | +except: | ||
94 | + print """Excessao ao abrir ou carregar o arquivo pendencias.json. | ||
95 | + Apague o mesmo e verifique se ha permissao suficiente no diretorio""" | ||
96 | + exit(4) | ||
97 | + | ||
98 | +# apagar tramites ja efetuados do arquivo de pendencias | ||
99 | +lstApagar = [] | ||
100 | +for idt in jsoAntigos: | ||
101 | + if not (idt in jsoPends): | ||
102 | + lstApagar.append(idt) | ||
103 | + | ||
104 | +for idt in lstApagar: | ||
105 | + jsoAntigos.pop(idt) | ||
106 | + | ||
107 | + | ||
108 | +# agora vamos verificar se ha algo pendente dentro do intervalo de tempo determinado | ||
109 | +for idt in sorted(jsoPends): | ||
110 | + | ||
111 | + dtAtual = datetime.now() | ||
112 | + | ||
113 | + if ((idt in jsoAntigos) and (jsoPends[idt]['status'] == jsoAntigos[idt]['status'])): | ||
114 | + | ||
115 | + dtAntiga = datetime.strptime( jsoAntigos[idt]['tempo'] , '%Y-%m-%d %H:%M') | ||
116 | + flDelta = (dtAtual - dtAntiga) | ||
117 | + flDelta = (flDelta.microseconds + (flDelta.seconds + flDelta.days * 24 * 3600) * 10**6) / 10**6 / 60 | ||
118 | + | ||
119 | + if ( flDelta >= MAXTIME_WARNING and flDelta < MAXTIME_CRITICAL ): | ||
120 | + print "IDT: " + str(idt) + " --- " + str(flDelta) + " minutos parado no barramento" | ||
121 | + exit(1) | ||
122 | + elif ( flDelta >= MAXTIME_CRITICAL ): | ||
123 | + print "IDT: " + str(idt) + " --- " + str(flDelta) + " minutos parado no barramento" | ||
124 | + exit(2) | ||
125 | + | ||
126 | + # vamos atualizar a lista com a data/status atual caso o idt nao exista nela | ||
127 | + newJson = { | ||
128 | + "status": jsoPends[idt]['status'], | ||
129 | + "tempo": dtAtual.strftime('%Y-%m-%d %H:%M') | ||
130 | + } | ||
131 | + | ||
132 | + if( (idt not in jsoAntigos) or (jsoAntigos[idt]['status'] != jsoPends[idt]['status'] ) ): | ||
133 | + jsoAntigos[idt] = newJson | ||
134 | + | ||
135 | + # salvar a data e status dos idts pendentes para comparar na prox execucao | ||
136 | + with open('pendencias.json', 'w') as json_file: | ||
137 | + json.dump(jsoAntigos, json_file) | ||
138 | + | ||
139 | +# caso tenha chegado ate aqui significa q o processamento esta em dia | ||
140 | +exit(0) | ||
0 | \ No newline at end of file | 141 | \ No newline at end of file |