[1174] | 1 | #!/usr/bin/python |
---|
| 2 | # -*- coding: utf-8 -*-
|
---|
| 3 |
|
---|
| 4 | import os, popen2, fcntl, select, time
|
---|
| 5 | from string import replace
|
---|
| 6 |
|
---|
| 7 | theOutput = []
|
---|
| 8 |
|
---|
| 9 | def fazlog(dados):
|
---|
| 10 | for i in dados: |
---|
| 11 | aux = i.split('\n') |
---|
| 12 | for x in aux:
|
---|
| 13 | logging.info(x)
|
---|
| 14 |
|
---|
| 15 | def makeNonBlocking(fd):
|
---|
| 16 | fl = fcntl.fcntl(fd, fcntl.F_GETFL)
|
---|
| 17 | try:
|
---|
| 18 | fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NDELAY)
|
---|
| 19 | except AttributeError:
|
---|
| 20 | fcntl.fcntl(fd, fcntl.F_SETFL, fl | fcntl.FNDELAY)
|
---|
| 21 |
|
---|
| 22 | def ExeCmd(command):
|
---|
| 23 | theOutput = []
|
---|
| 24 | child = popen2.Popen3(command, 1) # Captura a stdout e a stderr do comando...
|
---|
| 25 | child.tochild.close() # Não estamos "falando(escrevendo para a stdin do comando) com o processo filho...
|
---|
| 26 | outfile = child.fromchild
|
---|
| 27 | outfd = outfile.fileno()
|
---|
| 28 | errfile = child.childerr
|
---|
| 29 | errfd = errfile.fileno()
|
---|
| 30 | makeNonBlocking(outfd) # Não queremos um deadlock !!!!( Dica do Python Cookbook v1)
|
---|
| 31 | makeNonBlocking(errfd)
|
---|
| 32 | outdata = errdata = ''
|
---|
| 33 | outeof = erreof = 0
|
---|
| 34 | while 1:
|
---|
| 35 | ready = select.select([outfd,errfd],[],[]) # Aguarda a entrada(saida do comando)
|
---|
| 36 | if outfd in ready[0]:
|
---|
| 37 | outchunk = outfile.read()
|
---|
| 38 | if outchunk == '': outeof = 1
|
---|
| 39 | outdata = outdata + outchunk
|
---|
| 40 | if errfd in ready[0]:
|
---|
| 41 | errchunk = errfile.read()
|
---|
| 42 | if errchunk == '': erreof = 1
|
---|
| 43 | errdata = errdata + errchunk
|
---|
| 44 | if outeof and erreof: break
|
---|
| 45 | select.select([],[],[],.1) #Da um tempo para os buffers serem preenchidosl
|
---|
| 46 | err = child.wait()
|
---|
| 47 | #if err != 0:
|
---|
| 48 | # raise RuntimeError, '%s failed w/ exit code %d\n%s' % (command, err, errdata)
|
---|
| 49 | theOutput.append(outdata)
|
---|
| 50 | theOutput.append(errdata)
|
---|
| 51 | return theOutput
|
---|
| 52 |
|
---|
| 53 | # No arquivo crl_admin_confg esta o path (arquivo) que aponta para a configuracao das urls(CRL_urls) das crls que devem ser obtidas. |
---|
| 54 | # Este arquivo tambem informa o arquivo onde sera gravada a log(log), e o arquivo contendo |
---|
| 55 | # a cadeia de certificados para verificar as crls(CAfile). |
---|
| 56 | # Apos o import, executar a funcao ler_conf() ..... |
---|
| 57 | from crl_admin_confg import * |
---|
| 58 | |
---|
| 59 | import logging |
---|
| 60 | |
---|
| 61 | # Configura como sera a log ..... |
---|
| 62 | logging.basicConfig(level=logging.INFO, |
---|
| 63 | format='%(asctime)s %(levelname)s %(message)s', |
---|
| 64 | filename=log, |
---|
| 65 | filemode='a') |
---|
| 66 | |
---|
| 67 | # A execucao da funcao a seguir carrega a lista das CRLs (CRL_urls) que devem ser processadas... |
---|
| 68 | ler_conf() |
---|
| 69 | |
---|
| 70 | for crl in CRL_urls: |
---|
| 71 | arquivo = crl[1] + os.path.split(crl[0])[1]
|
---|
| 72 | url = crl[0]
|
---|
| 73 | |
---|
| 74 | # Obtendo o arquivo com wget ... |
---|
| 75 | logging.info('Buscando a CRL: ' + url) |
---|
| 76 | saida_wget = ExeCmd("wget " + url + " -O " + arquivo) |
---|
| 77 |
|
---|
| 78 | # Abaixo estamos comandando a execucao "openssl crl" passando o arquivo crl .
|
---|
| 79 | # O resultado esta em saida. Tem de ser 'verify OK' . |
---|
| 80 | if os.path.exists(arquivo) and os.path.getsize(arquivo) > 0: |
---|
| 81 | logging.info('Verificando ' + arquivo + '(' + str(os.path.getsize(arquivo)) + ' Bytes)') |
---|
| 82 | saida = ExeCmd('openssl crl -CAfile ' + CAfile + ' -in ' + arquivo + ' -inform DER -noout') |
---|
| 83 | # usa a funcao fazlog porque saida he um array.....
|
---|
| 84 | fazlog(saida)
|
---|
| 85 | try:
|
---|
| 86 | aux1 = replace(saida[1],'\n','')
|
---|
| 87 | if not aux1 == 'verify OK':
|
---|
| 88 | logging.critical('Erro verificando a CRL ' + arquivo + '\n') |
---|
| 89 | try: |
---|
| 90 | os.remove(arquivo) |
---|
| 91 | except: |
---|
| 92 | pass
|
---|
| 93 | continue |
---|
| 94 | # A crl foi verificada e est OK.... |
---|
| 95 | # Atuaiza a data do arquivo...
|
---|
| 96 | saida = ExeCmd('touch ' + arquivo)
|
---|
| 97 | except:
|
---|
| 98 | logging.critical('Erro processando o status da verificacao da CRL ' + arquivo + '\n') |
---|
| 99 | try: |
---|
| 100 | os.remove(arquivo) |
---|
| 101 | except: |
---|
| 102 | pass
|
---|
| 103 | continue
|
---|
| 104 | else: |
---|
| 105 | # usa a funcao fazlog porque saida_wget he um array..... |
---|
| 106 | fazlog(saida_wget) |
---|
| 107 | logging.critical('Nao foi possivel obter a CRL ' + url + '\n') |
---|
| 108 | try: |
---|
| 109 | os.remove(arquivo) |
---|
| 110 | except: |
---|
| 111 | pass
|
---|
| 112 |
|
---|