[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

OT: comparto script de backups



Buenos días,

el otro día tuve que hacer un script de backup a medida para un
cliente. Os lo envío por si le puede servir a alguien. Para mi gusto
no es la mejor forma de hacerlo, pero si el cliente lo pide...

Seguramente se puede hacer lo mismo de muchas otras formas y de forma
más elegante, pero se ejecuta y no da errores :P

Qué hace el script?
Almacena los backups (incrementales cada día excepto los domingos, que
son completos) en una unidad NFS (se puede cambiar muy fácilmente) y
usa tambien el servidor NFS para crear los temporales.
El domingo tambien comprueba cuánto ocupan los datos sin comprimir.
Una vez acabado el script recibimos un mail con un pequeño informe.

Bueno, os dejo el script (leedlo antes, no lo ejecuteis sin antes
revisarlo, que uno no es perfecto y no se puede hacer responsable de
los posibles fallos a menos que seas el cliente :)

Créditos: me basé en
http://es.tldp.org/Manuales-LuCAS/SEGUNIX/unixsec-2.1-html/node108.html
para hacerlo

#!/bin/bash

######## Descripción:
#script que hace copias de seguridad incrementales diarias de los
directorios incluídos en directorios.txt
#Los domingos pero, las copias son completas
#La información es enviada por red a través de NFS.



#Montamos el directorio donde se almacenarán tanto los temporales como
los backups
mount 172.1.21.242:/ruta/servidor/nfs /mnt/backups

########  Variables:
TEMPORAL="/mnt/copies/tmp" #directorio que se usará como temporal
MAQUINA=`hostname` #nombre del servidor
FECHA=`date +%d-%m-%Y` #fecha para dar nombre a los backups
#MAXIMO: guarda el número de directorios a copiar
#NOMBRE_FICHERO: da nombre al backup
#ORIGEN: ruta absoluta de los directorios a copiar
#FILES: fitxeros que se copian
HOY=`date +%a` #da la abreviatura del día en que empiezan las cpias
DESTINO="/mnt/backups" #sitio donde se guardaran las copias
let ESPACIO=0 #variable para contar el tamaño que ocupan los
directorios a copiar


######## Funciones:


######## Obtenemos día y hora para los logs
function get_fecha_hora() {
	date '+%d/%m/%Y, %H:%M:%S'
	}

######## Comprime los .tar
function do_backup(){
	tar -cvf $TEMPORAL/$MAQUINA-$FECHA-$NOMBRE_FICHERO.tar $ORIGEN
	}

######## Calcula los MBs que ocupa la información a copiar sin comprimir
function get_ESPACIO(){
	let ESPACIO=$ESPACIO+`du $ORIGEN | tail -n 1 | awk {'print $1'}`
	#transformamos los bytes en MB
	let ESPACIO=$ESPACIO/1024
	}

######## Selecciona, de cada directorio, qué ficheros y subdirectorios
se deben copiar.
######## Tambien tiene en cuenta el día de la semana para hacer las
copias incrementales.
######## Finalmente, en el caso de ser domingo calcula el tamaño de la
información que se copia sin comprimir.
function get_listado(){
       MAXIMO=`cat /home/admin/directorios.txt | wc -l`
       for I in $(seq 1 $MAXIMO)
               do
               ORIGEN=`cat -n /home/admin/directorios.txt | grep $I |
awk {'print $2'}`
               if [ $HOY = "do" ];
               	then get_ESPACIO
		fi
               NOMBRE_FICHERO=`echo $ORIGEN|awk -F/ {'print $NF'}`
		case $HOY in
		"lu")
			#lunes..sabado: incremental
			FILES=`find $ORIGEN -mtime 1 -print`
			;;
		"ma")
			FILES=`find $ORIGEN -mtime 2 -print`
			;;
		"mi")
			FILES=`find $ORIGEN -mtime 3 -print`
			;;
		"ju")
			FILES=`find $ORIGEN -mtime 4 -print`
			;;
		"vi")
			FILES=`find $ORIGEN -mtime 5 -print`
			;;
		"sa")
			FILES=`find $ORIGEN -mtime 6 -print`
			;;
		"do")
			#backup completo
			FILEs=$ORIGEN
			;;
		esac
		echo -n -e "Compactación de $ORIGEN: " >> $TEMPORAL/temp.log &&
get_fecha_hora >> $TEMPORAL/temp.log
		do_backup
               done
      }


######## Programa principal:

#Por si acaso no existe el directorio temporal
if [ ! -d $TEMPORAL ];
	then
		#no existe $TEMPORAL
		mkdir -p $TEMPORAL
		chmod 700 $TEMPORAL
	else
		rm -rf $TEMPORAL
		mkdir -p $TEMPORAL
		chmod 700 $TEMPORAL
	fi;
echo -n -e "Inicio Backup: " > $TEMPORAL/temp.log && get_fecha_hora >>
$TEMPORAL/temp.log
get_listado
#Comprimimos los .tar para obtener .tar.gz
cd $TEMPORAL
ls -lah *.tar >> $TEMPORAL/temp.log
gzip *.tar
echo " " >> $TEMPORAL/temp.log
mv *.tar.gz $DESTINO
echo -n -e "Fin Backup: " >> $TEMPORAL/temp.log && get_fecha_hora >>
$TEMPORAL/temp.log

#enviamos los logs por mail
cat $TEMPORAL/temp.log | mail mi@direccion -s "Backup de $MAQUINA"


if [ $HOY = "do" ];
	then
	echo "La info a copiar de $MAQUINA ocupa ${ESPACIO}MBs" | mail
mi@direccion -s "Espacio de $MAQUINA"
       fi


umount -f /mnt/backups

--
Adrià García-Alzórriz
adriagm@gmail.com



Reply to: