viernes, 10 de agosto de 2012

ImapSync Migra tu correo zimbra

Hola amigos, en esta oportunidad quiero compartir con ustedes un script mucho más eficiente y totalmente funcional, anteriormente dentro de este mismo blog había publicado un escript menos robusto. A partir de allí necesitaba optimizarlo, para que cumpla completamente la función de replicar los datos, desde un servidor de correo hacia otro servidor, e incluso mantener los Backup y redundancia entre ambos.
Hay soluciones que hacen esto en el mercado, Zimbra como empresa ofrece suite para este tipo de requerimientos, pero valen dinero, como es Licencia Open Source tenemos el código y ciertas libertades, claro con diferencias muy notables a lo que es una Licencia GPL. Entonces pensando un poquito, dedicando valiosos días de trabajo, buscando en foros y pidiendo ayuda a compañeros logre cubrir mis requerimientos, ja ja ja y pues economizar aproximadamente unos 50,000 Dolares $ por cuestión de licencia, sin contar otros miles por implementación y soporte, en fin, ¡logre ahorrarcelos a mi empresa - perfeccione mas mis conocimientos y lo mejor que puedo compartir con ustedes los frutos y mi experiencia¡, me ha funcionado del todo bien. Lo estoy utilizando con Debian GNU/Linux 5.0.10 (lenny) Kernel 2.6.26-2-486 y Zimbra 6.0.16 GA Release.
Partiendo del script, lo modifique, para que de un servidor a otro migre por lotes las cuentas de cada usuario, sin necesidad de conocer la contraseña de la cuenta de correo, entonces; utilizo la clave y usuario de admin de la consola zimbra para validar la autoridad de cada servidor, empiezo a migrar toda la información de las cuentas de correo tanto calendario, borradores, contactos, y toda la información relacionada con la cuenta.
En este caso, lo estoy utilizando con 1870 cuentas de correo, los dos servidores o equipos son idénticos en cuanto a sistema operativo y kernel. Además estoy aprovechando esta funcionalidad para realizar los respaldos del correo en otro servidor, y así garantizar el servicio en caso de falla.  Esto me brinda otro servidor que va a funcionar como backup, además de estar redundante y poder garantizar el servicio a la hora de ofrecer alta disponibilidad.

Procedamos...

Creamos un archivo migracion.sh y pegamos lo siguiente:
#!/bin/bash
logfile="imapsynlog.txt"
host1=10.40.25.8
#host1 is Source
host2=10.40.10.65
#host2 is Dest
domain=midominio.gob.ve
#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; do
user=$u1
echo "Syncing User $user"
date=`date +%X_-_%x`
echo "Start Syncing User $u1"
echo "Starting $u1 $date" >> $logfile
imapsync --maxsize 52428800 --buffersize 52428800 --fastio1 --fastio2 --nofoldersizes --nosyncacls --subscribe --syncinternaldates --noauthmd5 --authmech2 PLAIN --exclude '(?i)\b(Junk|Spam|Trash)\b' --regexflag 's/\\\\(?!Answered|Flagged|Deleted|Seen|Recent|Draft)[^\s]*\s*//ig' --regextrans2 's,:,-,g' --regextrans2 's,\",'\'',g' --regextrans2 's,\s+(?=/|$),,g' --regextrans2 's,^(Briefcase|Calendar|Contacts|Emailed Contacts|Notebook|Tasks)(?=/|$), $1 Folder,ig' --host1 $host1 --host2 $host2 --user1 "$user" --user2 "$user" --authuser1 "admin" --password1 "1234abc" --authuser2 "admin" --password2 "1234abc" --regextrans2 's,\",-,g' --regextrans2 's,&AAo-|&AA0ACg-|&AA0ACgANAAo-(?=/|$),,g' --ssl1 --authmech1 PLAIN --ssl2
date=`date +%X_-_%x`
echo "User $user done"
echo "Finished $user $date" >> $logfile
echo "" >> $logfile
done ; } < userlist.txt
date=`date +%X_-_%x`
echo "" >> $logfile
echo "IMAPSync Finished.. $date" >> $logfile
echo "------------------------------------" >> $logfile

Lo guardamos.
Ahora debemos crear el archivo userlist.txt y debe contener lo siguiente:
fperez
cmatos
loropeza
fsantos

guardamos el archivo userlist.txt en la misma carpeta donde tenemos el script, lo ejecutamos con #sh migracion.sh
Nota: El archivo solo debe contener el nombre de la cuenta sin la @, y una sola cuenta por linea, claro amigos si necesitan también importar por lotes los password la nomenclatura seria usuario;password ejemplo lmendez;123456 (solo una cuenta por linea sin colocar nada al final de cada linea), y habria que modificar el script, si lo necesitan también puedo publicarlo.

No te olvides de darle clic en los anuncios de este blog, de esta forma contribuyes con mi trabajo, para asi poder seguir cooperando con la comunidad.

8 comentarios:

  1. Muchas gracias. fue de gran ayuda.

    ResponderEliminar
  2. Hola,

    A mi me da este error el script. Sabes qué puede estar pasando? No encuentro info por internet y no se me ocurre dónde está mi error
    Info: turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
    Info: will try to use PLAIN authentication on host1
    Info: will try to use PLAIN authentication on host2
    Host1: IMAP server [172.16.1.171] port [993] user [pepde@dominio.local]
    Host2: IMAP server [172.16.1.175] port [993] user [pepde@dominio.local]
    Host1: * OK zimbra1.dominio.local Zimbra IMAP4rev1 server ready
    Host1: 172.16.1.171 says it has CAPABILITY for AUTHENTICATE PLAIN
    Failure: error login on [172.16.1.171] with user [pepde@dominio.local] auth [PLAIN]: 2 NO AUTHENTICATE failed
    at /usr/bin/imapsync line 2276.
    main::die_clean('Failure: error login on [172.16.1.171] with user [pepde@domin...') called at /usr/bin/imapsync line 2055
    main::authenticate_imap('Mail::IMAPClient=HASH(0x1058370)', 172.16.1.171, 993, 'pepde@dominio.local', undef, 123456, undef, undef, 1, ...) called at /usr/bin/imapsync line 2017
    main::login_imap(172.16.1.171, 993, 'pepde@dominio.local', undef, 123456, undef, undef, 1, 1, ...) called at /usr/bin/imapsync line 972

    Muchas gracias!!!
    Sebas

    ResponderEliminar
    Respuestas
    1. Hola Sebastián, al parecer es un error con el usuario. Yo te recomiendo primero que utilices el usuario admin lo cual tiene todos los privilegios de zimbra, ya que la autenticacion esta arrojando eerror login. Si puedes colocar exactamente el escript con la modificación, podría hechar un vistazo¡ Estamos en contacto

      Eliminar
  3. Hola Simón! Tu tiempo de respuesta es mucho más ágil que el de cualquier fabricante que conozca :D Gracias!!!

    Así está modificado el script
    #!/bin/bash
    logfile="imapsynlog.txt"
    host1=172.16.1.171 #En mi caso es un servidor con los roles de LDAP Master y mailstore. No tiene ni proxy ni MTA ya que están en otra VM
    #host1 is Source
    host2=172.16.175 #IDEM escenario que el host1
    #host2 is Dest
    domain=dominio.local
    #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; do
    user=$u1
    echo "Syncing User $user"
    date=`date +%X_-_%x`
    echo "Start Syncing User $u1"
    echo "Starting $u1 $date" >> $logfile
    imapsync --maxsize 52428800 --buffersize 52428800 --fastio1 --fastio2 --nofoldersizes --nosyncacls --subscribe --syncinternaldates --noauthmd5 --authmech2 PLAIN --exclude '(?i)\b(Junk|Spam|Trash)\b' --regexflag 's/\\\\(?!Answered|Flagged|Deleted|Seen|Recent|Draft)[^\s]*\s*//ig' --regextrans2 's,:,-,g' --regextrans2 's,\",'\'',g' --regextrans2 's,\s+(?=/|$),,g' --regextrans2 's,^(Briefcase|Calendar|Contacts|Emailed Contacts|Notebook|Tasks)(?=/|$), $1 Folder,ig' --host1 $host1 --host2 $host2 --user1 "$user" --user2 "$user" --authuser1 "migracion@dominio.local" --password1 "123456" --authuser2 "admin" --password2 "123456" --regextrans2 's,\",-,g' --regextrans2 's,&AAo-|&AA0ACg-|&AA0ACgANAAo-(?=/|$),,g' --ssl1 --authmech1 PLAIN --ssl2
    date=`date +%X_-_%x`
    echo "User $user done"
    echo "Finished $user $date" >> $logfile
    echo "" >> $logfile
    done ; } < userlist.txt
    date=`date +%X_-_%x`
    echo "" >> $logfile
    echo "IMAPSync Finished.. $date" >> $logfile
    echo "------------------------------------" >> $logfile

    Creo que puede ser interesante también comentarte que la validación de ambos Zimbras (el viejo y al que voy a migrar), la hacen contra un servidor externo de Active Directory. Asimismo, las cuentas ya están creadas en los dos servidores y sólo falta mover la información imap. Para el "host1", verás que especifico "migracion@dominio.local". Es una cuenta de administrador creada específicamente para la migración y que tiene los permisos configurados correctamente. La cuenta de "admin" por defecto, en realidad pertenece a otro dominio interno que no es el de correo ni en el que están las cuentas (dominio.local).

    Otra vez, muchas gracias por tu ayuda, me estoy volviendo loco con esto y no doy en el clavo de lo que está pasando! :)
    Sebas

    ResponderEliminar
  4. Dos cosas,
    1- El usuario pepde@dominio.local que señala el error es una cuenta de la que deseas migrar?.
    2- El archivo userlist.txt sigue esta extructura
    pepde
    simong
    carloss

    Siendo cada linea un usuario del correo.

    Te comento esto porque si la nomenclatura es usuario;password Ejemplo:

    simon:123456
    pepe;124567

    la estructura del script cambia, ya que es difícil saber la contraseña de cada usuario, por eso se utiliza el usuario admin que se configura al momento de la instalación de zimbra, este usuario es local y seria algo parecido a un root o super usuario. cuando instalaste el zimbra por primera vez debiste configurar un usuario, Lo tienes?

    ResponderEliminar
  5. Hola Simón!

    Perdón por la demora en contestarte, ayer no pude seguir.
    1) Este usuario es uno de los que deseo migrar
    2) El formato del archivo "userlist.txt" sigue la estructura
    peped
    simong
    carloss

    De todas formas, desconozco los passwords de los usuarios. Hoy seguiré buscando la fórmula a ver si consigo migrarlos pero como siempre, cualquier sugerencia/ayuda es más que bienvenida porque actualmente no consigo ver/entender qué es lo que está ocurriendo.

    Saludos,
    Sebas

    ResponderEliminar
  6. Hola Simón!

    Ya di con el error :). Actualmente tengo 2 servidores de mailstore desde donde migro las cuentas. No me caí hasta ahora pero haciendo de uno en uno los usuarios vi que algunas cuentas sí las migraba y otras no, por lo que decidí ver qué les diferenciaba: "zmprov ga cuenta@dominio.com" y vi que era la propiedad "zimbraMailHost". Hice un repaso rápido en varias cuentas para ver si el patrón se repetía "zmprov ga e4@dominio.local |grep -i zimbraMailHost".

    Efectivamente, al configurar el script para que ataque a un host (--host 172.16.1.171), los buzones han de estar en ese host. Moviendo el buzón o cambiando la IP del host, funciona perfectamente.
    Lamento no haberme dado cuenta antes de este error tan tonto pero el "error message" no me daba a entender que este podía ser el problema y por tonto no me di cuenta sino hasta ahora :).

    Muchas gracias por tu ayuda y por tu post!!! Espero que este comentario ayude a alguien a no "perder" tiempo como me pasó a mi :D

    Por cierto, conoces alguna forma automatizada de migrar elementos que no sean IMAP, como calendarios, tareas, etc?

    Un abrazo,
    Sebas

    ResponderEliminar
  7. Amigo, este script traslada toda la informacion de la cuenta? es decir, adjuntos, calendarios claves del correo?

    ResponderEliminar