martes, 7 de abril de 2009

Script Backup [ tar , md5 , cifs ]

Dejo un pequeño script para backups en un disco Western Digital de 1TB con Ethernet 1GB. Resumen:
  • De Lunes a Sabado realiza backup de los directorios definidos en $DESTINO.
  • Los Domingos añade los directorios definidos en $DIRECTORIO_ADICIONALES.
  • Mantiene los ficheros durante 14 días.Suficiente en este caso.
  • Opcion gzip comentada, haciendo pruebas me interesaba observar el funcionamiento del script.Se recomienda descomentar la linea.
  • Comprueba el montaje del directorio destino, en este ejemplo /usb/copias.
  • Detalles en el fichero log especificado en la variable $REPORTE.
  • Genera suma md5 del fichero y lo imprime en el log.
  • Envia por correo el resultado del backup.
No es nada del otro mundo, pero funciona. Las sugerencias son bienvenidas!

#!/bin/bash
#Backup Script Alberto Permuy Leal
#Version 0.0.1
#Licencia: GPLv2 o cualquiera de sus variantes
#
#
#
#
#Fecha: Abril 2009
#
#
#Definicion de variables
#
#Fichero Reporte Backup
REPORTE=/tmp/reporte-backup-$(date +%d-%m-%y).txt
#
#Variables Tiempo
FECHA=$(date +%d-%m-%y)
DIA_SEMANA=`echo $(date +%w)`
#
#Variables Host/Fichero
HOST=`/bin/hostname `
SISTEMA=`/bin/uname -sr `
#
#
#Variables Generales
DESTINO="/usb/copias"
DIRECTORIOS_BACKUP="/etc /root /var/lib/mysql"
DIRECTORIO_ADICIONALES="/var/log"
DESTINATARIO="user@dominio.com"
ASUNTO="InformeBackup"
#
#
#CABECERA
rm -rf $REPORTE
touch $REPORTE
echo "-----------------------------" > $REPORTE
echo "REPORTE BACKUP " >> $REPORTE
echo "-----------------------------" >> $REPORTE
echo "" >> $REPORTE
echo "Host:"$HOST >> $REPORTE
echo "Sistema:"$SISTEMA >> $REPORTE
echo "" >> $REPORTE
echo "Fecha Copia Seguridad :"$FECHA >> $REPORTE
echo "El destinatario del email es:"$DESTINATARIO >> $REPORTE
###############################################################
# #
#COMIENZO DEL SCRIPT #
# #
###############################################################
if [ -d /usb/copias ]; then
echo "Parece que el disco USB está montado"
else
echo "Montando disco USB"
mount.cifs //192.168.1.200/PROGRAMAS /usb -o username=user,password=pass,rw
echo "Fin montaje"
fi
#
#
case $DIA_SEMANA in
1)
NOMBRE_DIA="lunes"
;;
2)
NOMBRE_DIA="martes"
;;
3) NOMBRE_DIA="miercoles"
;;
4)
NOMBRE_DIA="jueves"
;;
5) NOMBRE_DIA="viernes"
;;
6) NOMBRE_DIA="sabado"
;;
0) NOMBRE_DIA="domingo"

esac

case $DIA_SEMANA in

[1-6])
echo "Hoy es :"$NOMBRE_DIA
echo "Backup iniciado a las: "`date |awk '{ print $4 }'` >> $REPORTE
rm -rf $DESTINO/$NOMBRE_DIA-old.tar
mv $DESTINO/$NOMBRE_DIA.tar $DESTINO/$NOMBRE_DIA-old.tar
tar cvf $DESTINO/$NOMBRE_DIA.tar $DIRECTORIOS_BACKUP
#gzip $DESTINO/$NOMBRE_DIA.tar
echo "El fichero ocupa :"`du -sh $DESTINO/$NOMBRE_DIA.tar|awk '{ print $1 }'` >> $REPORTE
echo "Se ha realizado backup de los directorios:"$DIRECTORIOS_BACKUP >> $REPORTE
echo "La suma MD5 del fichero es:"`md5sum $DESTINO/$NOMBRE_DIA.tar|awk '{ print $1 }'` >> $REPORTE
echo "Esta cifra puede ayudarle a comprobar coherencias en caso de restaurar la copia." >> $REPORTE
if [ -f $DESTINO/$NOMBRE_DIA-old.tar ]; then
echo "El fichero de la semana anterior existe.Parece que todo esta en orden." >> $REPORTE
else
echo "El fichero de la semana anterior no existe." >> $REPORTE
echo "Es probable que todavia no se haya cumplido el ciclo de rotaciones de backups." >> $REPORTE
echo "Si continua recibiendo este mensaje.Contacte con el Administrador." >> $REPORTE
fi
echo "Backup finalizado a las: "`date |awk '{ print $4 }'` >> $REPORTE

;;
0)
echo "Hoy es Domingo.Se han añadido directorios adicionales a la copia de seguridad." >> $REPORTE
echo "Son los siguientes :"$DIRECTORIOS_ADICIONALES >> $REPORTE
echo "Backup iniciado a las: "`date |awk '{ print $4 }'` >> $REPORTE
rm -rf $DESTINO/$NOMBRE_DIA-old.tar
sleep 2
mv $DESTINO/$NOMBRE_DIA.tar $DESTINO/$NOMBRE_DIA-old.tar
sleep 2
tar cvf $DESTINO/$NOMBRE_DIA.tar $DIRECTORIOS_BACKUP $DIRECTORIOS_ADICIONALES
#gzip $DESTINO/$NOMBRE_DIA.tar
echo "El fichero ocupa :"`du -sh $DESTINO/$NOMBRE_DIA.tar|awk '{ print $1 }'` >> $REPORTE
echo "Se ha realizado backup de los directorios:"$DIRECTORIOS_BACKUP >> $REPORTE
echo "La suma MD5 del fichero es:"`md5sum $DESTINO/$NOMBRE_DIA.tar|awk '{ print $1 }'` >> $REPORTE
echo "Esta cifra puede ayudarle a comprobar coherencias en caso de restaurar la copia." >> $REPORTE
if [ -f $DESTINO/$NOMBRE_DIA-old.tar ]; then
echo "El fichero de la semana anterior existe.Parece que todo esta en orden." >> $REPORTE
else
echo "El fichero de la semana anterior no existe." >> $REPORTE
echo "Es probable que todavia no se haya cumplido el ciclo de rotaciones de backups." >> $REPORTE
echo "Si continua leyendo este mensaje.Contacte con el Administrador." >> $REPORTE

fi
echo "Backup finalizado a las: "`date |awk '{ print $4 }'` >> $REPORTE

;;

esac
echo "-----------------------------" >> $REPORTE
echo "SysAdmin - Alberto Permuy Leal" >> $REPORTE
echo "Contact :" >> $REPORTE
echo "Email: email at dominio com" >> $REPORTE
echo "Mobile: +0034 666 666 66 " >> $REPORTE
echo "-----------------------------" >> $REPORTE
mail -s $ASUNTO $DESTINATARIO < $REPORTE

1 comentario:

Vieiro dijo...

Una alternativa para asignar la variable "$NOMBRE_DIA" sin tener que recurrir al bloque "case - esac" es con el parametro "%A" de "date", sustituyendo el bloque case por la linea "NOMBRE_DIA=$(date +%A)"

Probando directamente en la shell vemos los resultados.

www.vieiro.eu $ NOMBRE_DIA=$(date +%A)
www.vieiro.eu $ echo $NOMBRE_DIA
Luns
www.vieiro.eu $ date
Lun Abr 20 19:45:11 GMT 2009
www.vieiro.eu $