Manual Zimbra parte IV: Comandos en Consola, Migración de Servidores de Correo (cuentas y buzones) hacia Zimbra 8.7

Taller 7: Comandos en consola en Zimbra

Tabla de contenidos

7.1.- Zimbra CLI Comandos

CLI Description
ldap Start, stop, or find the status of zimbra LDAP
ldapsearch Perform a search on an LDAP server
logmysqladmin Send myslqadmin commands to the logger mysql
mailboxd Start, stop, find the status of the mailboxd server
mysql Enters interactive command-line MySQL session with the mailbox mysql
mysql.server Start, stop the SQL instance for the mailboxpackage
mysqladmin Send admin commands to MySQL
postconf Postfix command to view or modify the postfixconfiguration
postfix Start, stop, reload, flush, check, upgrade-configuration of postfix
qshape Examine postfix queue in relation to time andsender/recipient domain
zmaccts Lists the accounts and gives the status ofaccounts on the domain
zmamavisdctl Start, stop, restart, or find the status of theAmavis-D New
zmantispamctl Start, stop, reload, status for anti-spam service
zmantivirusctl Start, stop, reload, status for the anti-virus service
zmapachectl Start, stop, reload, or check status of Apacheservice (for spell check)
zmarchive Config Command to view, modify, or configure archiving
zmarchivectl Start, stop, reload, status for archiving
zmarchivesearch Search archives on the account
zmauditswatchctl Start, stop, restart, reload, status of theauditswatch
zmbackup Performs full backups and incremental backupsfor a designated mail host.
zmbackupabort Stops a backup that is in process.
zmbackupquery Find a specific full backup set
zmblobchk Check consistency of the Zimbra blob store
zmcalchk Check consistency of appointments andattendees in the Zimbracalendar
zmcertmgr Manage self-signed and commercial certificates
zmclamdctl Start, stop, or find the status of Clam AV
zmcleaniplanetics Clean iPlanet ICS calendar files
zmcontrol (Start/Stop Service) Start, stop, status of the Zimbra servers. Also can use to find the Zimbra version installed.
zmconvertctl Start, stop, the conversion server or find thestatus of the converted attachments conversion/indexing
zmdumpenv General information about the serverenvironment is displayed
zmgsautil Create, delete the GAL sync account and initiate manual syncs.
zmhostname Find the hostname of the Zimbra server
zmhsm Start, stop and status of a HSM session.
zmitemdatafile Extracts and packs tgz files that ZCS uses forREST import/export
zmjava Execute Java with Zimbra-specific environmentsettings
zmldappasswd Changes the LDAP password
zmlicense View and install your Zimbra license
zmlmtpinject Testing tool
zmlocalconfig Used to set or get the local configuration of a Zimbra server
zmloggerctl Start, stop, reload, or find the status of the Zimbra logger service
zmloggerhostmap Used to manually map a DNS hostname to azmhostname.
zmlogswatchctl Start, stop, status of the swatch that is monitoring logging
zmmailbox Performs mailbox management tasks
zmmailboxdctl Start, stop, reload, or find the status of themailbox components (mailboxd, MySQL, convert)
zmmailboxmove (Move Mailbox) Used to move selected mailboxes from one Zimbra server to another.
zmmboxsearch (Cross Mailbox Search) Search across mailboxes to find messages andattachments
zmmetadump Support tool that dumps an item’s metadata in ahuman-readable form
zmmtaconfigctl Start, stop, or find the status of the MTAconfiguration daemon
zmmtactl Start, stop, or find the status of the MTA
zmmypasswd Trace messages
zmmypasswd Change MySQL passwords
zmmysqlstatus Status of mailbox SQL instance
zmperditionctl Start, stop, or find the status of the perdition IMAP proxy
zmplayredo Performs data restore using backed upsnapshots taken periodically.Users who use snapshots to backup and restore their information from a standby site use this command.
zmprov (Provisioning) Performs all provisioning tasks in Zimbra LDAP, including creating accounts, domains, distribution lists and aliases
zmproxyconfgen Generates configuration for the nginx proxy
zmproxyctl Start, stop, restart, and find the status of the IMAP proxy service
zmproxypurge Purges POP/IMAP routing information from oneor more memcached servers
zmpython Ability to write Python scripts that access Zimbra Java libraries. It sets the ZCS class path and starts the Jython interpreter.
zmredodump Support tool for dumping contents of a redologfile for debugging purposes
zmrestore Performs full restores and incremental restoresfor a designated mail host
zmrestoreldap Restore accounts from the LDAP backup
zmrestoreoffline (Offline Restore) Performs full restore when the Zimbra server (i.e., the mailboxd process) is down
zmsaslauthdctl Start, stop, or find the status of saslauthd(authentication)
zmschedulebackup Schedule backups and add the command to your cron table
zmshutil Used for other zm scripts, do not use
zmskindeploy Deploy skins for accounts from the command line
zmsoap Print mail, account, and admin information in the SOAP format
zmspellctl Start, stop, or find the status of the spell checkserver
zmsshkeygen Generate Zimbra’s SSH encryption keys
zmstat-chart Generate charts from zmstat data collected in adirectory
zmstat-chart-config Generate an .xml file with data included from the account setup
zmstat-chart-config Outputs an XML configuration that describes the current state of the data gathered from zmstat-chart to generate charts on the

Consola de administración
CLI Descripción
zmstatctl Start, stop, check status, or rotate logs of zmstat data collectors
zmstorectl Start, stop, or find the status of Zimbra storeservices
zmswatchctl Start, stop, or find the status of the Swatchprocess, which is used in monitoring
zmsyslogsetup Used to setup system log config file
zmthrdump Initiate a thread dump and save the data to a filewith a timestamp
zmtlsctl Set the Web server mode to the communication protocol options: HTTP, HTTPS or mixed
zmtrainsa Used to train the anti-spam filter to recognizewhat is spam or ham
zmtzupdate Provides mechanism to process timezonechanges from the command line
zmupdateauthkeys Used to fetch the ssh encryption keys created by zmsshkeygen
zmvolume Manage storage volumes on your Zimbra Mailbox server
zmzimletctl Deploy and configure Zimlets

Comandos de Servicio

su - zimbra
  • Verificar el estado de todos los servicios en zimbra
zmcontrol status 
  • Detener todos los servicios
zmcontrol stop
  • Iniciar todos los servicios
zmcontrol start
  • Reiniciar todos los servicios
zmcontrol restart
  • Ver la versión de zimbra y el parche actual
zmcontrol -v

7.2.- Comandos individuales de servicio (start, stop, restart, status)

  • Ejemplo: Detenemos todos los servicios e iniciaremos uno a uno
zmcontrol stop
zmcontrol status
  • Iniciar LDAP server
ldap start
zmcontrol status
  • Iniciar MySQL Server
mysql.server start
  • Iniciar zmconfigd
zmconfigdctl start
  • Iniciar MTA (postfix, saslauthd)
zmmtactl start
  • Iniciar Amavis, Antivirus y AntiSpam (amavis, spamassassin, clamav)
zmamavisdctl start
zmcontrol status
  • Iniciar Mailbox (webmail, panel de administracion, servidores imap y pop3, servidores de filtros)
zmmailboxdctl start
  • Iniciar spell (servidor de ortografía)
    zmapachectl start
  • Iniciar monitoreo
    zmswatchctl start
  • Iniciar estadísticas
zmstatctl start
  • Iniciar Logger (logs del sistema)
zmlogswatchctl start
  • **Reiniciar servicio antivirus+*
zmantivirusctl restart
  • Reiniciar servicio antispam
zmantispamctl restart
  • Iniciar servicio de memcache
zmmemcachedctl start
  • Iniciar servicio dkim
zmopendkimctl start
  • Iniciar proxy
zmproxyctl start
  • Ver el estado de los servicios
zmcontrol status

7.3.- Comandos de la consola de administración

zmcontrol
zmprov
zmlocalconfig

7.3.1.- zmprov: Comando de administración de zimbra

  • Loguearse primero como usuario zimbra
su - zimbra
  • Lista la ayuda general de zmprov
zmprov help
  • Listar la ayuda para gestionar las cuentas
zmprov help account
  • Consola Interactiva
zmprov
prov
  • Ver ayuda de cuentas
prov> help account
  • Salir de la consola interactiva
prov> quit

7.3.1.1.- Cuentas

  • Obtener listado de todas las cuentas del servidor (todos los dominios)
zmprov -l gaa
  • Obtener todas las cuentas de administración
zmprov -l gaaa
  • Obtener información de una sola cuenta
zmprov -l ga tuxito@dominio.com 
  • Cuentas de un dominio específico
zmprov -l gaa dominio.com
  • Detalle de cuentas de un dominio especifico
zmprov -l gaa -v dominio.com
  • Detalle de cuentas de un dominio especifico con Cuenta, Nombre y Quota
zmprov -l gaa -v dominio0.com | grep -e zimbraMailDeliveryAddress -e displayName -e zimbraMailQuota |sed -e "s/zimbraMailDeliveryAddress/Cuenta/" -e "s/displayName/Nombre/" -e "s/zimbraMailQuota/Quota/"   
  • Crear una cuenta, con cos default
zmprov ca pepito@dominio.com Pepito1. displayName "Pepito Perez"
  • Crear un usuario con un caso específico ejemplo: Gerente
    cos=`zmprov gc gerente | grep zimbraId:|cut -d ' ' -f2`
    zmprov ca juanito@dominio.com Juanito1. displayName "Juanito Martinez" zimbraCOSId $cos
    
    
  • Crear una cuenta con detalle
zmprov ca windozero@dominio.com Windozero1. cn 'Windozero Luser' displayName 'WindozeroLuser' zimbraCOSId $cos

7.3.1.2.- Modificar opciones de una cuenta

  • Cambiar de password de una cuenta
zmprov sp usuario1@dominio.com passnuevo
  • Modificar un atributo de una cuenta
zmprov ma usuario1@dominio.com displayName "Luser Noob 1"

Nota: Se puede modificar cualquier atributo del usuario para la lista de atributos ejecutar

zmprov -l ga usuario1@dominio.com

7.3.1.3.- Busqueda de cuentas

  • Búsqueda por atributos
    Se puede buscar las cuentas por un atributo en común zmprov sa parametr

  • Buscar todas las cuentas activas

zmprov sa zimbraAccountStatus=active
  • Buscar todas las cuentas bloqueadas
zmprov sa zimbraAccountStatus=locked
  • Buscar en cuales listas se encuentra una cuenta
zmprov gam cuenta@dominio.com
  • Buscar todos las cuentas que están de vacaciones
zmprov -l gaa -v ofipymes.com |grep -e zimbraMailDeliveryAddress  -e displayName -e zimbraPrefOutOfOfficeUntilDate |grep zimbraPrefOutOfOfficeUntilDate -B 2

7.3.1.4.- Borrar una cuenta

zmprov da usuario3@dominio.com

7.3.1.5.- Creación de Cuentas en forma masiva

  • Nos logueamos como root
su -
  • Creamos nuestro directorio de scrips
mkdir /opt/zimbra/scripts
  • Entramos al directorio
cd /opt/zimbra/scripts
  • Primero creamos un archivo con la lista de cuentas y sus respectivos COS
vim usuarios.txt
usuario1@dominio.com,Usuario1.,Usuario Prueba 1,default
usuario2@dominio.com,Usuario2.,Usuario Prueba 2,default
usuario3@dominio.com,Usuario3.,Usuario Prueba 3,gerente
  • Creamos ahora un script que genere un archivo para la creación de usuario
    vim crea_usuarios.php
    
    
    #!/usr/bin/php
    
    <?php
    
    // Obteniendo los COS del sistema y sus Ids 
    exec("/opt/zimbra/bin/zmprov gac",$arrcos);
    $cos = array();
    foreach($arrcos as $cos_name){
            $cos_name  = chop ($cos_name);
            $cosid=`/opt/zimbra/bin/zmprov gc $cos_name | grep ^zimbraId:`;
            $cosid = trim(str_replace("zimbraId: ","",$cosid));
            $cos[$cos_name]=$cosid;
    }
    
    //print_r($cos); 
    // Leyendo los archivos de Usuarios 
    $userfile=file("usuarios.txt");
    // Recorriendo array de usuarios y creando las cuentas 
    foreach($userfile as $userline){
        $userline=trim(chop($userline));
        if(!empty($userline)){
            $user = explode(",",$userline);
            echo("ca $user[0] $user[1] displayName '$user[2]' zimbraCOSId ".$cos[$user[3]]."\n"); 
        }
    }
    ?>
    
    • Ejecutamos el script, para eso necesitamos php
yum -y install  php56w-cli
chmod 755 crea_usuarios.php
crea_usuarios.php> cuentas.zm
  • Creamos los usuarios con zmprov
/opt/zimbra/bin/zmprov < cuentas.zm

7.3.1.6.- Listas de correo

  • Buscar todas las listas, y por dominio
zmprov gadl
zmprov gadl dominio.com
  • Crear una lista
zmprov cdl lista@dominio.com
  • Ver una lista específica
zmprov gdl lista@dominio.com
  • Encontrar todas las listas de un dominio y sus miembros
for i in $( zmprov gadl dominio0.com | grep -v abuse | grep -v postmaster | sort ) ; do echo `zmprov gdl $i | grep -e 'mail: ' -e 'zimbraMailForwardingAddress: ' | sed 's/mail/Lista/' | sed 's/zimbraMailForwardingAddress: //'` ; done ;
  • Agregar un miembro a la lista
zmprov adlm lista@dominio.com cuenta@dominio.com
  • Remover un miembro de la lista
zmprov rdlm lista@dominio.com cuenta@dominio.com
  • Borrar una lista
zmprov ddl lista@dominio.com

7.3.2.- Obtener y modificar valores de configuracion

  • Ver los valores de configuración del servidor
zmlocalconfig
  • Ver los valores de configuración mostrando los password
zmlocalconfig -s
  • Mostrar el password de mysql
zmlocalconfig -s | grep mysql_root_password
  • Mostrar el password de ldap
zmlocalconfig -s | grep zimbra_ldap_password
  • Obtener todos los parámetros de configuración generales
zmprov gacf | less
  • **Modificar un valor global de configuración **
zmprov mcf zimbraMtaMaxMessageSize 20240000
  • Obtener los parámetros de configuración de un servidor
zmprov gs `zmhostname` | less
  • Modificar el valor de configuración de un servidor
zmprov ms `zmhostname` zimbraImapNumThreads 1000

Siempre que se modifica un valor de zimbra hacer un restart del servidor o del servicio afectado***

7.4.- Buzones (zmmailbox)

  • Entrar a la consola interactiva
zmmailbox
mbox> 
  • Ver ayuda general del comando
zmmailbox help
  • **Ver ayuda de las cuentas **
zmmailbox help account
  • Ver ayuda de los mensajes
zmmailbox help message

7.4.1.- Tamaño de un buzón

  • Ver tamaño ocupado del buzón
zmmailbox -z -m cuenta@dominio.com gms
  • Ver el tamaño de las quotas asignadas y ocupadas de todos los buzones
zmprov gqu `zmhostname`|awk {'print " "$3" "$2" "$1'}
  • Revisar mensajes por carpetas en el buzón
zmmailbox -z -m cuenta@dominio.com gaf
  • Borrar una carpeta completa de un buzón
zmmailbox -z -m cuenta@dominio.com emptyFolder Junk
  • **Importar mensajes de una carpeta Maildir existente en el INBOX **
echo addMessage /INBOX /path/to/Maildir/cur | /opt/zimbra/bin/zmmailbox -z -m cuenta@dominio.com
  • Buscar un mensaje
zmmailbox -z -m cuenta@dominio.com search -t message "prueba"
  • Buscar un mensaje en todas las cuentas
zmprov -l gaa |awk '{print "zmmailbox -z -m "$1" search \"linux\" "}' |sh -v
linux es la palabra de búsqueda
  • Buscar correos anteriores a una fecha: (formato mes/dia/año)
zmmailbox -z -m cuenta@dominio.com search -t message "in:INBOX (before: 07/28/13)"
  • Obtener contenido de un correo
zmmailbox -z -m cuenta@dominio.com  gm  21940

21940 es el ID del mensaje

  • Ver contactos:
zmmailbox -z -m cuenta@dominio.com gact | less
  • **Vaciar casilla usuario: **
zmmailbox -z -m accoun@domain.com ef "/Inbox"
  • Ver correos de una carpeta
zmmailbox -z -m cuenta@dominio.com search -l 100 "in:Inbox"
  • Ver metadata de un correo:
zmmetadump -m cuenta@dominio.com -i 26747
  • Borrar un mensaje
zmmailbox -z -m cuenta@dominio.com dm 4543

4543 es el id del mensaje

  • Borrar un mensaje en todas las cuentas (tarea)

7.5.- Migración de cuentas y correos

Recomendaciones

  • Para migrar desde un servidor de correo existente se debe tener en cuenta las siguientes
    recomendaciones.

    • Instalar Zimbra en un nuevo servidor (físico o virtual), de esta forma no se afecta el servicio y si la migración es muy pesada, puede seguir en producción el servidor antiguo hasta que se termine de migrar y pase a producción el nuevo servidor.
    • Crear primero los COS y luego crear los usuarios con sus respectivos COS.
    • Usar para la migración de usuarios, scripts que permitan la creación masiva de usuarios o en su defetecto usar los utilitarios del panel de administración
    • Si el servidor antiguo tenía contraseñas shadow o LDAP, se pueden preservar estas contraseñas, si no habrá que crear nuevas claves.
    • En la creación de nuevas claves NO USAR contraseñas débiles porque se exponen a ser
      crakeadas por bots. Para esto es preferente usar opciones de fortaleza de contraseña
      ej: 8 caracteres mínimo, 1 mayúscula, 1 número y 1 signo de puntuación
    • Migrar las capetas de correo del servidor y de las estaciones que tienen los correos
      descargados.

7.5.1 Creación de Cuentas en forma masiva

Ejecutamos el procedimiento en 7.3.1.5

7.5.2 Migración de passwd y shadow

  • Loguearse como root
useradd -md /home/usuario1 usuario1
passwd usuario1
123456

useradd -md /home/usuario2 usuario2
passwd usuario2
123456

  • Crear los usuarios en zimbra como anteriormente se ha descrito
/opt/zimbra/bin/zmprov ca usuario1@dominio.com Usuario1.1 
/opt/zimbra/bin/zmprov ca usuario2@dominio.com Usuario2.1
  • Crear un script para la migración de las contraseñas
    vim cambiar_password.pl
    
    #!/usr/bin/perl
    
    # Usage: as root   # ./cambiar_password.pl /etc/shadow > shadow.zm
    
    #        as zimbra # zmprov < shadow.zm
    
    $domain="dominio.com";
    
    while(<>) {
    
        chomp;
    
        my ($uname,$pass) = split(/:/);
    
        print qq{ma $uname\@$domain userPassword '{crypt}$pass'\n};
    
        print qq{\n};
    
    }
    
  • Ejecutar el script para generar el archivo que cambia las contraseñas

chmod 755 cambiar_password.pl
./cambiar_password.pl /etc/shadow > shadow.zm
  • Editar el shadow.zm y borrar todas las cuentas que no sean de zimbra
vim shadow.zm
  • Ejecutar el cambio las contraseñas
/opt/zimbra/bin/zmprov < shadow.zm
  • Probar los usuarios en zimbra
usuario1@dominio.com
usuario2@dominio.com
  • Borrar los usuarios Linux
userdel -r usuario1
userdel -r usuario2

7.5.3 Obligar que los usuarios pongan una nueva contraseña

vim /opt/zimbra/scripts/forcenewpass
#!/bin/bash
USERS=`/opt/zimbra/bin/zmprov -l gaa | egrep -v "(admin@|spam.|ham.|virus|galsync)"` 
for u in $USERS
do 
  echo "ma $u zimbraPasswordMustChange TRUE" >>/tmp/usersnpass
done 

/opt/zimbra/bin/zmprov < /tmp/usersnpass
chmod 755 /opt/zimbra/scripts/forcenewpass
opt/zimbra/scripts/forcenewpass
  • Loguearse con usuario1 y usuario2

7.5.4 Generación de contraseñas aleatorias

En el caso de que no confiamos de las contraseñas anteriores de los
usuarios o no las conocemos una alternativa es generar contraseñas
aleatorias y luego comomicarselo al usuario enviándole un correo
al sistema de correo que será migrado.

$> vim genera_claves.php
#!/usr/bin/php 
<?php
exec("/opt/zimbra/bin/zmprov -l gaa | egrep -v '(admin@|ham.|virus.|spam.|galsync.)'",$users);
foreach($users as $user){
        $user = trim(chop($user));
        $puser = randomPassword();
        exec("/opt/zimbra/bin/zmprov sp $user $puser");
        echo "$user,$puser\n";    
}

function randomPassword() {
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    $pass = array(); //remember to declare $pass as an array
    $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }   
    return implode($pass); //turn the array into a string
}
?>
  • Ejecutamos el script de generación en el servidor zimbra
$> chmod 755 genera_claves.php
$> ./genera_claves.php > claves.txt
  • Ahora copiamos el archivo claves.txt en el servidor que se va a migrar
$> scp claves.txt IPservidorAntiguo
  • Nos logueamos al servidor antiguo y enviamos los correos

  • Descargar librería PHPMailer, descomprimir y renombrar

wget --no-check-certificate https://storage.googleapis.com/google-code-archive-downloads/v2/apache-extras.org/phpmailer/PHPMailer_5.2.4.tgz 
tar -zxvf PHPMailer_5.2.4.tgz
mv PHPMailer_5.2.4 phpmailer
vim /etc/php.ini
889: date.timezone = America/Lima
  • Crear el script de envío y editar los valores

    vim envia_claves.php
    
    #!/usr/bin/php
    <?php
    $claves = file("claves.txt");
    
    require 'phpmailer/class.phpmailer.php';
    
    foreach($claves as $clave){
        if(!empty($clave)){
            $clave = chop(trim($clave));
            $cl = explode(",",$clave);
            $mail = new PHPMailer;
            $mail->IsSMTP();                                      // Set mailer to use SMTP
            $mail->Host = 'localhost';  // Specify main and backup server
            $mail->SMTPAuth = false;                               // Enable SMTP authentication
            //$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted
    
            $mail->From = 'admin@dominio0.com';
            $mail->FromName = 'Administrador de correo';
            $mail->AddAddress($cl[0]);  // Add a recipient
            $mail->IsHTML(true);        // Set email format to HTML
            $mail->Subject = 'Nueva clave de correo para el servidor Zimbra';
            $mail->Body     = "Su clave nueva de correo para el servidor Zimbra\n".
                       "podra ser usada desde el d&iacute;a XX/YY/ZZZZ y es\n".
                       "$cl[1]";
    
            if(!$mail->Send()) {
               echo 'Message could not be sent.';
               echo 'Mailer Error: ' . $mail->ErrorInfo;
               print_r($mail);
               exit;
            }
    
            echo "Message has been sent\n";
        }
    }
    
chmod 755 envia_claves.php
./envia_claves.php

7.5.5.- Migración de buzones maildir

  • Debemos copiar el directorio de los usuarios ej: /home del servidor antiguo al servidor zimbra y nombrarlo con el nombre del dominio de correo
scp -r /home IPServidorZimbra:/opt/zimbra/scripts/dominio.com
  • Ahora generamos un script para importar los directorios Maildir
    vim /opt/zimbra/scripts/migramaildir
    
    #!/bin/bash
    
    # Postfix virtual transport -> Zimbra mailbox migration
    # written by NERvOus (http://www.nervous.it) - 2009-12-25
    
    # base folder where msgs will be imported
    BFOLDER="old-mbox"
    ZMMBOX="/opt/zimbra/bin/zmmailbox"
    BDIR=$(pwd)
    
    echo You must run $0 from inside /var/mail/virtual directory
    echo $0 expects to find the mailboxes in the current path!
    echo The structure of maildirs must be as follows:
    echo 
    echo "domain/username/{cur|new|tmp}"
    echo "domain/username/subfolder1/{cur|new|tmp}"
    echo "domain/username/subfolder2/{cur|new|tmp}"
    echo ...
    echo 
    echo All folders will be stored in a subfolder called $BFOLDER
    echo The hierarchy of subfolders will be maintained under $BFOLDER.
    echo 
    echo Press Enter to start, CTRL+C to abort.
    read
    
    # handle folders with a space inside, they are more common than you may
    # think
    IFS='
    '
    
    for p in $(find . -type d -name cur); do
            DOMAIN=`echo $p | cut -d'/' -f2`
            UNAME=`echo $p | cut -d'/' -f3`
            DIRNAME=`echo $p | cut -d'/' -f4`
            # this may fail, if folder already exists. Who cares. Ignore the
            # error.
            echo createFolder /$BFOLDER | $ZMMBOX -z -m $UNAME@$DOMAIN
            if [ "$DIRNAME" == "cur" ]; then
                    echo Importing INBOX folder for $UNAME@$DOMAIN from $BDIR/$DOMAIN/$UNAME/ 1>&2
                    # we are importing the top level folder
                    echo addMessage /$BFOLDER $BDIR/$DOMAIN/$UNAME/cur | $ZMMBOX -z -m $UNAME@$DOMAIN
                    echo addMessage /$BFOLDER $BDIR/$DOMAIN/$UNAME/new | $ZMMBOX -z -m $UNAME@$DOMAIN
            else
                    DIRNAME=$(echo $DIRNAME | sed -e 's/\/cur$//')
                    echo Importing folder $DIRNAME for $UNAME@$DOMAIN from $BDIR/$DOMAIN/$UNAME/$DIRNAME 1>&2
                    echo createFolder \'/$BFOLDER/$DIRNAME\' | $ZMMBOX -z -m $UNAME@$DOMAIN
                    echo addMessage \'/$BFOLDER/$DIRNAME\' \'$BDIR/$DOMAIN/$UNAME/$DIRNAME/cur\' | $ZMMBOX -z -m $UNAME@$DOMAIN
                    echo addMessage \'/$BFOLDER/$DIRNAME\' \'$BDIR/$DOMAIN/$UNAME/$DIRNAME/new\' | $ZMMBOX -z -m $UNAME@$DOMAIN
            fi
    done
    
chmod 755 /opt/zimbra/scripts/migramaildir
cd /opt/zimbra/scripts
migramaildir 

7.5.6.- Migración de Mailbox con Imapsync

Para migrar las cuentas de correo, todas las claves de usuario deben ser conocidas, si esto no es así cambiar las claves de todos los usuarios con una contraseña común y luego restaurar las contraseñas; si éstas se encuentran almacenadas en shadow, caso contrario asignar nuevas contraseñas a los usuarios.
Usaremos imapsync para la migración de servidor a servidor
Para la migración de clientes se crea la cuenta en el zimbra, luego se va máquina por máquina ydesde el programa cliente del usuario se copian los correos vía protocolo Imap al servidor Zimbra.

7.5.6.1.- Instalación de Imapsync

1 .- Instalar epel

yum -y install epel-release

2.- Instalar imapsync

$> yum -y install imapsync

7.5.6.2.- Creación archivo con lista de usuarios y contraseñas

su - 
cd /opt/zimbra/scripts
mv usuarios.txt usuarios-cuentas.txt
vim usuarios.txt

tuxito;Tuxito1.
gerentazo;Gerentazo1.
usuario1;Usuario1.
usuario2;Usuario2.

  • Cambiar contraseñas
su - zimbra
zmprov sp tuxito@dominioX.com Tuxito1.
zmprov sp gerente@dominioX.com Gerente1.
zmprov sp usuario1@dominioX.com Usuario1.
zmprov sp usuario2@dominioX.com Usuario2.
$> exit
$> vim migra_correos
#!/bin/bash 
logfile="logusuarios.txt"
host1=192.168.120.X
#host1 es el servidor de correos antiguo
host2=192.168.120.Y
#host2 es el zimbra punche 
domain=dominioX.com
#domain is where email account is 
#everything after @ symbol 
###### Do not modify past here 
#######################################
date=`date +%X_-_%x`
echo "" >> $logfile
echo "------------------------------------" >> $logfile
echo "IMAPSync started..  $date" >> $logfile
echo "" >> $logfile
    { while IFS=';' read  u1 p1; do
#           si el login en forma de correo 
            user=$u1"@"$domain
#           si el login es en forma de cuenta
            user=$u1
            echo "Syncing User $user" 
            date=`date +%X_-_%x`
            echo "Start Syncing User $u1" 
            echo "Starting $u1 $date" >> $logfile
            imapsync --buffersize 8192000 --noauthmd5 --nosyncacls --subscribe --syncinternaldates \
            --host1 $host1 --authmech1 PLAIN --user1 $user --password1 "$p1" --ssl1 --host2 $host2 \
            --user2 $user --password2 "$p1" --ssl2 --authmech2 PLAIN
            date=`date +%X_-_%x`
            echo "User $user done" 
            echo "Finished $user $date" >> $logfile
            echo "" >> $logfile
            done ; } < usuarios.txt
date=`date +%X_-_%x`
echo "" >> $logfile
echo "IMAPSync Finished..  $date" >> $logfile
echo "------------------------------------" >> $logfile
chmod 755 migra_correos                   
./migra_correos    

7.5.6.3.- Migrar de Google Apps

Verificar que este activado el IMAP en las cuentas de Google Apps

Migrate Google Apps to Zimbra

**Probar la migración de una cuenta**
```
imapsync --host1 imap.gmail.com --user1 user@yourdomain.com --password1 P@ssword --host2 zimbra.domain.com --user2 user@yourdomain.com --password2 P@ssword --syncinternaldates --ssl1 -ssl2 --noauthmd5 --split1 100 --split2 100 --exclude All Mail --useheader 'Message-Id' --dry --justfolders
```

Automatizar el proceso con el script anterior

7.5.7.- Migración de contactos entre zimbra a zimbra

Para migrar los contactos de correos estos deben subirse al servidor por medio de curl.
Veremos un ejemplo de migración de contactos de un servidor Zimbra a otro Zimbra

vim contactos.txt
(usuario,clave)  
tuxito,tuxito  
windozero,windozero  
vim migra_contatos
    #!/usr/bin/php
    <?php
    $file = file("contactos.txt");
    $server1 = "192.168.130.X";
    $server2 = "192.168.130.Y";
    foreach ( $file as $lineuser ) {
            $lineuser = trim(chop($lineuser));
            $userdata = explode(",",$lineuser);
            if(!empty($userdata)){
                    echo ("wget --user $userdata[0] --password $userdata[1] http://$server1/zimbra/user/$userdata[0]/Emailed%20Contacts.csv --no-check-certificate \n");
                    exec ("wget --user $userdata[0] --password $userdata[1] http://$server1/zimbra/user/$userdata[0]/Emailed%20Contacts.csv --no-check-certificate");
                    echo ("curl -u $userdata[0]:$userdata[1] --upload-file /opt/zimbra/scripts/Emailed\ Contacts.csv http://$server2/home/$userdata[0]/Emailed%20Contacts?fmt=csv \n" );
                    exec ("curl -u $userdata[0]:$userdata[1] --upload-file /opt/zimbra/scripts/Emailed\ Contacts.csv http://$server2/home/$userdata[0]/Emailed%20Contacts?fmt=csv " );
                    exec ("rm -fr Emailed\ Contacts.csv");
            }

    }

    ?>

chmod 755 migra_contactos
./migra_contactos

7.5.8.- Migrar de Zimbra a Zimbra

7.5.8.1.- Migrar cuentas y contraseñas de Zimbra a Zimbra (funciona solo con los mismos dominios)

$> vim /opt/zimbra/scripts/export-zimbra-users
#!/bin/sh

#Hapus Layar
clear

echo -e "###################################################################################"
echo -e "# Zimbra export-acc-zcs.sh ver 0.0.2                                              #"
echo -e "# Skrip untuk export account Zimbra berikut profile dan password                  #"
echo -e "# Masim 'Vavai' Sugianto - vavai@vavai.com - http://www.vavai.com                 #"
echo -e "# Untuk saran dan pertanyaan silakan menggunakan Milis Komunitas Zimbra Indonesia #"
echo -e "# Link Komunitas : http://www.zimbra.web.id - http://www.opensuse.or.id           #"
echo -e "###################################################################################"

# /* Variable untuk bold */
ibold="\033[1m""\n===> "
ebold="\033[0m"

# /* Parameter */
echo ""
echo -n "Enter Domain Name (ex : vavai.com) : "
read NAMA_DOMAIN
echo -n "Enter path folder for exported account (ex : /home/vavai/) : "
read FOLDER

# /* Membuat file hasil export dan mengisi nama domain */
NAMA_FILE="$FOLDER/zcs-acc-add.zmp"
LDIF_FILE="$FOLDER/zcs-acc-mod.ldif"

rm -f $NAMA_FILE
rm -f $LDIF_FILE

touch $NAMA_FILE
touch $LDIF_FILE

echo "createDomain $NAMA_DOMAIN" > $NAMA_FILE

# /* Check versi Zimbra yang digunakan */
VERSION=`su - zimbra -c 'zmcontrol -v'`;
ZCS_VER="/tmp/zcsver.txt"
# get Zimbra LDAP password
ZIMBRA_LDAP_PASSWORD=`su - zimbra -c "zmlocalconfig -s zimbra_ldap_password | cut -d ' ' -f3"`

touch $ZCS_VER
echo $VERSION > $ZCS_VER

echo -e $ibold"Retrieve Zimbra User.............................."$ebold

grep "Release 5." $ZCS_VER
if [ $? = 0 ]; then
USERS=`su - zimbra -c 'zmprov gaa'`;
LDAP_MASTER_URL=`su - zimbra -c "zmlocalconfig -s ldap_master_url | cut -d ' ' -f3"`
fi

grep "Release 6." $ZCS_VER
if [ $? = 0 ]; then
USERS=`su - zimbra -c 'zmprov -l gaa'`;
LDAP_MASTER_URL="ldapi:///"
fi

grep "Release 7." $ZCS_VER
if [ $? = 0 ]; then
USERS=`su - zimbra -c 'zmprov -l gaa'`;
LDAP_MASTER_URL="ldapi:///"
fi

grep "Release 8." $ZCS_VER
if [ $? = 0 ]; then
USERS=`su - zimbra -c 'zmprov -l gaa'`;
LDAP_MASTER_URL="ldapi:///"
fi


echo -e $ibold"Processing account, please wait.............................."$ebold
# /* Proses insert account kedalam file hasil export */
for ACCOUNT in $USERS; do
NAME=`echo $ACCOUNT`;
DOMAIN=`echo $ACCOUNT | awk -F@ '{print $2}'`;
ACCOUNT=`echo $ACCOUNT | awk -F@ '{print $1}'`;
ACC=`echo $ACCOUNT | cut -d '.' -f1`

if [ $NAMA_DOMAIN == $DOMAIN ] ; 
then
OBJECT="(&(objectClass=zimbraAccount)(mail=$NAME))"
dn=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep dn:`


displayName=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep displayName: | cut -d ':' -f2 | sed 's/^ *//g' | sed 's/ *$//g'`


givenName=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep givenName: | cut -d ':' -f2 | sed 's/^ *//g' | sed 's/ *$//g'`

userPassword=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep userPassword: | cut -d ':' -f3 | sed 's/^ *//g' | sed 's/ *$//g'`

cn=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep cn: | cut -d ':' -f2 | sed 's/^ *//g' | sed 's/ *$//g'`

initials=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep initials: | cut -d ':' -f2 | sed 's/^ *//g' | sed 's/ *$//g'`

sn=`/opt/zimbra/common/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep sn: | cut -d ':' -f2 | sed 's/^ *//g' | sed 's/ *$//g'`

  if [ $ACC == "admin" ] || [ $ACC == "wiki" ] || [ $ACC == "galsync" ] || [ $ACC == "ham" ] || [ $ACC == "spam" ]; then
            echo "Skipping system account, $NAME..."
    else
        echo "createAccount $NAME PassTemp1. displayName '$displayName' givenName '$givenName' sn '$sn' initials '$initials' zimbraPasswordMustChange FALSE" >> $NAMA_FILE

            echo "$dn
changetype: modify
replace: userPassword
userPassword:: $userPassword
" >> $LDIF_FILE
            echo "Adding account $NAME"
    fi
else
    echo "Skipping account $NAME"
fi

done
echo -e $ibold"All account has been exported sucessfully into $NAMA_FILE and $LDIF_FILE..."$ebold
  • Copiar y ejecutar script en el servidor antiguo
scp /opt/zimbra/scripts/export-zimbra-users 192.168.130.X:
ssh 192.168.130.X 
chmod 755 export-zimbra-users
./export-zimbra-users
  • Enter Domain Name (ex : vavai.com) : dominio1.com
    Enter path folder for exported account (ex : /home/vavai/) : /root

    • Esto ha generado los archivos
/root/zcs-acc-add.zmp 
/root/zcs-acc-mod.ldif

En el aula ejecutar

cd /opt/zimbra/scripts
./export-zimbra-users
  • Enter Domain Name (ex : vavai.com) : dominioX.com
  • Enter path folder for exported account (ex : /home/vavai/) : /opt/zimbra/scripts
    • Esto ha generado los archivos
/opt/zimbra/scripts/zcs-acc-add.zmp
/opt/zimbra/scripts/zcs-acc-mod.ldif
  • Copiar archivos al servidor nuevo y ejecutar script de importacion
scp /root/zcs-acc* 192.168.130.Y:/opt/zimbra/scripts
ssh 192.168.130.Y
cd /opt/zimbra/scripts
vim import-zimbra-users
    #!/bin/sh

    #Hapus Layar
    clear

    echo -e '###################################################################################'
    echo -e '# Zimbra import-zcs-acc.sh ver 0.0.1                                              #'
    echo -e '# Skrip untuk import data account Zimbra                                          #'
    echo -e '# Masim 'Vavai' Sugianto - vavai@vavai.com - http://www.vavai.com                 #'
    echo -e '# Untuk saran dan pertanyaan silakan menggunakan Milis Komunitas Zimbra Indonesia #'
    echo -e '# Link Komunitas : http://www.zimbra.web.id - http://www.opensuse.or.id           #'
    echo -e '###################################################################################'

    # /* Variable untuk bold */
    ibold="\033[1m""\n===> "
    ebold="\033[0m"


    if [ "$USER" != "zimbra" ]
    then
            echo -e $ibold"You need to be user zimbra to run this script..."$ebold
        exit
    fi

    CURRENT_FOLDER=`pwd`;

    echo ""
    echo -e "Please verify that you have copied zcs-acc-add.zmp & zcs-acc-mod.ldif on current folder !"
    echo -e "Current Folder : $CURRENT_FOLDER, Please change to your folder before running this script."
    echo -e "Press ENTER to continue..."
    read jawab

    if [ -f ./zcs-acc-add.zmp ];
    then
       if [ -f ./zcs-acc-add.zmp ];
        then
            echo -e $ibold"Importing account..."$ebold

            ZIMBRA_LDAP_PASSWORD=`zmlocalconfig -s zimbra_ldap_password | cut -d ' ' -f3`

    #       cat ./zcs-acc-add.zmp | su - zimbra -c zmprov
            zmprov < $CURRENT_FOLDER/zcs-acc-add.zmp

            echo -e $ibold"Modify password..."$ebold


                    ldapmodify -f "$CURRENT_FOLDER/zcs-acc-mod.ldif" -x -H ldapi:/// -D cn=config -w $ZIMBRA_LDAP_PASSWORD

    #       su - zimbra -c '$LDAP_CMD'

            echo -e $ibold"Zimbra account has been modified sucessfully ..."$ebold

        else
            echo "Sorry, file $CURRENT_FOLDER/zcs-acc-mod.ldif does not exists, import process will not be continue..."
            exit
        fi  
        else
           echo "Sorry, file $CURRENT_FOLDER/zcs-acc-add.zmp does not exists, import process will not be continue..."
           exit
        fi
    ```

 - Ejecutar en servidor nuevo o en el aula
 ```bash
chmod 755 import-zimbra-users
su - zimbra
cd /opt/zimbra/scripts
./import-zimbra-users

7.5.9.- Migración de buzones con zmztozmig

  • Cambiar clave del administrador
su - zimbra -c "zmprov sp admin@dominio.com Lolcito.123"
  • **Configurar zmztozmig en el Servidor 1 **
su -  
vim /opt/zimbra/conf/zmztozmig.conf
```bash
Configuration file for zmztozmig with all necessary settings
#
#Source ZCS server IP/name,admin user name and password, server port
SourceZCSServer=192.168.130.X
SourceAdminUser=admin
SourceAdminPwd=Lolcito.123
SourceAdminPort=7071
#
#Destination/Target ZCS server IP/name,admin user name and password, server port
TargetZCSServer=192.168.130.Y
TargetAdminUser=admin
TargetAdminPwd=Lolcito.123
TargetAdminPort=7071

#Threads to run simultaneously
Threads=2

46:DomainMap=dominio1.com dominio2.com
47:#DomainMap=google.com yahoo.com
48:#Domains to migrate in case of Accounts parameter is set to "all"
49:Domains=dominio1.com

#all accounts from source server.Domains parameter must be defined to list the domains to be
#migrated.
Accounts=all
```

Ejecutar el script de migración

$> su - zimbra
$> /opt/zimbra/libexec/zmztozmig -f /opt/zimbra/conf/zmztozmig.conf  

Comments 1

tecnoforense

junio 16, 2017

Saludos Clever Flores.
Excelente información de gran ayuda para la administración de zimbra, te quería consultar si tienes un script general con opciones que permitan generar un respaldo completo de cuentas de correo con toda su configuración, contactos, contenido de buzones y etc, que permita luego de un desastre restaurar todo en otro servidor sin perdida de información de los usuarios. Agradecido con tus aportes amigo.

Mensaje por facebook
Loading...