lunes, marzo 02, 2009

Hacer un script para un Backup en un equipo remoto

Esta práctica me la han pedido ya varías personas y pensaba que estaba colgada aquí y me he dado cuenta de que no, así que la voy a colgar por si alguien la necesita.. Consiste en realizar el backup de unos directorios concretos y mandarlo a un equipo remoto:

##Script de David Delgado santos
#!/bin/bash
##Antes de empezar a realizar toda las operaciones, tenemos que ubicarnos en el directorio donse se va a realizar las operaciones
cd /media/hda4/backup
##luego empezamos a declarar las variables necesarias, la primera varible declarada aquí es una variable que coja la fecha y le de un formato bonito
fecha=$(date +%d-%B-%Y)
##esta variable lo que hace es ponerle nombre al fichero, con el nombre de la máquina y la fecha de cuando se ha creado
nombre=`hostname`_$fecha.tar.bz2
##esta variable calcula el tamaño que pesa el directorio etc en kb
etc=`du -s /etc/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio home en kb
home=`du -s /home/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio var/lib en kb
varlib=`du -s /var/lib/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio var/log en kb
varlog=`du -s /var/log/ | awk '{print $1}'`
##calcula el espacio libre donde se va almacenar la copia de seguridad
espacio_libre=`df |grep hda4| awk '{print $4}'`
##realiza la operación para ver si hay espacio
realizarcopia=`expr $etc + $home + $varlib + $varlog - $espacio_libre`
##si el espacio libre es mayor que 0 se realizará la copia
if [ $realizarcopia -lt 0 ]; then
##comprime los directorios, que hemos decididos que deben hacer una copia de seguridad, con el nombre que hemos creado
tar cjf $nombre /etc /var/lib /var/log /home
##cuando se acaba de hacer la copia mostrará un mensaje diciendo que se ha realizado la comprimición.
echo "Se ha hecho con exito la copia de seguridad"
##ahora mira el espacio disponible en talut, la máquina donde se va almacenar la copia de respaldo
espaciotalut=$(ssh copia@192.168.1.51 df |grep sda3| awk '{print $4}')
##mira el tamaño que ha ocupado la copia local
tamano=`du $nombre | awk '{print $1}'`
##compara el tamaño del backup con el espacio disponible, si hay espacios disponible realizará la transferencia
if [ $tamano -lt $espaciotalut ]; then
##antes de mandar el backup, le mira el valor md5sum para comprobar que se haya pasado correctamente
valor=$(md5sum $nombre | awk '{print $1}')
##manda el backup a la otra máquina con el nombre
scp $nombre copia@192.168.1.51:$nombre
##cuando se haya echo muestra un mensaje diciendo que se ha realizado la copia
echo "Se ha pasado la copia de seguridad a talut"
##ahora mira el valor md5sum del backup de la máquina de talut 
valorexterior=$(ssh copia@192.168.1.51 md5sum $nombre | awk '{print $1}')
##si es el mismo del que hay en la máquina local mostrará un mensaje diciendo que se ha realizado la copia correctamente y se acaba el proceso del backup
if [ $valor = $valorexterior ]; then
echo "Se ha pasado la copia de seguridad correctamente"
else
##si no es el mismo mostrará un mensaje y se volverá a enviar
echo "No se ha podido pasar la copia de seguridad correctamente, se intentará de nuevo"
##creamos una varible contador que cuente las veces que se intenta mandar, por si en realidad hay problemas en la red y no se quede en un bucle infinito transferiendo el archivo
contador=0
##realizará el envio hasta que contador sea 3 que tres o los valores de md5sun sea iguales en la dos máquinas
while [  $probar != $valorexterior -o $contador -lt 3 ]; do
##mira el valor en la otra máquina
##realiza otra ves el envio del backup
scp $nombre copia@192.168.1.51:$nombre
##mira en valor en la máquina de talut de nuevo
valorexterior=$(ssh copia@192.168.1.51 md5sum $nombre | awk '{print $1}')
##incrementa el contador
   contador=`expr $contador + 1`
   done
##si el contador es igual a 3 mostrará un mensjae de que tiene problemas en la red
if [ $contador -eq 3 ]; then
echo "No se ha podido hacer la copia correctamente, pongase en contacto con el administrador de la red"
fi
fi
else
##si no hay espacio en talut cuando se realiza la comprobación de espacio en la máquina mostrará un mensaje
echo "No hay suficiente espacio en Talut"
fi
else
##si no hay espacio en la máquina local mostrará un mensaje diciendo que no hay espacio
echo "No hay suficiente espacio para hacer la copia de seguridad"
fi



##ahora para automatizar la tarea, introduciremos en el crontab una línea para que ejecute el script 1 vez al día a la 12 de la mañana. Para realizar esta operación que hacerla como superusuario ejecutamos el comando "crontab -e" y añadimos la línea "00 12 * * * sh /root/backup.sh" donde 00 es el minuto, 12 es la hora a la que se va a ejecutar y * * * es el día, mes y año en el que se va a ejecutar, lo dejamos con * para que se ejecute todos los días a la misma hora.

No hay comentarios: