martes, 16 de marzo de 2010

Script Bash de copia de seguridade de Gnu a Samba

# Copyright 2010 Adrián Chapela, Manuel Cameselle
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.

# ==============================================================
# Copia de seguridade GNU de disco local a unidade de rede Samba v1.1
# ==============================================================
#
# O script, copia DIR_CONFIGURACION e copia comprimidos DIR_DOCUMENTOS, DIR_CORREO e DIR_ESCRITORIO por rede
# mediante Samba a //SMB_SERVER/SMB_SHARE. Suponse que o usuario ten como login 'usuario1', que existe o directorio
# local '/mnt/snap', que o servidor Samba chámase 'snap' que ten unha carpeta no raíz chamada 'backups' e que
# o acceso é mediante un usuario con login 'usuario_samba' con permiso de acceso total a dito subdirectorio.
# Na variable 'limite_copias' indícase a antigüedade máxima das copias (eliminaránse as que excedan).
# Suponse que o script executarase dende a propio directorio no que está. Se non hai que cambiar 'LOG_FILE'.
# Ó acabar a copia ordéase o apagado do equipo.
#
# O uso recomendado é:
# 1.- Pechar a sesión gráfica (para asegurar que non perdamos nada cando apaguemos o equipo)
# 2.- Lanzar o script
# Para non ter problemas de permisos, podemos lanzar o script como root, pero non convén deixar aberta a sesión de root,
# así que hay que bloqueala ou pechala sen que o proceso de copia morra. Para facer isto nunha sesión de texto:
# 1.- Entramos como root
# 2.- executamos 'screen'
# 3.- Lanzamos o script (p.e. ./copia_seguridade_gnu_a_samba.sh usuario1)
# 4.- Saímos de screen con 'CTRL+a d'
# 4.- Saímos da sesión de root con 'exit'

#!/bin/bash
# Copia de seguridade

#Recibe o nome (login) do usuario do que queremos facer a copia.

#Configuracións USUARIO
usuario=$1
DIR_DOCUMENTOS=/home/$1/Documentos
DIR_CORREO=/home/$1/.mozilla-thunderbird
DIR_ESCRITORIO=/home/$1/Escritorio
DIR_CONFIGURACION=/etc


#Posible mellora: xerar un array de directorios para poder engadir ou quitar directorios fácilmente
#Posible mellora: xerar un array de directorios/ficheiros para excluir da copia

#Ficheiros LOG
LOG_FILE=/var/log/$0.log
#OLLO: o script debe executarse dende o directorio onde está, porque senón $0 collería a ruta completa...
ERROR_LOG_FILE=/tmp/erro

MOUNT_ERROR=/tmp/mount_error

# Samba datos
SMB_USER=administrador
#Se non cubrimos a password (recomendado) pedirase por consola...
SMB_PWD=
SMB_MOUNT=/mnt/snap
SMB_SERVER=snap
SMB_SHARE=backups

# Variables de control
MONTADO=0
fin=0
x=0
num=10
cantidade_copias=0
limite_copias=5

#########
#Funcións
#########
function imprime {
#imprime en pantalla o texto e ademais o engade a ficheiro

echo $1 #se queremos recibir unha data aquí ten que estar nun formato "compacto" coma `date +%d-%m-%Y_%H:%M:%S`
echo $1 >>$2
}

function copia {
#copia o contido indicado (opcionalmente con compresión)
#Parámetros:
# $1 -> nome do directorio destino (doc, escritorio, correo, etc)
# $2 -> ruta do directorio orixe (DIR_DOCUMENTOS, DIR_CORREO, DIR_ESCRITORIO)
# $3 -> tipo de copia (f=tar.gz, d=directorio)

if [ ! -d "$SMB_MOUNT/clientes/$usuario/$1" ]; then
imprime "O directorio $SMB_MOUNT/clientes/$usuario/$1 non existía -> creámolo." $LOG_FILE
mkdir $SMB_MOUNT/clientes/$usuario/$1
fi

imprime `date +%d-%m-%Y_%H:%M:%S`" - Copiando '$1': '$2'..." $LOG_FILE
if [ $3 = "f" ]; then
tar cvfz $SMB_MOUNT/clientes/$usuario/$1/$1-`date +%d-%m-%Y`.tar.gz $2 2> $ERROR_LOG_FILE
elif [ $3 = "d" ]; then
mkdir $SMB_MOUNT/clientes/$usuario/$1/$1-`date +%d-%m-%Y`
cp -vRu $2/* $SMB_MOUNT/clientes/$usuario/$1/$1-`date +%d-%m-%Y`/ 2> $ERROR_LOG_FILE
fi
cat $ERROR_LOG_FILE >> $LOG_FILE
imprime `date +%d-%m-%Y_%H:%M:%S`" - '$1' copiado." $LOG_FILE

#Cantidade de copias
cantidade_copias=`ls -l $SMB_MOUNT/clientes/$usuario/$1/ |grep $1- |wc -l`
if [ $cantidade_copias -gt $limite_copias ]; then
imprime `date +%d-%m-%Y_%H:%M:%S`" - Cantidade de copias de '$1' maior ao límite. Borrando antigas..." $LOG_FILE
cantidade_copias=0
rm -rf `find $SMB_MOUNT/clientes/$usuario/$1 -type $3 -mtime +$limite_copias` 2>> $LOG_FILE
fi
}

#################
#Script principal
#################
imprime `date +%d-%m-%Y_%H:%M:%S`" - Iniciando aplicación..." $LOG_FILE

if [ "$1" != "" ]; then
while [ $MONTADO -lt 1 ]; do
if [ "$SMB_PWD" != "" ]; then
mount -t smbfs -o username=$SMB_USER,password=$SMB_PWD //$SMB_SERVER/$SMB_SHARE $SMB_MOUNT &> $MOUNT_ERROR
else
echo "Introduza contrasinal de '"$SMB_USER"' en '"$SMB_SERVER"'"
mount -t smbfs -o username=$SMB_USER //$SMB_SERVER/$SMB_SHARE $SMB_MOUNT &> $MOUNT_ERROR
fi

cat $MOUNT_ERROR >> $LOG_FILE

MONTADO=`mount |grep //$SMB_SERVER/$SMB_SHARE| wc -l`

if [ $x -gt $num ]; then
MONTADO=1
fi

sleep 5

let x=x+1

if [ $x -gt "1" ]; then
imprime "Reintento "$x $LOG_FILE
imprime "########################" $LOG_FILE
fi
done

if [ $x -lt $num ]; then
if [ ! -d "$SMB_MOUNT/clientes/$usuario" ]; then
imprime "O directorio $SMB_MOUNT/clientes/$usuario non existía -> creámolo." $LOG_FILE
mkdir $SMB_MOUNT/clientes/$usuario
fi

#Documentación, proxectos variados (tar.gz)
if [ "$DIR_DOCUMENTOS" != "" ]; then
copia "doc" $DIR_DOCUMENTOS "f"
fi

#Correo electrónico (tar.gz)
if [ "$DIR_CORREO" != "" ]; then
copia "correo" $DIR_CORREO "f"
fi

#Carpeta Escritorio (tar.gz)
if [ "$DIR_ESCRITORIO" != "" ]; then
copia "escritorio" $DIR_ESCRITORIO "f"
fi

#Configuración equipo (copia directorio sen compresión)
if [ "$DIR_CONFIGURACION" != "" ]; then
copia "etc" $DIR_CONFIGURACION "d"
fi

umount $SMB_MOUNT
else
imprime `date +%d-%m-%Y_%H:%M:%S`" - Erro montando Samba - Anulamos copia." $LOG_FILE
fi

imprime `date +%d-%m-%Y_%H:%M:%S`" - Finalizamos aplicación e ordeamos o apagado do equipo..." $LOG_FILE

# Apagamos o equipo
shutdown -h now "Apagado por copia de seguridade"
else
imprime `date +%d-%m-%Y_%H:%M:%S`" - Debe indicar o usuario do que quere facer a copia - Anulamos copia." $LOG_FILE

imprime `date +%d-%m-%Y_%H:%M:%S`" - Finalizamos aplicación." $LOG_FILE
fi

1 comentario:

Andrés Estévez dijo...

qué bien lo pasáis!!! :D