martes, 18 de octubre de 2016

Zimbra: Script PHP para la Creación de Cuentas mediante un archivo CSV


Tengo en producción un Servidor Debian 5 con Zimbra 6 y ayer me enviaron un listado de 300 usuarios para crear. Como obviamente es mucho trabajo hacerlo de manera manual, pués decidí crearme un script php que me ayude en esta tarea. La creación me tomó un par de horas (es que estoy oxidado con lo de programar :P ) pero al final el proceso manual me hubiese tomado mucho mas.

Lo especial de este script, por así decirlo, es que me permite agregar automáticamente una cuenta a una lista de correo e incluir algunos campos que no se cargan a través de un aprovisionamiento normal. Adicionalmente, con zimbraHideInGal logro que las cuentas no estén visibles en la GAL.

A continuación les copio el script, por si en algún momento, necesitan algo similar:
<?php
 ## Felix Jose Liberio Vera
 ## 09.06.2011

 ## Requerimientos
 ## apt-get install php5-cli
 
 ## Formato del Archivo CSV
 ## Nombres,Apellidos,Nombres y Apellidos,Email,Provincia,Cargo
 ## Felix Jose,Liberio Vera,Felix Jose Liberio Vera,fliberio@midominio.com.ec,Guayas,Instructor
 
 ## Comando a ejecutar
 ## zmprov ca iknaxio@midominio.com.ec renef2011 \
 ## zimbraCOSId 894b6819-a3e0-4e43-8e41-91fd01390720 \
 ## zimbraHideInGal TRUE \
 ## description 'Ingeniero de Infraestructura' \
 ## displayName 'Felix Liberio Vera' \
 ## givenName 'Felix' \
 ## sn 'Liberio Vera'
 
 $fila = 0;
 $filas_ok = 0;
 $debug = FALSE;
 $filename = "";
 $defaultpass = "ecualug2011";
 $defaultlist = "instructores@midominio.com.ec";
 $zimbraCOSId = "894b6819-a3e0-4e43-8e41-91fd01390720"; # Clase de Servicio 'instructores'
 $zimbraHideInGal = TRUE;
 
 if($argc > 1){
  $filename = $argv[1];
  
  if($argc == 3 && $argv[2] == "-D"){
   $debug = TRUE;
  }
 }
 else{
  echo "\nUsage: php ca_instructores.php <filename.csv> [-D]\n";
  echo "-D Activa el debug\n";
  echo "\nIknaxio 2011\n\n";
  exit(1);
 }
 
 function trim_value(&$value) { 
  $value = trim($value); 
 }

 if (($gestor = fopen($filename, "r")) !== FALSE) {
  while (($datos = fgetcsv($gestor, 1000, ",")) !== FALSE) {
   
   if(count($datos)>=6){
    array_walk($datos, 'trim_value');
    
    $str="zmprov ca ".$datos[3]." $defaultpass ".
     "zimbraCOSId $zimbraCOSId ".
     "zimbraHideInGal ".($zimbraHideInGal?"TRUE":"FALSE")." ".
     "description '".$datos[5]."' ".
     "displayName '".$datos[2]."' ".
     "givenName '".$datos[0]."' ".
     "sn '".$datos[1]."' ".
     "st '".$datos[4]."' ";
    
    exec($str);
    echo(($debug?$str:$datos[3])."\n");
    
    $str="zmprov adlm $defaultlist ". $datos[3];
    
    if($debug){ echo($str."\n"); }
    exec($str);
    
    $filas_ok++;
   }
   else {
    echo "No se pudo procesar el registro ". ($fila + 1) ."\n";
   }
    
   $fila++;
  }
 }
 else{
  echo "No se encontró el archivo.\n";
  exit(1);
 }
 
 echo "Se procesaron $filas_ok registros de $fila.\n";
 fclose($gestor);
?>
Saludos :D

ACTUALIZACION: Aunque de pronto a algunos les parecerá obvio, para poder usar el script se debe hacer lo siguiente:
  • Instalar el paquete de linea de comandos de php
    apt-get install php5-cli
    
  • Crear un archivo al que podemos llamar ca_batch.php, yo lo cree en el directorio /root porque estaba en ese momento logueado como root y dentro de este archivo copiar todo el código que escribí más arriba ;)
    nano /root/ca_batch.php
    
  • Creamos un archivo de prueba en formato CSV, al que yo voy a llamar users14062011.csv
    nano /root/users14062011.csv
    
  • Y colocamos dentro lo siguiente:
    Jaqueline,Lopez Vargas,Jaqueline Lopez Vargas,jlopez@midominio.com.ec,Guayas,Capacitador
    Ivette,Lozano Otero,Ivette Lozano Otero,ilozano@midominio.com.ec,Guayas,Capacitador
    
  • Para ejecutar el script, ingresamos como usuario zimbra
    su - zimbra
    
  • Y lo ejecutamos
    cd /root
    php ca_batch.php users14062011.csv
    
  • Y listo

"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio