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 | ... | ... |