#!/usr/bin/python # -*- coding: utf-8 -*- import os, popen2, fcntl, select, time from string import replace theOutput = [] def fazlog(dados): for i in dados: aux = i.split('\n') for x in aux: logging.info(x) def makeNonBlocking(fd): fl = fcntl.fcntl(fd, fcntl.F_GETFL) try: fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NDELAY) except AttributeError: fcntl.fcntl(fd, fcntl.F_SETFL, fl | fcntl.FNDELAY) def ExeCmd(command): theOutput = [] child = popen2.Popen3(command, 1) # Captura a stdout e a stderr do comando... child.tochild.close() # Não estamos "falando(escrevendo para a stdin do comando) com o processo filho... outfile = child.fromchild outfd = outfile.fileno() errfile = child.childerr errfd = errfile.fileno() makeNonBlocking(outfd) # Não queremos um deadlock !!!!( Dica do Python Cookbook v1) makeNonBlocking(errfd) outdata = errdata = '' outeof = erreof = 0 while 1: ready = select.select([outfd,errfd],[],[]) # Aguarda a entrada(saida do comando) if outfd in ready[0]: outchunk = outfile.read() if outchunk == '': outeof = 1 outdata = outdata + outchunk if errfd in ready[0]: errchunk = errfile.read() if errchunk == '': erreof = 1 errdata = errdata + errchunk if outeof and erreof: break select.select([],[],[],.1) #Da um tempo para os buffers serem preenchidosl err = child.wait() #if err != 0: # raise RuntimeError, '%s failed w/ exit code %d\n%s' % (command, err, errdata) theOutput.append(outdata) theOutput.append(errdata) return theOutput # No arquivo crl_admin_confg esta o path (arquivo) que aponta para a configuracao das urls(CRL_urls) das crls que devem ser obtidas. # Este arquivo tambem informa o arquivo onde sera gravada a log(log), e o arquivo contendo # a cadeia de certificados para verificar as crls(CAfile). # Apos o import, executar a funcao ler_conf() ..... from crl_admin_confg import * import logging # Configura como sera a log ..... logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filename=log, filemode='a') # A execucao da funcao a seguir carrega a lista das CRLs (CRL_urls) que devem ser processadas... ler_conf() for crl in CRL_urls: arquivo = crl[1] + os.path.split(crl[0])[1] url = crl[0] # Obtendo o arquivo com wget ... logging.info('Buscando a CRL: ' + url) saida_wget = ExeCmd("wget " + url + " -O " + arquivo) # Abaixo estamos comandando a execucao "openssl crl" passando o arquivo crl . # O resultado esta em saida. Tem de ser 'verify OK' . if os.path.exists(arquivo) and os.path.getsize(arquivo) > 0: logging.info('Verificando ' + arquivo + '(' + str(os.path.getsize(arquivo)) + ' Bytes)') saida = ExeCmd('openssl crl -CAfile ' + CAfile + ' -in ' + arquivo + ' -inform DER -noout') # usa a funcao fazlog porque saida he um array..... fazlog(saida) try: aux1 = replace(saida[1],'\n','') if not aux1 == 'verify OK': logging.critical('Erro verificando a CRL ' + arquivo + '\n') try: os.remove(arquivo) except: pass continue # A crl foi verificada e est OK.... # Atuaiza a data do arquivo... saida = ExeCmd('touch ' + arquivo) except: logging.critical('Erro processando o status da verificacao da CRL ' + arquivo + '\n') try: os.remove(arquivo) except: pass continue else: # usa a funcao fazlog porque saida_wget he um array..... fazlog(saida_wget) logging.critical('Nao foi possivel obter a CRL ' + url + '\n') try: os.remove(arquivo) except: pass