Changeset 3232 for branches/2.2/security/crl_admin/crl_admin.py
- Timestamp:
- 09/13/10 15:01:56 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2/security/crl_admin/crl_admin.py
r1174 r3232 2 2 # -*- coding: utf-8 -*- 3 3 4 import os, popen2, fcntl, select, time 4 import os, popen2, fcntl, select, time, sys 5 5 from string import replace 6 7 # Lista com as urls das CRLs, e onde colocar(path) os arquivos obtidos .... 8 CRL_urls = [] 9 Confs = {} 10 11 #Confs['dirtemp'] # path para a pasta temp para conter arquivos auxiliares.... 12 #Confs['CAfile'] # Arquivo com cadeia dos certificados das CAs, para verificacao das CRLs. 13 #Confs['CRLs'] # path para a pasta onde as CRLs sao salvas 14 #Confs['arquivos_crls'] # path para o arquivo de configuracao contendo urls das crls e paths onde serao baixadas... 15 #Confs['log'] # Arquivo onde sera grada log de execucao da qtualizacao/verificacao das crls. 16 # Deixe 'log' igual a vazio para ver as msgs de execucao no terminal....... 17 #Confs['lenMax'] # Tamanho maximo do arquivo de log de atualização das crls antes do rotate..... 18 #Confs['bkpNum'] # Numero de arquivos de log de atualização das crls mantidos pelo rotate.... 19 20 def ler_arquivo_com_configuracao(): 21 # Esta funcao le o arquivo com configuracao geral(linguagen php) para tratar certs. 22 import os,sys 23 BASE = os.path.realpath(__file__).split(os.sep + 'security')[0] # BASE igual a pasta inicial(raiz) do Expresso 24 os.chdir(BASE + '/security/classes') 25 # Esta funcao le o arquivo com configuracao geral(linguagen php) para tratar certs. 26 conf_file = BASE + '/security/classes/Verifica_Certificado_conf.php' 27 e = open(conf_file) 28 r = e.read() 29 aux1 = r.split('\n') 30 # primeiro recupera BASE ... 31 for linha in aux1: 32 linha = linha.strip() 33 if linha[0:16] == "$GLOBALS['BASE']": 34 Confs['BASE'] = BASE 35 break 36 # Agora os demais ... 37 for linha in aux1: 38 linha = linha.strip() 39 if linha[0:10] == "$GLOBALS['": 40 if linha[0:16] != "$GLOBALS['BASE']": 41 aux2 = linha.split(';') 42 if aux2[0] != '': 43 aux2a = aux2[0].split("'") 44 aux3 = aux2[0].split("=") 45 Confs[aux2a[1]] = aux3[1].replace(' ','') 46 # Finalmente trata as ocorrencias de BASE ... 47 for chave in Confs.keys(): 48 if chave != 'BASE': 49 aux = Confs[chave].replace("$GLOBALS['BASE'].",Confs['BASE']) 50 Confs[chave] = aux.replace("'",'') 51 return 52 53 def ler_conf(): 54 # Esta funcao le o arquivo passado como parametro e gera a lista CRL_urls. 55 # O arquivo he esperado no formato: 56 # url ( url = aponta onde buscar a crl, uma por linha. 57 e = open(Confs['arquivos_crls']) 58 r = e.read() 59 aux1 = r.split('\n') 60 for linha in aux1: 61 if linha[0:1] != '#': 62 if linha.strip() != '': 63 # Faz split com ';' para manter compatibilidade com arquivos formato antigo ... 64 CRL_urls.append([linha.split(';')[0].strip(),Confs['CRLs']]) 65 return 66 6 67 7 68 theOutput = [] 8 69 9 def fazlog( dados):10 11 12 13 logging.info(x)70 def fazlog(mL,dados): 71 for i in dados: 72 aux = i.split('\n') 73 for x in aux: 74 mL.info(x) 14 75 15 76 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) 77 fl = fcntl.fcntl(fd, fcntl.F_GETFL) 78 try: 79 fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NDELAY) 80 except AttributeError: 81 fcntl.fcntl(fd, fcntl.F_SETFL, fl | fcntl.FNDELAY) 21 82 22 83 def ExeCmd(command): … … 55 116 # a cadeia de certificados para verificar as crls(CAfile). 56 117 # Apos o import, executar a funcao ler_conf() ..... 57 from crl_admin_confg import * 118 #from crl_admin_confg import * 119 ler_arquivo_com_configuracao() 120 try: 121 ler_arquivo_com_configuracao() 122 except: 123 print 'Erro lendo arquivos de configuracao(ERR-01X)'; 124 sys.exit(1); 58 125 126 try: 127 # A execucao da funcao a seguir carrega a lista das CRLs (CRL_urls) que devem ser processadas... 128 ler_conf() 129 except: 130 print 'Erro lendo arquivos de configuracao(ERR-02X)'; 131 sys.exit(1); 132 133 CAfile = Confs['CAs'] 134 CRLs = Confs['CRLs'] 135 arquivo = Confs['arquivos_crls'] 136 log = Confs['log'] # Deixe log = '' para saida da log na console ..... 137 lenMax = int(Confs['lenMax']) # Tamanho maximo do arquivo de log para iniciar o rotate.... 138 bkpNum = int(Confs['bkpNum']) # Número de arquivos de log mantidos pelo rotate.... 59 139 import logging 140 import logging.handlers 60 141 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') 142 # Prepara para fazer a log das atualizações das crls ... 143 fm = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 144 mL = logging.getLogger('ML') 145 mL.setLevel(logging.DEBUG) 146 hd = logging.handlers.RotatingFileHandler(log, mode='a', maxBytes=lenMax, backupCount=bkpNum) 147 hd.setFormatter(fm) 148 mL.addHandler(hd) 66 149 67 # A execucao da funcao a seguir carrega a lista das CRLs (CRL_urls) que devem ser processadas... 68 ler_conf() 150 if len(sys.argv) > 1: 151 if os.path.isfile(sys.argv[1]): 152 Confs['arquivos_crls'] = sys.argv[1] 153 else: 154 mL.critical('Erro lendo arquivo de configuracao' + sys.argv[1] + ': Nao localizado.\n') 155 sys.exit(2) 156 157 mL.info('Processando arquivo de urls para obter crls: ' +Confs['arquivos_crls'] + ' .') 69 158 70 159 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 160 arquivo = crl[1].strip() + os.path.split(crl[0])[1].strip() 161 url = crl[0].strip() 162 # Obtendo o arquivo com wget ... 163 mL.info('Buscando a CRL: ' + url) 164 saida_wget = ExeCmd("wget --timeout=10 --tries=1 " + url + " -O " + arquivo) 165 # Abaixo estamos comandando a execucao "openssl crl" passando o arquivo crl . 166 # O resultado esta em saida. Tem de ser 'verify OK' . 167 if os.path.exists(arquivo) and os.path.getsize(arquivo) > 0: 168 mL.info('Verificando ' + arquivo + '(' + str(os.path.getsize(arquivo)) + ' Bytes)') 169 saida = ExeCmd('openssl crl -CAfile ' + CAfile + ' -in ' + arquivo + ' -inform DER -noout') 170 # usa a funcao fazlog porque saida he um array..... 171 fazlog(mL,saida) 172 try: 173 aux1 = replace(saida[1],'\n','') 174 if not aux1 == 'verify OK': 175 mL.critical('Erro verificando a CRL ' + arquivo + '\n') 176 try: 177 os.remove(arquivo) 178 except: 179 pass 180 continue 181 # A crl foi verificada e est OK.... 182 # Atuaiza a data do arquivo... 183 saida = ExeCmd('touch ' + arquivo) 184 except: 185 mL.critical('Erro processando o status da verificacao da CRL ' + arquivo + '\n') 186 try: 187 os.remove(arquivo) 188 except: 189 pass 190 continue 191 else: 192 # usa a funcao fazlog porque saida_wget he um array..... 193 fazlog(mL,saida_wget) 194 mL.critical('Nao foi possivel obter a CRL ' + url + '\n') 195 try: 196 os.remove(arquivo) 197 except: 198 pass
Note: See TracChangeset
for help on using the changeset viewer.