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