[903] | 1 | <?php |
---|
| 2 | /* |
---|
| 3 | Arquivo que eh invocado pela cron do Linux, de 5 em 5 minutos para efetivar o sincronismo |
---|
| 4 | das listas de email no Expresso junto ao RHDS. |
---|
| 5 | */ |
---|
| 6 | |
---|
| 7 | //Diretorio padrao contendo o poll de arquivos de listas criados via web |
---|
| 8 | # define("diretoriolistas", getcwd()."/pool"); |
---|
| 9 | define("diretoriolistas", '/var/www/mailman/pool'); |
---|
| 10 | |
---|
| 11 | //Define o manipulador do respositorio para controlar as listas |
---|
| 12 | $manipulador_dir = opendir(diretoriolistas); |
---|
| 13 | |
---|
| 14 | //Caso o script nao consiga acessar o poll das operacoes sobre as listas, aborta o script |
---|
| 15 | if((!is_dir(diretoriolistas)) || (!$manipulador_dir)){ |
---|
| 16 | $msg = "PHPCRON: Falha ao sincronizar as definicoes de listas entre o RHDS e Mailman: diretorio do pool \"".diretoriolistas."\" nao encontrado/disponivel."; |
---|
| 17 | $log = `/usr/bin/logger -p local5.notice -t Sinc-Listas-Mailman-RHDS '$msg'`; |
---|
| 18 | exit(); |
---|
| 19 | } |
---|
| 20 | |
---|
| 21 | //Define dois vetores: de listas a incluir e excluir |
---|
| 22 | $vet_Incluir = array(); |
---|
| 23 | $vet_Excluir = array(); |
---|
| 24 | |
---|
| 25 | //Carrega os nomes e operacoes com as listas a processar |
---|
| 26 | while(($arquivo = readdir($manipulador_dir)) !== false){ |
---|
| 27 | $op_lista = substr($arquivo, 0, 3); |
---|
| 28 | $nome_lista = substr($arquivo, 4, strlen($arquivo)); |
---|
| 29 | if($op_lista == 'ins') |
---|
| 30 | array_push($vet_Incluir, $nome_lista); |
---|
| 31 | elseif($op_lista == 'rem') |
---|
| 32 | array_push($vet_Excluir, $nome_lista); |
---|
| 33 | } |
---|
| 34 | |
---|
| 35 | //Para depurar se os dados das listas estao sendo devidamente tratados nas operacoes especificas |
---|
| 36 | //echo "Inserir: ".count($vet_Incluir) . "<br>Remover: " . count($vet_Excluir); |
---|
| 37 | //exit; |
---|
| 38 | |
---|
| 39 | //Vinculos com os arquivos de configuracao/funcionalidades Mailman/RHDS |
---|
| 40 | |
---|
| 41 | require_once("/usr/local/listas/functions.php"); |
---|
| 42 | require_once("/usr/local/listas/config.php"); |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | //Se nao encontrou listas a inserir ou remover, aborta o script |
---|
| 46 | if ((count($vet_Incluir) == 0) && (count($vet_Excluir) == 0)){ |
---|
| 47 | criaLog("PHPCRON: Nao ha listas a incluir/remover em \"".diretoriolistas."\"","sinc"); |
---|
| 48 | echo "PHPCRON: Nao ha listas a processar em \"".diretoriolistas."\"\n"; |
---|
| 49 | exit; |
---|
| 50 | } |
---|
| 51 | |
---|
| 52 | //Cria um log com as atividades previstas |
---|
| 53 | criaLog("PHPCRON: Numero de listas a inserir=".count($vet_Incluir) . " e a remover=".count($vet_Excluir)."\n","sinc"); |
---|
| 54 | echo "PHPCRON: Inicializando totalizador de insercoes= ".count($vet_Incluir)." e delecoes=".count($vet_Excluir)."\n"; |
---|
| 55 | //Diretorio padrao de chamada dos comandos |
---|
| 56 | $dir_exe = '/usr/lib/mailman/bin'; |
---|
| 57 | |
---|
| 58 | /* |
---|
| 59 | CADASTRAMENTO DAS NOVAS LISTAS |
---|
| 60 | */ |
---|
| 61 | $i = 0; |
---|
| 62 | $incluidas = 0; |
---|
| 63 | |
---|
| 64 | while($i < count($vet_Incluir)){ |
---|
| 65 | //Conecta ao LDAP para procurar listas |
---|
| 66 | $conexao = @ldap_connect($server, $port); |
---|
| 67 | @ldap_set_option($conexao, LDAP_OPT_PROTOCOL_VERSION, 3); |
---|
| 68 | @ldap_bind($conexao, $rootdn, $pass); |
---|
| 69 | $filtro = "(uid=".$vet_Incluir[$i].")"; |
---|
| 70 | $selecao = array("uid","mailforwardingaddress","listpass", "admlista", "defaultmembermoderation", "naomoderado"); |
---|
| 71 | $busca = @ldap_search($conexao, $baseGravacao, $filtro, $selecao); |
---|
| 72 | $dados = @ldap_get_entries($conexao, $busca); |
---|
| 73 | $contador = $dados['count']; |
---|
| 74 | |
---|
| 75 | //PARA DEPURAR A BUSCA NO LDAP, PARA ENCONTRAR A LISTA QUE FOI RECENTEMENTE CADASTRADA NO RHDS |
---|
| 76 | //echo "<p>Encontradas $contador entradas no LDAP para \"$vet_Incluir[$i]\"</p>"; |
---|
| 77 | //exit; |
---|
| 78 | |
---|
| 79 | # $arquivoLog = 'cron.CriarLista.log'; |
---|
| 80 | # $handlerLog = @fopen("/var/log/$arquivoLog","w"); |
---|
| 81 | |
---|
| 82 | //Se encontrou o registro da nova lista no RHDS, processa o cadastro da mesma no Mailman |
---|
| 83 | if($contador == 1){ |
---|
| 84 | $infoUid = $dados[0]['uid'][0]; |
---|
| 85 | $arquivo = $infoUid; |
---|
| 86 | $senhaLista = $dados[0]['listpass'][0]; |
---|
| 87 | |
---|
| 88 | if($senhaLista == "") |
---|
| 89 | $senhaLista = "senha"; |
---|
| 90 | |
---|
| 91 | $senhaLista = desencriptar($senhaLista); |
---|
| 92 | $moderacao_padrao_membro = $dados[0]['defaultmembermoderation'][0]; |
---|
| 93 | |
---|
| 94 | if($moderacao_padrao_membro == "") |
---|
| 95 | $moderacao_padrao_membro = 0; |
---|
| 96 | |
---|
| 97 | $manipulador = @fopen($arquivo,"w"); |
---|
| 98 | |
---|
| 99 | //Laco que cria um arquivo com os participantes de uma lista |
---|
| 100 | $j = 0; |
---|
| 101 | while($dados[0]['mailforwardingaddress'][$j] != ""){ |
---|
| 102 | $dadosMail = $dados[0]['mailforwardingaddress'][$j]; |
---|
| 103 | fwrite($manipulador, $dadosMail . "\n"); |
---|
| 104 | $j++; |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | $w = 0; |
---|
| 108 | //Laco interno que recupera os participantes administradores da mesma, gerando um array |
---|
| 109 | $dadosAdmLista = ""; |
---|
| 110 | while($dados[0]['admlista'][$w] != ""){ |
---|
| 111 | $dadosAdmLista[] = $dados[0]['admlista'][$w]; |
---|
| 112 | $w++; |
---|
| 113 | } |
---|
| 114 | |
---|
| 115 | //Laco interno que identifica os usuarios nao moderados de uma lista, em vetor |
---|
| 116 | $z = 0; |
---|
| 117 | $infonaomoderado = ""; |
---|
| 118 | while($dados[0]['naomoderado'][$z] != ""){ |
---|
| 119 | $testeNaoModerado = $dados[0]['naomoderado'][$z]; |
---|
| 120 | $infonaomoderado[] = $dados[0]['naomoderado'][$z]; |
---|
| 121 | $z++; |
---|
| 122 | } |
---|
| 123 | |
---|
| 124 | $contadorNaoNumerado = count($infonaomoderado); |
---|
| 125 | |
---|
| 126 | //Testa se a lista existe no Mailman |
---|
| 127 | $testaLista = "$dir_exe/list_admins $infoUid"; |
---|
| 128 | //$errotestaLista = `$testaLista`; |
---|
| 129 | exec($testaLista, $errotestaLista); |
---|
| 130 | //$errotestaLista = $errotestaLista; |
---|
| 131 | |
---|
| 132 | //PARA DEPURAR EVENTUAIS ERROS NA HORA DE GRAVAR O ARQUIVO DE LEITURA COM O NOME DA LISTA |
---|
| 133 | //echo "<p>Lista no mailman? " . $errotestaLista[0] . "</p>"; |
---|
| 134 | //exit; |
---|
| 135 | |
---|
| 136 | //Se nao existe, cria a lista |
---|
| 137 | if((substr($errotestaLista[0],0,12) == "No such list") || (substr($errotestaLista[0],0,17) == "Lista inexistente")){ |
---|
| 138 | //Gera o arquivo de definicoes do Mailman na funcao "geraArquivoDefault" [functions.php] |
---|
| 139 | geraArquivoDefault($infoUid, $moderacao_padrao_membro, $infoAdmLista); |
---|
| 140 | $pesquisa = strtolower($infoUid); |
---|
| 141 | $cmd = "$dir_exe/list_admins $pesquisa"; |
---|
| 142 | exec($cmd, $err_retorno); |
---|
| 143 | $chave1 = "No such list: $pesquisa"; |
---|
| 144 | $chave2 = "Lista inexistente: $pesquisa"; |
---|
| 145 | $criaLista = "$dir_exe/newlist -q $infoUid $moderador $senhaLista"; |
---|
| 146 | |
---|
| 147 | //$teste_exec = "$dir_exe/newlist"; |
---|
| 148 | //$cmd_teste = exec($teste_exec, $teste_msg); |
---|
| 149 | //echo "Aqui: $teste_msg[0]"; |
---|
| 150 | //exit; |
---|
| 151 | |
---|
| 152 | //PARA DEPURAR EVENTUAIS ERROS NA HORA DE GRAVAR O ARQUIVO DE LEITURA COM O NOME DA LISTA |
---|
| 153 | //echo "Antes de tentar gravar = $teste_msg[0]"; |
---|
| 154 | |
---|
| 155 | if((in_array("$chave1", $err_retorno)) || (in_array("$chave2", $err_retorno))){ |
---|
| 156 | $erroCriaLista = `$criaLista`; |
---|
| 157 | $msg1 = "Criando lista $infoUid"; |
---|
| 158 | criaLog($msg1, "sinc"); |
---|
| 159 | } |
---|
| 160 | else{ |
---|
| 161 | $msg2 = "Lista $infoUid ja existe!!!"; |
---|
| 162 | criaLog($msg2, "sinc"); |
---|
| 163 | } |
---|
| 164 | |
---|
| 165 | //PARA DEPURAR A ESPECIFICA CRIACAO DA NOVA LISTA, MAPEANDO UMA DAS DUAS MENSAGENS ACIMA |
---|
| 166 | //echo "MSG1 = $msg1 - MSG2 = $msg2<br>COMANDO CRIA LISTA: $criaLista"; |
---|
| 167 | //exit; |
---|
| 168 | |
---|
| 169 | $definePadrao = "$dir_exe/config_list -i $infoUid.def $infoUid"; |
---|
| 170 | $msg3 = "Aplicando politica a lista $infoUid"; |
---|
| 171 | criaLog($msg3, "sinc"); |
---|
| 172 | exec($definePadrao, $errodefinePadrao); |
---|
| 173 | $cmd2 = "clear"; |
---|
| 174 | exec($cmd2); |
---|
| 175 | |
---|
| 176 | //PARA DEPURAR O COMANDO DE PADRONIZACAO ACIMA |
---|
| 177 | //echo "errodefinePadrao = $errodefinePadrao[0]"; |
---|
| 178 | } |
---|
| 179 | |
---|
| 180 | //Sincroniza usuarios e listas |
---|
| 181 | $msg2 = "LDAP e Mailman sincronizados ->lista $infoUid"; |
---|
| 182 | $cmd = "$dir_exe/sync_members -f $arquivo $infoUid"; |
---|
| 183 | criaLog("$msg","sinc"); |
---|
| 184 | exec($cmd, $erro); |
---|
| 185 | |
---|
| 186 | //PARA DEPURAR O COMANDO DE SINCRONIZACAO ACIMA |
---|
| 187 | //echo "MSG SINCRONINZE = $erro[0]"; |
---|
| 188 | |
---|
| 189 | //Atualiza usuarios nao moderados |
---|
| 190 | $listaNaoModerados = strtolower($infoUid); |
---|
| 191 | if(($contanaoModerado > 1) && ($moderacao_padrao_membro == 1)){ |
---|
| 192 | atualizaModeracao($listaNaoModerado, $infonaomoderado); |
---|
| 193 | $contanaoModerado = 0; |
---|
| 194 | } |
---|
| 195 | |
---|
| 196 | //PARA DEPURAR O COMANDO DE SINCRONIZACAO ACIMA |
---|
| 197 | //echo "Moderacao = $contanaoModerado"; |
---|
| 198 | } |
---|
| 199 | |
---|
| 200 | //Testa se nao houve problemas na criacao da lista no mailman |
---|
| 201 | if($erroCriaLista != "") |
---|
| 202 | criaLog("PHPCRON: Erro criando lista $vet_Incluir[$i] -> $erroCriaLista\n", "sinc"); |
---|
| 203 | else{ |
---|
| 204 | criaLog("PHPCRON: Lista $vet_Incluir[$i] criada com sucesso!\n", "sinc"); |
---|
| 205 | $incluidas++; |
---|
| 206 | } |
---|
| 207 | |
---|
| 208 | //Remove o arquivo do pool de listas a processar |
---|
| 209 | @unlink(diretoriolistas."/ins_".$vet_Incluir[$i]); |
---|
| 210 | $i++; |
---|
| 211 | } |
---|
| 212 | |
---|
| 213 | /* |
---|
| 214 | REMOCAO DE LISTAS |
---|
| 215 | */ |
---|
| 216 | |
---|
| 217 | $i = 0; |
---|
| 218 | $removidas = 0; |
---|
| 219 | while($i < count($vet_Excluir)){ |
---|
| 220 | //Conecta ao LDAP para procurar listas |
---|
| 221 | $conexao = @ldap_connect($server, $port); |
---|
| 222 | @ldap_set_option($conexao, LDAP_OPT_PROTOCOL_VERSION, 3); |
---|
| 223 | @ldap_bind($conexao, $rootdn, $pass); |
---|
| 224 | |
---|
| 225 | $listaListas = "list_lists -b"; |
---|
| 226 | $listaTotal = `$dir_exe/$listaListas`; |
---|
| 227 | $lista = explode("\n", $listaTotal); |
---|
| 228 | $contaLista = count($lista); |
---|
| 229 | |
---|
| 230 | $filtro = "(uid=".$vet_Excluir[$i].")"; |
---|
| 231 | $selecao = array("uid"); |
---|
| 232 | $busca = @ldap_search($conexao, $baseGravacao, $filtro, $selecao); |
---|
| 233 | $dados = @ldap_get_entries($conexao, $busca); |
---|
| 234 | $contador = $dados['count']; |
---|
| 235 | |
---|
| 236 | //PARA DEPURAR A BUSCA NO LDAP, PARA ENCONTRAR A LISTA QUE FOI RECENTEMENTE CADASTRADA NO RHDS |
---|
| 237 | //echo "<p>Encontradas $contador entradas no LDAP para \"$vet_Excluir[$i]\"</p>"; |
---|
| 238 | //exit; |
---|
| 239 | |
---|
| 240 | //Se encontrou o id para a lista no RHDS, sai do script e gera log: a lista nao foi deletada de la ainda |
---|
| 241 | if($contador != 0){ |
---|
| 242 | criaLog("PHPCRON: Erro removendo lista $vet_Excluir[$i] -> Mais de uma ocorrencia foi localizada no repositorio LDAP.\n", "sinc"); |
---|
| 243 | echo "PHPCRON: Erro removendo lista $vet_Excluir[$i] -> $contador ocorrencias localizadas no repositorio LDAP.\n"; |
---|
| 244 | exit; |
---|
| 245 | } |
---|
| 246 | |
---|
| 247 | $infoUid = strtolower($vet_Excluir[$i]); |
---|
| 248 | if($infoUid != ""){ |
---|
| 249 | $removeLista = "$dir_exe/rmlist -a $vet_Excluir[$i]"; |
---|
| 250 | exec($removeLista, $erroRemove); |
---|
| 251 | apagaListaMailman($lista[$i]); |
---|
| 252 | criaLog("PHPCRON: Lista removida -> $vet_Excluir[$i]!\n", "sinc"); |
---|
| 253 | $removidas++; |
---|
| 254 | } |
---|
| 255 | |
---|
| 256 | if($erroRemove[0] != ""){ |
---|
| 257 | criaLog("PHPCRON: Erro removendo a lista $vet_Excluir[$i] -> $erroRemove[0]\n", "sinc"); |
---|
| 258 | } |
---|
| 259 | |
---|
| 260 | //Remove o arquivo identificador da lista excluida |
---|
| 261 | @unlink(diretoriolistas . "/rem_".$vet_Excluir[$i]); |
---|
| 262 | $i++; |
---|
| 263 | } |
---|
| 264 | |
---|
| 265 | echo "PHPCRON: Sincronismo concluido: " . $incluidas . " novas listas criadas e ". $removidas. " listas removidas\n"; |
---|
| 266 | ?> |
---|