source: companies/serpro/scripts-listas/cron.syncMailmanRHDS.php @ 903

Revision 903, 9.8 KB checked in by niltonneto, 15 years ago (diff)

Importacao inicial do Expresso do Serpro

Line 
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
41require_once("/usr/local/listas/functions.php");
42require_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?>
Note: See TracBrowser for help on using the repository browser.