Bem-Vindo, Visitante

TÓPICO: script de povoamento usuários LDAP no ExpressoBR

script de povoamento usuários LDAP no ExpressoBR 09 Jul 2015 12:05 #1

A quem possa interessar, criamos um script que realiza a migração de um usuário cadastrado no LDAP povoando seus dados na Base de Dados do ExpressoBR.
Utilizamos também para corrigir anomalias na criação de usuários no ExpressoBR, que fazem login, mas não conseguem acessar a caixa de entrada no módulo expressoMail
Demos um nome de povoa.php, ele funciona a partir da leitura de um arquivo (o nome default é caixas.txt) texto contendo cada linha o UID dos usuários no LDAP que devem ser povoados no BD do ExpressoBR (neste script estamos utilizando o Postgresql).

Sua execução é via linha de comando com a seguinte sintaxe (após o povoamento do arquivo caixas.txt com os uid dos usuários a serem povoados):
php povoa.php

OBS.:
- O script ainda se encontra embrionário, o seu uso pode acarretar alguns imprevistos na criação de usuarios para o ExpressoBR. A utilização corre pelo risco do executante.
- Qualquer colaboração no aperfeiçoamento deste script, será muito bem vinda.

Segue o script:
<?php
#parametros globais
$bd_host='IP_DO_SERV_BD_V3';
$bd_port='PORTA DO BD';
$db_name='NOME_DO_BD';
$bd_user='USUARIO_ACESSO_BD';
$bd_password='SENHA_USUARIO_ACESSO_BD';
$ldap_host='HOST_LDAP';
$ldap_base='BASE_LDAP';
$imap_host = "HOST_IMAP";
$imap_port = "PORTA_IMAP";
$imap_ssl = "none";
$smtp_hostname = "HOST_SMTP";
$smtp_port = "PORTA_SMTP";
$smtp_auth = "none";
$smtp_ssl = "none";
$sieve_host = "HOST_SIEVE";
$sieve_port = "PORTA_SIEVE";
$sieve_vacation = 0;
$sieve_ssl = "none";
$uuid_padrao='ENTRYUUID_DO_GRUPO_USUARIOS_COMUNS';
$arq_entrada='caixas.txt'; //arquivo com usuários a manipular

#zera arquivos de log de sql para cada tabela
$f_addressbook = fopen("addressbook.sql","w");
$f_accounts = fopen("accounts.sql","w");
$f_expressomail_accounts = fopen("expressomail_accounts.sql","w");
$f_groups = fopen("groups.sql","w");
$f_group_members = fopen("group_members.sql","w");
$f_preferences = fopen("preferences.sql","w");

#conecta_ldap
$ds=ldap_connect("$ldap_host") or die("conexao falhou");
#$ldapbind = ldap_bind($ds) or die("bind falhou");
$dn = "$ldap_base";

#conecta banco
$con_string = "host=$bd_host port=$bd_port dbname=$db_name user=$bd_user password=$bd_password";
if(!$dbcon = pg_connect($con_string)) die ("Erro ao conectar ao banco ".pg_last_error($dbcon));

#monta array dos grupos existentes no banco
$group=array();
$result = pg_query($dbcon, "SELECT id FROM tine20_groups");
if (!$result) {
  echo "Erro na consulta grp.";
  exit;
}
while ($row = pg_fetch_row($result)) {
  $group[]=$row[0];
}
#monta o array das aplicações habilitadas no V3
$result = pg_query($dbcon, "select id,name from tine20_applications");   
while($data = pg_fetch_assoc($result))
{
  $app[$data["name"]] = $data["id"];
}

#realiza consulta LDAP, OBTEM INFO DOS USUARIOS
function obtem_info_ldap_usu($id)
{
   global $ds;
   global $ldapbind;
   global $dn;
   global $uuid_padrao;
   
   #consulta ldap
   $filter="(uid=$id)";
   $nome_bd = array("login_name", "login_shell", "home_dir", "full_name", "email", "id", "gid_number", "last_name", "first_name","tel_work", "org_unit");
   $justthese = array("uid", "loginshell", "homedirectory", "cn", "mail", "entryuuid", "gidnumber", "sn", "givenname", "telephonenumber", "ou");

   $sr=ldap_search($ds, $dn, $filter, $justthese) or die("erro na pesquisa");

   $info = ldap_get_entries($ds, $sr);

   #monta array com informações
   foreach ($justthese as $key => $value)
   {
           if ( isset($info[0][$value]) )
	 	  $result[$nome_bd[$key]] = preg_replace('/\'/','\'\'',$info[0][$value][0]);
           else
                  $result[$nome_bd[$key]] = '';
   }
   #pega info do grupo princ  
   $filter="(&(gidnumber=" . $result["gid_number"] . ")(objectclass=posixgroup))";
   $justthese = array("entryuuid");
   $sr=ldap_search($ds, $dn, $filter, $justthese);
   $info = ldap_get_entries($ds, $sr);
   if (isset($info[0]["entryuuid"]))
       $result["primary_group_id"]=$info[0]["entryuuid"][0];
   else
       $result["primary_group_id"]=$uuid_padrao;

   #obtem Grupos do usuario
   $filter="(memberuid=$id)";
   $justthese=array("entryuuid", "description", "cn");
   $sr=ldap_search($ds, $dn, $filter, $justthese);
   $info = ldap_get_entries($ds, $sr);
   for ($i=0; $i<$info["count"]; $i++) {
        $entry=$info[$i]["entryuuid"][0];
        $result["grupos"][$entry]["entryuuid"]=$info[$i]["entryuuid"][0];
        $result["grupos"][$entry]["cn"]=$info[$i]["cn"][0];
        $result["grupos"][$entry]["description"]=$info[$i]["description"][0];
    }
   return $result;
}

//faz a alimentação de tabelas grupos e informações do usuário no BD do ExpressoV3
function gerencia_grupos_users($u,$grupos)
{
    global $group;
    global $f_groups;
    global $f_group_members;
    global $dbcon;

    #pega uuid
    $uuid=$u["id"];
    $grp=array(); 
    #monta um array temporário só com os valores de entryuuid
    foreach($grupos as $valor)
    {
       $grp[]=$valor["entryuuid"];
    }
    #compara quais entryuuid dos grupos que o usuario faz parte
    #no LDAP e verifica se existe algum grupo não cadastrado no banco
    $arr_res = array_diff($grp,$group);
    #percorre o array resultante (se existir) cadastrando o grupo
    #no banco e atualizando o array de grupo
    foreach ($arr_res as $gpo)
    {
        $group[] = $gpo;
        $id_g = $gpo;
        $nome_g = $grupos[$gpo]["cn"];
        $description_g = $grupos[$gpo]["description"];
        $sql_g="select name from tine20_groups where name='$nome_g'";
        $res_g=pg_query($dbcon,$sql_g);
        if (pg_num_rows($res_g) == 0)
        {
           $sql="insert into tine20_groups(id, name, description,visibility) values ('$id_g','$nome_g','$description_g','hidden');";

           fwrite($f_groups,$sql . "\n");
           pg_query($dbcon,$sql) or die ("erro na inserção de grupo\n");
        }
	else
        {
           echo "grupo $nome_g já inserido";
        }
        
    }
 
    #povoando o addresbook com a informação do usuario
    $u["contact_id"]=gerencia_addressbook($u);


    #povoando o accounts
    povoa_accounts($u);

    
    #Verifica tabela tine20_group_members, se existe o cadastro da relação
    #grupo / usuário, atualizando se necessário
    #monta array dos grupos que o usuário ja faz parte no banco
    $result = pg_query($dbcon, "SELECT group_id FROM tine20_group_members where account_id LIKE '$uuid'");
    if (!$result) {
       echo "Erro na consulta.";
       exit;
    }
    while ($row = pg_fetch_row($result)) {
       $grp_m[]=$row[0];
    }
    #faz um diff, para ver quais sao os grupos os quais o usuario faz parte no 
    #LDAP e ainda nao faz parte no banco
    if (!isset($grp_m))  $grp_m=array();
    $arr_g=array_diff($grp,$grp_m);
    #para cada grupo que ainda não tem a relação no tine20_group_members
    #realiza a inserção
    foreach ($arr_g as $value)
    {
	$sql="insert into tine20_group_members(group_id, account_id) values ('$value','$uuid');";
        fwrite($f_group_members,$sql . "\n");
        pg_query($dbcon,$sql)  or die ("erro na inserção de group_members\n");
    }
}   

//Cria entrada de usuário na tabela de Addressbook
function gerencia_addressbook($u)
{
    global $f_addressbook;
    global $dbcon;

    $id = sha1(mt_rand(). microtime());
    $email=$u["email"];
    $container_id=1;
    $private=1;
    $tid='n';
    $uri='';
    $url_home='';
    $n_family=substr($u["last_name"],0,255);
    $n_fileas=substr($u["first_name"] . " " . $u["last_name"],0,255);
    $n_fn=$n_fileas;
    $n_given=substr($u["first_name"],0,64);
    $org_unit=$u["org_unit"];
    $tel_work=substr($u["tel_work"],0,40);
    $creation_time=date('Y-m-d H:i:s');
    $is_deleted=0;
    $seq=0;
    $type="user";
   
    $result = pg_query($dbcon, "SELECT id FROM tine20_addressbook where email = '$email' and container_id = 1");

    if ( ! pg_num_rows($result) )
    {
        $sql="insert into tine20_addressbook(id,email,container_id,private,tid,url,url_home,n_family,n_fileas,n_fn,n_given,org_unit,tel_work,creation_time,is_deleted,seq,type) values ('$id','$email','$container_id','$private','$tid','$uri','$url_home','$n_family','$n_fileas','$n_fn','$n_given','$org_unit','$tel_work','$creation_time','$is_deleted','$seq','$type')";
//echo $sql;
        fwrite($f_addressbook,$sql . "\n");
        pg_query($dbcon,$sql) or die ("erro na inserção de addresbook\n");
    }
    else
    {
         $res=pg_fetch_assoc($result);
         $id=$res['id'];

    }

    return $id;
}

//povoa tabela tie20_accounts com informacoes de usuario
function povoa_accounts($u)
{
    global $f_accounts;
    global $dbcon;

    $id = $u["id"];
    $login_name = $u["login_name"];
    $login_shell = $u["login_shell"];
    $home_dir = $u["home_dir"];
    $status = "enabled";
    $primary_group_id = $u["primary_group_id"];
    $visibility = "displayed";
    $email = $u["email"];
    $first_name = $u["first_name"];
    $last_name = $u["last_name"];
    $full_name = $u["first_name"] . " " . $u["last_name"];
    $display_name = $full_name;
    $contact_id = $u["contact_id"];

    $result = pg_query($dbcon, "SELECT id FROM tine20_accounts where id = '" .$u["id"] ."'");

    if ( ! pg_num_rows($result) )
    {
        $sql="insert into tine20_accounts(id,login_name,login_shell,home_dir,status,primary_group_id,visibility,email,first_name,last_name,full_name,display_name,contact_id) values ('$id','$login_name','$login_shell','$home_dir','$status','$primary_group_id','$visibility','$email','$first_name','$last_name','$full_name','$display_name','$contact_id')";
//echo $sql;
        fwrite($f_accounts,$sql . "\n");
        pg_query($dbcon,$sql)  or die ("erro na inserção de account\n"); 
    }
    else
    {
         $res=pg_fetch_assoc($result);
         $id=$res['id'];
         $sql="update tine20_accounts set login_name='$login_name', login_shell='$login_shell', home_dir='$home_dir', status='$status', primary_group_id='$primary_group_id',visibility='$visibility',email='$email',first_name='$first_name',last_name='$last_name',full_name='$full_name',display_name='$display_name',contact_id='$contact_id' where id='$id'";
echo $sql;
    }
}

//cria entrada do usuario na tabela tine20_accounts
function povoa_expressomail_accounts($u)
{
    global $f_expressomail_accounts;
    global $dbcon;
    global $imap_host;
    global $imap_port;
    global $imap_ssl;
    global $smtp_host;
    global $smtp_port;
    global $smtp_ssl;
    global $smtp_auth;
    global $sieve_host;
    global $sieve_port;
    global $sieve_ssl;
    global $sieve_vacation;

    $id = sha1(mt_rand(). microtime());
    $user_id = $u["id"];
    $type = "system";
    $name = $u["email"];
    $email = $u["email"];
    $from = $u["full_name"];
    $sent_folder = "INBOX/Sent";
    $trash_folder = "INBOX/Trash";
    $drafts_folder = "INBOX/Drafts";
    $templates_folder = "INBOX/Templates";
    $has_children = 1;
    $delimiter = "/";
    $display_format = "html";
    $ns_personal = "INBOX/";
    $ns_other = "user/";
    $signature_position = "below";
    $created_by = $u["id"];
    $creation_time = date('Y-m-d H:i:s');
    $is_deleted = 0;
    $seq = 0;

    $result = pg_query($dbcon, "SELECT id,user_id FROM tine20_expressomail_account where user_id = '" .$u["id"] ."'");
    if ( ! pg_num_rows($result) )
    {
        $sql="insert into tine20_expressomail_account(id,user_id,type,name,host,email,\"from\",port,ssl,sent_folder,trash_folder,drafts_folder,templates_folder,has_children_support,delimiter,display_format,ns_personal,ns_other,signature_position,smtp_hostname,smtp_port,smtp_auth,smtp_ssl,sieve_hostname,sieve_port,sieve_vacation_active,sieve_ssl,creation_time,created_by,is_deleted,seq) values ('$id','$user_id','$type','$name','$imap_host','$email','$from','$imap_port','$imap_ssl','$sent_folder','$trash_folder','$drafts_folder','$templates_folder','$has_children','$delimiter','$display_format','$ns_personal','$ns_other','$signature_position','$smtp_hostname','$smtp_port','$smtp_auth','$smtp_ssl','$sieve_host','$sieve_port','$sieve_vacation','$sieve_ssl','$creation_time','$created_by','$is_deleted','$seq')";
        fwrite($f_expressomail_accounts,$sql . "\n");
        pg_query($dbcon,$sql)  or die ("erro na inserção de expressomail_account");
        return $id;
    }
    else
    {
         $dados=pg_fetch_assoc($result);
         $id=$dados["id"];
         $sql="update tine20_expressomail_account set user_id='$user_id',type='system',name='$name',host='$imap_host',email='$email',\"from\"='$from',port='$imap_port',ssl='none',sent_folder='$sent_folder',trash_folder='$trash_folder',drafts_folder='$drafts_folder',templates_folder='$templates_folder',has_children_support='1',delimiter='/',display_format='html',ns_personal='$ns_personal',ns_other='$ns_other',signature_position='above',smtp_hostname='$smtp_hostname',smtp_port='$smtp_port',smtp_auth='$smtp_auth',smtp_ssl='$smtp_ssl',sieve_hostname='$sieve_host',sieve_port='$sieve_port',sieve_vacation_active='0',sieve_ssl='$sieve_ssl',creation_time='$creation_time',created_by='$created_by',is_deleted='$is_deleted',seq='$seq' where id='$id'";
echo $sql;
//        fwrite($f_expressomail_accounts,$sql . "\n");
         return $dados["id"];
    }
}

//inclui preferências do usuário na tabela tine20_preferences
function povoa_preferences($expmailacc,$u)
{
    global $app;
    global $f_preferences;
    global $dbcon;
    
    $id_tinebase = sha1(mt_rand(). microtime());
    $id_expressomail = sha1(mt_rand(). microtime());
    $account_type = "user";
    $app_tinebase = $app["Tinebase"];
    $app_expressomail = $app["Expressomail"];
    $name_account_type = "user";
    $account_id = $u["id"];
    $name_tinebase = "locale";
    $name_expressomail = "defaultEmailAccount";
    $value_tinebase = "pt_BR";
    $value_expressomail = $expmailacc;
    $type="user";
    $personal_only=0;

    #ajusta pref locale do tinebase
    $result = pg_query($dbcon, "select id,value from tine20_preferences where account_id='$account_id' and application_id='$app_tinebase' and name='locale'");
    if (pg_num_rows($result) != 0)
    {
       $dados = pg_fetch_assoc($result);
       if ( $dados["value"] != $value_tinebase) 
       {
          $sql="update tine20_preferences set value='$value_tinebase' where id='" . $dados["id"] ."'";
          fwrite($f_preferences,$sql."\n");
          $result = pg_query($dbcon,"update tine20_preferences set value='$value_tinebase' where id='" . $dados["id"] ."'") or die("erro na atualização do prefence");
       }
    }
    else
    {
      $sql="insert into tine20_preferences(id,account_type, account_id, application_id, name, value, type,personal_only) values ('$id_tinebase','$account_type', '$account_id', '$app_tinebase', '$name_tinebase', '$value_tinebase', '$type', '$personal_only');";
      fwrite($f_preferences,$sql."\n");
      $result = pg_query($dbcon,$sql);
    }

    #ajusta pref defaultEmailAccount do ExpressoMail
    $result = pg_query($dbcon, "select id,value from tine20_preferences where account_id='$account_id' and application_id='$app_expressomail' and name='defaultEmailAccount'");
    if (pg_num_rows($result) != 0)
    {
       $dados = pg_fetch_assoc($result);
       if ( $dados["value"] != $value_expressomail){
          $sql="update tine20_preferences set value='$value_expressomail' where id='" . $dados["id"] ."'";
          fwrite($f_preferences,$sql."\n");
          $result = pg_query($dbcon,$sql) or die("erro na atualização do preferenc");
       }
    }
    else
    {
      $sql="insert into tine20_preferences(id,account_type, account_id, application_id, name, value, type,personal_only) values ('$id_expressomail','$account_type', '$account_id', '$app_expressomail', '$name_expressomail', '$value_expressomail', '$type', '$personal_only')";
      fwrite($f_preferences,$sql."\n");
      $result = pg_query($dbcon,$sql);
    }
}

function povoa($id)
{
   #obtem dados do usuario do LDAP
   $usu=obtem_info_ldap_usu($id); 
   #Monta a lista de grupos ao qual o usuario faz parte(se existir)
   if ( $usu["email"] != '')
   {
      if (isset($usu["grupos"]))
   	      $grupos=$usu["grupos"];
      else
	      $grupos=array();

      #povoando o addressbook, accounts, groups e group_members
     gerencia_grupos_users($usu, $grupos);

     #povoando o expressomail_accounts
     $id_em_acc = povoa_expressomail_accounts($usu);

     #povoando as preferencias
     povoa_preferences($id_em_acc,$usu);
   }
   else
     echo "erro sem email para $id\n";
}


$lines = file($arq_entrada);

foreach ($lines as $caixa)
{
  echo "\npovoando $caixa";
    $caixa = preg_replace('/\s/','',$caixa);
    povoa($caixa);
}

#fecha conexoes e arquivos
fclose($f_addressbook);
fclose($f_groups);
fclose($f_group_members);
fclose($f_accounts);
fclose($f_expressomail_accounts);
fclose($f_preferences);

ldap_close($ds);
pg_close($dbcon);
?>
O administrador desabilitou o acesso público de escrita.
Os seguintes usuários disseram Obrigado: Marcelo costa Toyama, Leonardo Christo

Respostas no Tópico: script de povoamento usuários LDAP no ExpressoBR

script de povoamento usuários LDAP no ExpressoBR Marcio Moriaki Ishikawa 09 Jul 2015 12:05
Moderadores: Emerson Faria Nobre