Backup incrementale con rsync

Nell’epoca dell’informatica i dati hanno sempre rappresentato una questione fondamentale e da diversi anni ormai si investono fonti in sistemi di back-up dei dati

Questo script vuole essere un punto di partenza per creare un sistema di back-up veloce e facile da mantenere sfruttando la potenza di rsync. Lo script in uscita invia una mail con il log dell’oprerazione di salvataggio.

L’uso dello script è molto semplice, basta salvare il code sottostante in un file di testo e dargli i pernessi di esecuzione.

#!/bin/sh

#Piccolo sistema di backup
#Richiede rsync e un server mail tipo sendmail
#usa mail per inviare l email di notifica
#Ver 0.1

######## SETTINGS ########

MAKER=`whoami`

# Destinatario mail di backup, i destinatari vanno separati da virgola (,)
DEST="user1@dominio1,user2@dominio1" 

# FORMATO DATA
DATE=`date +"%d-%m-%y"` 

#Device e dir dove salvare il back_up
DEV="/mnt/dati"
DIR_BACKUP="backup"

BIN_NAME="rsync"
BIN=`which $BIN_NAME`

#elenco directory del quale si vuole fare il basckup, + directory vanno separate a spazio
#NB và inserito il path completo
BKPATH="/boot /root /home/user"

#File di log
LOG="$DEV/$DIR_BACKUP/backup-$DATE.txt"

#File che contiene il corpo della mail
MLF="/tmp/mlbackup"

#monta, nel caso sia necessario il device dove eseguire il device
#la regola di montaggio deve essere contenuta in /etc/fstab
#esegue controlli su montaggio corretto ed esistenza dir di backup
MNT(){

    TEST=`mount | grep $DEV 2>/dev/null`
    echo -e "nVerifico se il device ($DEV) è già montato! \n" >>$MLF
    if [ -z "$TEST" ];then  #restituisce vero se $TEST è vuoto
		mount $DEV  2>/dev/null
		RMT=`echo $?` #se il mount và a buon fine restituisce 0
		if [ "$RMT"=="0" ];then
    		echo -e "Device montato, proseguo! \n" >>$MLF
			MNTR=0
		else
			echo -e "Non sono riuscito a montare $DEV \n" >>$MLF
			MNTR=1
		fi
    else
		echo -e "Il device $DEV risulta già montato, proseguo \n" >>$MLF
		MNTR=0
    fi

	if [ "$MNTR"=="0" ];then
		if [ ! -d $DEV/$DIR_BACKUP ]; then
			mkdir -p $DEV/$DIR_BACKUP 2>/dev/null
			RMD=`echo $?` #se il mkdir và a buon fine restituisce 0
			if [ "$RMD"=="0" ];then
				echo -e "Dir $DEV/$DIR_BACKUP creta. \n" >>$MLF
				MNTR=0
			else
				echo -e "No sono riuscito a creare $DEV/$DIR_BACKUP. \n" >>$MLF
				MNTR=1
			fi
		else
			echo -e "$DEV/$DIR_BACKUP esiste già.\n" >>$MLF
			MNTR=0
		fi
	else
		echo -e "Non posso creare $DEV/$DIR_BACKUP:\n\t - $DEV non montato" >>$MLF
		MNTR=1
	fi

}

#Funzione nel caso non serva montare il device
NOMNT(){

	if [ ! -d $DEV/$DIR_BACKUP ]; then
		mkdir -p $DEV/$DIR_BACKUP 2>/dev/null
		RMD=`echo $?` #se il mkdir và a buon fine restituisce 0
		if [ "$RMD"=="0" ];then
			echo -e "Dir $DEV/$DIR_BACKUP creta. \n" >>$MLF
			NMNTR=0
		else
			echo -e "No sono riuscito a creare $DEV/$DIR_BACKUP.\n" >>$MLF
			NMNTR=1
		fi
	fi

} 

#Funzione che esegue il backup
RSYNC(){

	DIR="`echo $DEV | sed -e 's/\/$//'`"
	echo -e "\t Attendi....backup in corso";
	$BIN -av $BKPATH \
		$DIR/$DIR_BACKUP/ \
		--progress --delete --links &> $LOG
	RSR=`echo $?`
	if [ "$RSR"=="0" ];then
		echo -e "nBackup eseguito con sucesso \n">>$MLF
	else
		echo -e "\n Backup non riuscito \n">>$MLF
	fi

}

#Funzion che controlla l'esistenza del file $LOG
RSLOG(){

	if [ -f $LOG ];then
		RSLR=0
	else
		echo -e "Il file $LOG non è stato trovato in $LOG \n" >>$MLF
		RSLR=1
	fi

}

#Funzione per l'invio della mail
MAIL(){ 

	case $RSLR in
		0)
			less $MLF | mail -s "Back-up server del $DATE" -a $LOG $DEST
			;;
		*)
			less $MLF | mail -s "Back-up server del $DATE" $DEST
			;;
	esac
	#rimuove il file $MLF
	rm $MLF

}

#MAIN
if [ "$MAKER" == "root" ]; then
	echo -e "Ecco i log del backup del $DATE \n" >>$MLF
	case $1 in
		mount)
			echo -e "$0 utilizzato con il parametro mount \n" >>$MLF
			MNT
			if [ "$MNTR"=="0" ];then
				RSYNC
				if [ "$RSR"=="0" ];then
					RSLOG
					MAIL
					exit 0
				else
					RSLOG
					MAIL
					exit 1
				fi
			else
				RSLOG
				MAIL
				exit 1
			fi
			;;
		nomount)
			echo -e "$0 utilizzato con il parametro nomount \n" >>$MLF
			NOMNT
			if [ "$NMNTR"=="0" ];then
				RSYNC
				if [ "$RSR"=="0" ];then
					RSLOG
					MAIL
					exit 0
				else
					RSLOG
					MAIL
					exit 1
				fi
			else
				RSLOG
				MAIL
				exit 1
			fi
			;;
		*)
			echo "Devi usare $0 {mount|nomount} "
			exit 1
			;;
	esac
else
	echo "tDevi essere root per eseguire $0 "
	exit 1
fi

Lo script deve essere eseguito con il paramentro mount o nomount che servono a montare o non montare il device dove deve essere salvato il back-up ($DEV). NB: affinchè l’opzione di mantaggio vada a buon fine è necesario che il file /etc/fstab sia ben configurato.

Prima di essere lanciato è necessario personalizzare alcune variabili: $DEST, $DEV, $DIR, $BKPATH. Queste contengono rispettivamente i destinatari della mail, il device e la directory dove verranno salvati i file e le directory delle quli eseguire il back-up.

Segnalate pure eventuali consigli e migliorie.

Lo script è disponibile per il download sul server FTP.

Lascia un commento