Commit 1d65806440849adcb5913d6b9feb6043c3139455

Authored by Marcelo Linhares Castro
1 parent 15823b63
Exists in master and in 1 other branch fix-24

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
verificar-pendencias-represadas.py 0 → 100644
... ... @@ -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
... ...