Script per sincronizzare i dati della home su uno o più dischi esterni

Ven, 29/04/2011 - 22:53

Script per sincronizzare i dati della home su uno o più dischi esterni

Inviato da Gollum 2 commenti

Lo script è stato studiato per creare backup sincronizzati delle directory contenute nella home dell'utente, fornendo la possibilità di scegliere quali siano le dir che si vuole sincronizzare usando la variabile FOLDER contenuta nella funzione RSYNC. Nella funzione CHECK vengono rilevati e analizzati i dischi collegati al sistema permettendo il proseguo del backup qualora vi siano i permessi e lo spazio sufficiente per la scrittura dei dati. Terminata la fase di backup gli snapshot vengono creati una sola volta in una cartella separata dove la cronologia mensile ai vecchi file sarà sempre disponibile, qualora volessimo recuperare i file non più presenti nell'attuale backup. Il primo giorno del mese la funzione ERASE provvede ad eliminare gli snapshot più vecchi di 30 giorni.Naturalmente è possibile automatizzare i propri backup usando il tool cron, nel mio caso sincronizzo i miei dati ogni ora. In futuro cercherò, per quanto nelle mie possibilità, di aggiungere alcuni miglioramenti e qualora, tra gli utenti ci fosse qualcuno intenzionato ad utilizzare lo script e avesse dei consigli da dare è naturalmente il benvenuto.

#! /bin/bash
 
# Versione Script	: 6.0
# Autore		: Antonello Collini, gollum.suseit@gmail.com
# Data di creazione	: 01-set-2010
# Ultima Revisione	: 05-mar-2012
 
# Recupera il nome dell'utente di sistema
USER="$LOGNAME"
# Assegna alla directory di salvataggio il nome
# del proprietario della home
DIR="Dati_$USER"
# Nome dell'archivio degli snapshot
ARC="Old_Files_$USER"
# Recupera il numero del giorno del mese
DAY_OF_MONTH=`LANG=it_IT date +%d`
# Recupera il nome del mese
NAME_OF_MONTH=`LANG=it_IT date +%B`
# Recupera il numero del mese.
MONTH_OF_YEAR=`LANG=it_IT date +%m | sed 's/^0//'`
 
 
CHECK () {
	# Assegna un numero al totale dei dischi montati dal file temporaneo.
	NUM_DEV=`wc /tmp/device-$USER.lst | awk '{print $1}'`
	echo ""
	echo "VERIFICO LE UNITA DISCO COLLEGATE AL SISTEMA."
	# Itera il controllo dello spazio sui dischi finchè non ci sono più drive da controllare.
	while [ $NUM_DEV -ge 0 ]
	do
		# Recupera il nome del primo disco presente nella lista.
		DEV=`head -n1 /tmp/device-$USER.lst`
		# Recupera la dimensione in blocchi da 1M della directory home.
		DIR_SIZE=`df -m $HOME | sed '1d' | awk '{print $3}'`
		# Recupera lo spazio disponibile in blocchi da 1M del disco analizzato.
		DISP_SIZE=`df -m $DEV | sed '1d' | head -n1 | awk '{print $4}'`
		# Se la stringa DEV non sia nulla e che sia scrivibile
		# nel caso le due condizioni siano entrambe false il programma
		# restituisce un errore.
		if [[ -n "$DEV" && -w "$DEV" ]]
		then
			echo ""
			echo "L'unità disco $DEV è collegata."
		else
			echo ""
			echo "Il sistema non ha rilevato altre unità disco."
			echo "Oppure non sono sufficienti i permessi per accedervi."
			echo ""
			echo "IMPOSSIBILE PROSEGUIRE CON IL BACKUP."
			exit 1
		fi
 
		# Modifica il file device-user.lst eliminando di volta
		# in volta la prima riga contenente il nome di un disco
		# collegato.
		`sed -i -e '1d' /tmp/device-$USER.lst >> /tmp/device-$USER.lst`
		# Conta il numero delle unità collegate
		NUM_DEV=$((NUM_DEV--))
 
		# Se la misura in blocchi della home è maggiore di quella
		# della partizione del disco esterno il programma restituisce
		# un errore e passa al disco successivo (se esite) altrimenti
		# termina il programma.
		echo ""
		echo "VERIFICO LA DIMENSIONE DELLO SPAZIO DISPONIBILE SULL'UNITA."
		if [ $DIR_SIZE -ge $DISP_SIZE ]
		then
			echo ""
			echo "ERRORE, SPAZIO INSUFFICIENTE!"
			echo "Controllo se ci sono altre unità disco collegate."
			continue
		else
			echo ""
			echo "SPAZIO DISPONIBILE"
			RSYNC
		fi
	done
}
 
ERASE () {
# Elenco da cui ricavare il nome del mese per creare oppure eliminare gli Snapshot.
	MONTH=("gennaio"
	"febbraio"
	"marzo"
	"aprile"
	"maggio"
	"giugno"
	"luglio"
	"agosto"
	"settembre"
	"ottobre"
	"novembre"
	"dicembre"
)
# Recupera il nome del primo disco presente nella lista.
DEV=`head -n1 /tmp/device-$USER.lst`
# Toglie al numero del mese corrente un valore corripsondente
# ai mesi di cui si vuole mantenere le copie di backup.
OLDMONTH=$((MONTH_OF_YEAR-3))
# Itera il controllo sugli Snapshot da eliminare
# fino a quando il numero del mese è diverso da quello corrente.
	while [ $OLDMONTH -ge 0 ]
	do
		if [ -e "$DEV/$ARC/${MONTH[$OLDMONTH]}" ]
		then
			echo ""
			TEST=1
		else
			echo ""
			TEST=2
		fi
 
		case $TEST in
		1) echo "Lo Snapshot di ${MONTH[$OLDMONTH]} non è stato eliminato."
		echo "Eliminazione"
		rm -rf "$DEV/$ARC/${MONTH[$OLDMONTH]}"
		;;
		2) echo "Lo Snapshot di ${MONTH[$OLDMONTH]} è stato eliminato!"
		;;
		esac
 
		OLDMONTH=$((OLDMONTH-1))
done
 
# Richiama la funzione CHECK
CHECK
}
 
RSYNC () {
# Controlla l'esistenza della directory finale per il
# salvataggio dei file in caso positivo prosegue con la
# sincronizzazione, altrimente provvede a crearla onde
# permettere il proseguo del programma.
	 echo ""
	 echo "CONTROLLO L'ALBERO DELLA DIRECTORY $DIR"
	 if [ -e "$DEV/$DIR" ]
	 then
		 echo ""
		 echo "Directory presente!"
		 echo ""
	 else
		 echo""
		 echo "Directory mancante, provvedo a crearla!"
		 mkdir -p "$DEV/$DIR"
	 fi
 
# Controlla l'esistenza dello Snapshot giornaliero.
# In caso positivo il programma prosegue altrimenti,
# provvederà a creare una copia dei vecchi file.
#
if [ -e "$DEV/$ARC/$NAME_OF_MONTH/$DAY_OF_MONTH" ]
then
	echo ""
	echo "UNO SNAPSHOT CON QUESTA DATA ESISTE!"
	echo "PROSEGUO CON IL PROGRAMMA"
	echo ""
else
	echo ""
	echo "CREO UNO SNAPSHOT AI VECCHI FILE."
	echo ""
	mkdir -p "$DEV/$ARC/$NAME_OF_MONTH"
	cp -al "$DEV/$DIR/" "$DEV/$ARC/$NAME_OF_MONTH/$DAY_OF_MONTH"
fi
 
#########################################
#INSERIRE NELLA VARIABILE FOLDER LE     #
#CARTELLE DELLA HOME CHE SI VOGLIONO    #
#SINCRONIZZARE.                         #
#########################################
FOLDER=(bin Documenti Immagini Musica Scaricati Scrivania Video)
# Recupera il numero delle cartelle contenute nell'array FOLDER.
VAR=${#FOLDER[*]}
COUNT=0
 
# Itera il processo di sincronizzazione finchè il numero
# delle cartelle da sincronizzare sarà maggiore della
# variabile contatore.
while [ $COUNT -lt $VAR ]
do
	echo "Sincronizzo i file della cartella: ${FOLDER[$COUNT]}"
	rsync -ra "$HOME/${FOLDER[$COUNT]}" --delete "$DEV/$DIR/"
	COUNT=$((COUNT+1))
done
}
 
# Recupera il nome dei dischi montati sul sistema e li salva
# un file temporaneo nella dir /tmp.
`df | grep /media/ | awk '{print $6}' > /tmp/device-$USER.lst`
 
# Verifica il primo giorno del mese, nel caso il test
# sia positivo crea un archivio tar dei file del mese
# concluso. "Scegliere se eliminare il backup più vecchio
# oppure crearne uno snapshot."
if [ $DAY_OF_MONTH == 01 ]
 then
	 echo ""
	  ERASE
  else
	  echo ""
	  CHECK
  fi





Commenti

Ritratto di Suse98
#1

Inviato da Suse98 il Lun, 16/05/2011 - 15:11.

Re: Script per sincronizzare i dati della home su uno o più ...

Non riesco a capire come funziona...
Non sono pratico di script...

SUSE LINUX Rilascio 12.3 (Dartmounth) KDE 4.10 && GNOME 3.8



Ritratto di wal7er
#2

Inviato da wal7er il Mer, 01/06/2011 - 09:45.

Re: Script per sincronizzare i dati della home su uno o più ...

L'idea e buona ma c'è già rsync che, oltre ad effettuare sincronizzazioni in remoto, funziona con directory locali.
In questo modo non ti devi preoccupare di fare tutto a mano (creazione/controllo directory, controllo esistenza files, ecc...).

HP Pavilion dv5-1110el powered by OpenSUSE 13.2 64bit

http://linuxcounter.net/cert/432576.png