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 [EMAIL PROTECTED] -s "Backup de $MAQUINA"


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


umount -f /mnt/backups

--
Adrià García-Alzórriz
[EMAIL PROTECTED]

Responder a