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