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 @@ |
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 | 141 | \ No newline at end of file | ... | ... |