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 |