source: trunk/seguranca/crl_admin/crl_admin.py @ 1035

Revision 1035, 3.9 KB checked in by rafaelraymundo, 15 years ago (diff)

Ticket #558 - Adicionada funcionalidade de assinatura e criptografia de e-mails.

Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4import os, popen2, fcntl, select, time
5from string import replace
6
7theOutput = []
8
9def fazlog(dados):
10        for i in dados:
11                aux = i.split('\n')
12                for x in aux:
13                        logging.info(x)
14
15def 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 
22def 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() .....
57from crl_admin_confg import *
58
59import logging
60
61# Configura como sera a log .....
62logging.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...
68ler_conf()
69
70for 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
Note: See TracBrowser for help on using the repository browser.