Compartir en Facebook

Scripts para Backup en Zimbra

Cómo hacer y restaurar copias de seguridad en Zimbra CS


#!/bin/sh
#
# :: Ultima modificacion: miercoles, 18 de Mayo de 2012
#
#    Script para REALIZACION de backup del servidor de Correo Zimbra (open source version)
#    utilizando rsync para crear una copia de seguridad en caliente (en caso de que no exista)
#	  parar los servicios de zimbra, sincronizar con rsync la copia de seguridad,
#    iniciar los servicios de zimbra. 
#    Cuando el servidor esta funcionando de nuevo, se comprime la copia de seguridad
#    realizada para ahorrar espacio en disco.
#    Posteriormente, se libera espacio ocupado por copias de seguridad antiguas.
#	  Por ultimo, se envia un mensaje de correo a la direccion (o direcciones) especificada/s
#    donde se incluye el LOG de la copia de seguridad realizada, el cual mostrara
#    el proceso realizado y los errores, en caso de que existan.

#    Este script esta basado originalmente en un script encontrado en Zimbra Wiki
#    http://wiki.zimbra.com/index.php?title=Open_Source_Edition_Backup_Procedure
#    y totalmente reescrito desde entonces al no cumplir los necesidades de la empresa
#    en cuanto a la realizacion de la copia de seguridad.

#    Este script es gratuito y de codigo abierto y para uso de cualquier persona que pueda serle util
#    No se ofrece ningun tipo de garantia. 
#    Se agradece mencion: Victor M. Fernandez Trujillo, 18 Mayo 2012
#	se.ollijurtzednanref@rotciv

###############################################################################

###-------------- CONFIGURACION --------------###
# AJUSTA ESTOS DATOS A TUS NECESIDADES
FECHA=`date +"%Y%m%d"`

 # Enviar correo informativo
    MAILDESTINO="se.ollijurtzednanref@ofni"
    CCMAIL="moc.liamg@akynamonan"
		
	ASUNTO="Zimbra Backup_"$FECHA
	MSG="Copia de seguridad de Zimbra realizada el "$FECHA". Revise el LOG para confirmar que todo esta correcto"
##Directorio del cual obtiene el log
	LOG=/var/log/zmbackup_$(date +\%Y\%m\%d).log

# NOMBRES DE LOS DIRECTORIOS SIN LA / (BARRA) FINAL
  # Directorio donde esta INSTALADO Zimbra
     DIR_ZIMBRA=/opt/zimbra	
  
  # construir nombre subdirectorio
 	 NOMBRE_DIR=`basename $DIR_ZIMBRA`
	 NOMBRE_FICH=$NOMBRE_DIR"_"$FECHA	
	
  #Si no incluimos parametros, creacion de la variable
  #del directorio destino
if [ $# -eq 0 ]; then
	# Directorio para GUARDAR los backups
     DIR_DESTINO=/backups
else
  #Si incluimos parametros, error
	echo "[ERROR] No hay que indicar parametros."
	echo "Uso: $0"
	echo "Crear log: $0 >> /var/log/zmbackup_$(date +\%Y\%m\%d).log 2>&1"
	
	exit
fi

# Archivos donde listamos las exlusiones del backup
FICHERO_DE_EXCLUSION=$DIR_ZIMBRA/.rsyncExcluir

#####################################
##                NO TOCAR A PARTIR DE AQUI              ##
####      SI NO SABES QUE ESTAS HACIENDO      ####
#####################################

# opciones de rsync
OPCIONES="--force --ignore-errors --delete --delete-excluded \
 --exclude-from=$FICHERO_DE_EXCLUSION --backup --backup-dir=$DIR_DESTINO -aHKv"

################# FUNCIONES #####################
function stopZimbra {
  # Parar servicios Zimbra
     echo Parando los servicios de Zimbra ...
     su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
     sleep 15
  # Matar procesos huerfanos de Zimbra 
     ORPHANED=`ps -u zimbra -o "pid="` && kill -9 $ORPHANED
     echo 
}

function startZimbra {
  # Iniciando servicios Zimbra
     echo Iniciando los servicios de Zimbra ...
     su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
     echo 
}

function mostrarEstadoZimbra {
  # Mostrar estado servicios de Zimbra
     echo Mostrando el estado de los servicios de Zimbra ...
     su - zimbra -c "/opt/zimbra/bin/zmcontrol status"
     echo 
}

function ejecutarRsync() {
  # Crear copia de seguridad	
	 if [ ! -f $FICHERO_DE_EXCLUSION ]; then
		echo `basename $DIR_DESTINO`"/" > $FICHERO_DE_EXCLUSION
		echo ".rsyncExcluir" >> $FICHERO_DE_EXCLUSION
		echo "*~" >> $FICHERO_DE_EXCLUSION
	 fi
	 rsync $OPCIONES $DIR_ZIMBRA $DIR_DESTINO
	 echo 
}

function comprimirBackup {
  # Comprimir copia de seguridad
	 cd $DIR_DESTINO
	 ACTUAL=`pwd`
	 echo Comprimiendo el Backup en el directorio $ACTUAL ...
	
 	 tar czf $NOMBRE_FICH.tar.gz $DIR_DESTINO/$NOMBRE_DIR
 	 echo 
}

function DELBackupsAntiguos {
  # Eliminar archivos de backup de MAS de 6 dias
  # que se encuentre en $DIR_DESTINO y
  # el nombre coincida con el patron: $NOMBRE_DIR"_"20*
  # Ejemplo: /backups/zimbra_20120420.tar.gz
    echo Eliminando Backups antiguos ...
	rm -fv `find $DIR_DESTINO/$NOMBRE_DIR"_"20*.tar.gz -type f -mtime +6`
	echo
}

function EnviarCorreo {
   #ENVIAR CORREO con LOG adjunto
    echo Enviando correo a $MAILDESTINO y $CCMAIL
	mutt -s "$ASUNTO" $MAILDESTINO -c $CCMAIL -a $LOG <<< $MSG
	echo
}


##############################################
#
#                          EJECUCION   DEL   PROGRAMA
#
##############################################

echo Hora de comienzo del Backup = $(date +%T)
echo 
before="$(date +%s)"

# nos aseguramos de que existen los directorios para la copia de seguridad
mkdir -p $DIR_DESTINO

if [ ! -d $DIR_ZIMBRA ]; then
	echo "No se ha encontrado el directorio a guardar : $DIR_ZIMBRA";
elif [ ! -d $DIR_DESTINO ]; then
	echo "No se ha encontrado el directorio de destino de la copia : $DIR_DESTINO";
else
  
  # Copia de seguridad en caliente
  # Solo se ejecuta si NO existe el directorio 
  # $DIR_DESTINO/$NOMBRE_DIR 
  # es decir, NO se ha realizado ninguna copia antes
  if [ ! -d $DIR_DESTINO/$NOMBRE_DIR ]; then
	 echo Creando copia en caliente de Zimbra ...
	 ejecutarRsync
  fi 
	
	# Calcular tiempo offline del servidor Zimbra
	  before2="$(date +%s)"	
	  
  # Detener servicios Zimbra
	 stopZimbra
	 
  # Sincronizar con el directorio de la copia de seguridad
	 echo Sincronizando con el directorio de Backup ...
	 ejecutarRsync
	 
  # Iniciar servicios Zimbra
	 startZimbra
	 
	 # Calcular y mostrar tiempo off-line del servidor Zimbra
		 after="$(date +%s)"
		 elapsed="$(expr $after - $before2)"
		 hours=$(($elapsed / 3600))
		 elapsed=$(($elapsed - $hours * 3600))
		 minutes=$(($elapsed / 60))
	  	 seconds=$(($elapsed - $minutes * 60))
		 
		 echo El servidor ha estado Offline: "$hours horas $minutes minutos $seconds segundos"
		 echo 
	
  echo Hora de finalizacion del Backup = $(date +%T)
  echo 
  
  # Mostrar estado servicios Zimbra	 
	 mostrarEstadoZimbra
		 
  # Comprimir el backup
	 comprimirBackup
	
  # Eliminar Backups de mas de 5 dias
  	 DELBackupsAntiguos
	 
  # Enviar correo con log adjunto
     EnviarCorreo
fi

# Calcular tiempo total
  after="$(date +%s)"
  elapsed="$(expr $after - $before)"
  hours=$(($elapsed / 3600))
  elapsed=$(($elapsed - $hours * 3600))
  minutes=$(($elapsed / 60))
  seconds=$(($elapsed - $minutes * 60))
  
  echo Tiempo total de realizacion del Backup: "$hours horas $minutes minutos $seconds segundos"
Ir Arriba Ir Arriba
#!/bin/sh
#
# :: Ultima modificacion: miercoles, 02 de Mayo de 2012
#
# 
#    Script para RESTAURACION del servidor de Correo Zimbra (open source version)
#    Se descomprime el backup en una carpeta temporal, se paran los servicios de Zimbra
#    y se empieza la restauración de los ficheros al directorio de instalacion de zimbra.
#    Posteriormente, restaura los permisos en los ficheros de zimbra.
#    Inicia los servicios y, por último, se elimina el directorio temporal donde se descomprimió
#    el backup de zimbra.

#    Este script es gratuito y de código abierto y para uso de cualquier persona que pueda serle útil
#    No se ofrece ningún tipo de garantías. 
#    Se agradece mención. Víctor M. Fernández Trujillo, 02 Mayo 2012
#	se.ollijurtzednanref@rotciv

###############################################################################

###-------------- CONFIGURACION --------------###
# AJUSTA ESTOS DATOS A TUS NECESIDADES
# NOMBRES DE LOS DIRECTORIOS SIN LA / (BARRA) FINAL

  # Ruta donde se encuentra el directorio de Zimbra (sin "entrar" en el)
  # Ejemplo: /opt/zimbra ==> /opt
     DIR_ZIMBRA=/opt	
	 
  # Directorio donde se GUARDAN los backups
     DIR_DESTINO=/backups
	 
  # Directorio para DESCOMPRIMIR los backups
     DIR_TMP=/tmp
  
# NECESARIO 1 parametro: Indicamos el NOMBRE DEL FICHERO DE BACKUP
# SIN la extension (backup20120420.tar.gz ==> backup20120420)
if [ $# -eq 1 ]; then
  # fichero del backup
	 FICH_BACKUP=$1.tar.gz
  # nombre directorio backup
	 NOMBRE_DIR=`basename $1`

else
	echo "[ERROR] Es necesario indicar un parametro."
	echo "Uso: $0 /ruta/nombre_fich_backup (SIN extension)"
	echo "Ejemplo: $0 /backups/copia20120420"
	echo "Crear log: $0 fich_backup >> /var/log/zmrestore_$(date +\%Y\%m\%d).log 2>&1"

	exit
fi

#####################################
##                NO TOCAR A PARTIR DE AQUI              ##
####      SI NO SABES QUE ESTAS HACIENDO      ####
#####################################

################# FUNCIONES #####################
function descomprimirBackup {
  # Descomprimir la copia de seguridad
	echo Preparando el sistema para la restauracion ...
	echo Este proceso puede tardar varios minutos ...
	
	cd $DIR_TMP
	tar xzf $FICH_BACKUP
	
	echo 
}

function restaurarBackup {
	echo Restaurando todos los ficheros de Zimbra ...

  # copiamos el backup  
    cp -fr $DIR_TMP$DIR_DESTINO/zimbra/ $DIR_ZIMBRA
	 
   echo 
}

function restaurarPermisos {
	echo Restaurando permisos en el directorio $DIR_ZIMBRA/zimbra ...
    # asignamos como propietario de la carpeta $DIR_ZIMBRA zimbra:zimbra
    chown -R zimbra:zimbra $DIR_ZIMBRA/zimbra
	# Ejecutar $DIR_ZIMBRA/zimbra/libexec/zmfixperms para solucionar
	# problemas con el arranque de postfix
    $DIR_ZIMBRA/zimbra/libexec/zmfixperms --verbose --extended 
	
	# chmod 777 $DIR_ZIMBRA/zimbra/zimbramon/pylibs/*
	# para que arranque sin problemas zmconfigd
    chmod 777 $DIR_ZIMBRA/zimbra/zimbramon/pylibs/*
    echo 
}

function DELDirectorioBackup {
	# Eliminar el Directorio donde hemos descomprimido
	# la copia de seguridad
	echo Liberando espacio en disco ...
	rm -fr $DIR_TMP$DIR_DESTINO/zimbra
	echo 
}
	
function stopZimbra {
  # Parar servicios Zimbra
   echo Parando los servicios de Zimbra ....
   su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
   sleep 15
  # Matar procesos huerfanos de Zimbra 
   ORPHANED=`ps -u zimbra -o "pid="` && kill -9 $ORPHANED
   echo 
}

function startZimbra {
  # Iniciando servicios Zimbra
   echo Iniciando los servicios de Zimbra ...
   su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
   echo 
}

function mostrarEstadoZimbra {
  # Mostrar estado servicios de Zimbra
   echo Mostrando el estado de los servicios de Zimbra ...
   su - zimbra -c "/opt/zimbra/bin/zmcontrol status"
   echo 
}


##############################################
#
#                          EJECUCION   DEL   PROGRAMA
#
##############################################

echo Restaurando la copia $NOMBRE_DIR a las $(date +%T)
echo 
before="$(date +%s)"

# nos aseguramos de que existen los directorios para la copia de seguridad
mkdir -p $DIR_ZIMBRA 
mkdir -p $DIR_TMP
mkdir -p $DIR_DESTINO

if [ ! -f $FICH_BACKUP ]; then
	echo "No se ha encontrado el fichero de restauracion: $FICH_BACKUP";
	exit
else 
  # Descomprimir archivos backup
	 descomprimirBackup
	 
  # Calcular tiempo offline del servidor Zimbra
	  before2="$(date +%s)"	
	
  # Si existe el directorio $DIR_ZIMBRA/zimbra, parar el servicio
	if [ -d $DIR_ZIMBRA/zimbra ]; then
  # Detener servicios Zimbra
	 stopZimbra
	fi
	 
  # Restaurando la copia de seguridad
	 restaurarBackup
	 
  # Restaurando permisos
  	 restaurarPermisos	
	 
  # Iniciar servicios Zimbra
	 startZimbra
	 
  # Calcular y mostrar tiempo off-line del servidor Zimbra
	 after="$(date +%s)"
	 elapsed="$(expr $after - $before2)"
	 hours=$(($elapsed / 3600))
	 elapsed=$(($elapsed - $hours * 3600))
	 minutes=$(($elapsed / 60))
	 seconds=$(($elapsed - $minutes * 60))
	 echo El servidor ha estado Offline: "$hours horas $minutes minutos $seconds segundos"
	 echo 
	
  echo Backup restaurado a las $(date +%T)
  echo 
  	
  # Mostrar estado servicios Zimbra	 
	 mostrarEstadoZimbra

  # Eliminar directorio del backup
	 DELDirectorioBackup
fi

# Calcular tiempo total
  after="$(date +%s)"
  elapsed="$(expr $after - $before)"
  hours=$(($elapsed / 3600))
  elapsed=$(($elapsed - $hours * 3600))
  minutes=$(($elapsed / 60))
  seconds=$(($elapsed - $minutes * 60))

  echo Tiempo total de restauracion del Backup: "$hours horas $minutes minutos $seconds segundos"
Ir Arriba Ir Arriba
#!/bin/bash
# :: Ultima modificacion: miercoles, 18 de Mayo de 2012
#    Script para IMPORTACIÓN de usuarios desde Active Directory al servidor de Correo Zimbra
#    Este script esta basado originalmente en un script desarrollado el 20081006 
#    by Eduardo Gonzalez <egrueda@gmail.com> y modificado al no cumplir los 
#    necesidades de la empresa. Este script es gratuito y de codigo abierto 
#    y para uso de cualquier persona que pueda serle util
#    No se ofrece ningun tipo de garantia. 
#    Se agradece mencion: Victor M. Fernandez Trujillo, 18 Mayo 2012
#	se.ollijurtzednanref@rotciv
 
 LDAPSEARCH=/usr/bin/ldapsearch
 ZMPROV=/opt/zimbra/bin/zmprov
 DOMAIN_NAME="fernandeztrujillo.es"
 TIMESTAMP=`date +%N`
 TMP_DIR=/tmp
 ADS_TMP=$TMP_DIR/users_ads_$TIMESTAMP.lst
 ZCS_TMP=$TMP_DIR/users_zcs_$TIMESTAMP.lst
 DIF_TMP=$TMP_DIR/users_dif_$TIMESTAMP.lst
 
 # Server values
 LDAP_SERVER="ldap://192.168.66.250"
 BASEDN="ou=Clientes,dc=fernandeztrujillo,dc=es"
 BINDDN="cn=Administrador,cn=Users,dc=fernandeztrujillo,dc=es"
 BINDPW="mnk2012"
 
 #FILTER="(&(sAMAccountName=*)(objectClass=user)(givenName=*))"
 FILTER="(&(objectClass=person)(givenName=*))"
 FIELDS="mail"
 
 # Direcciones de correo que NO hay que borrar
 NODLT1='admin@fernandeztrujillo.es'
 NODLT2='spam@fernandeztrujillo.es'
 NODLT3='virus-quarantine@fernandeztrujillo.es'
 NODLT4='ham@fernandeztrujillo.es'
 
 # Extract users from ADS
 echo -n "Obteniendo usuarios de Active Directory... "
 $LDAPSEARCH -x -H $LDAP_SERVER -b $BASEDN -D "$BINDDN" -w $BINDPW "$FILTER" $FIELDS | \
   grep "@$DOMAIN_NAME" | \
   awk '{print $2}' | \
   sort > $ADS_TMP
 echo "Found `cat $ADS_TMP | wc -l` users ($ADS_TMP)"
 
 # Extract users from ZCS
 echo -n "Obteniendo usuarios de Zimbra CS... "
 $ZMPROV -l gaa $DOMAIN_NAME > $ZCS_TMP
 echo "Found `cat $ZCS_TMP | wc -l` users ($ZCS_TMP)"
 
 # Generate diff
 echo "Calculando nuevos usuarios ($DIF_TMP)"
 diff -u $ZCS_TMP $ADS_TMP | grep "$DOMAIN_NAME" > $DIF_TMP
 
 # Clean up users list
 rm -f $ADS_TMP $ZCS_TMP
 
 # Import new users
 echo -n "Nuevos usuarios: "
 cat $DIF_TMP | grep ^+ | wc -l
 for i in $(cat $DIF_TMP | grep ^+ | sed s/^+//g);
 do
   echo -n " - Creando usuario $i ";
   $ZMPROV -l ca $i passwd > /dev/null;
   RES=$?
   if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
 done
 
# Delete old users
echo -n "Usuarios antiguos: "
cat $DIF_TMP | grep ^- | wc -l
for i in $(cat $DIF_TMP | grep ^- | sed s/^-//g);
do
 if [ "$i" == "$NODLT1" -o "$i" == "$NODLT2" -o "$i" == "$NODLT3" -o "$i" == "$NODLT4" ]
  then 
	echo "NO se borra: $i"
  else 
    echo -n " - Eliminando $i ";
    #$ZMPROV deleteAccount $i > /dev/null;
 	echo "SI BORRA"
	RES=$?
	if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
 fi

done

# Clean up diff list
rm -f $DIF_TMP
Ir Arriba Ir Arriba

Currículum Vitae Informático