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 sistemaUSER="$LOGNAME"# Assegna alla directory di salvataggio il nome# del proprietario della homeDIR="Dati_$USER"# Nome dell'archivio degli snapshotARC="Old_Files_$USER"# Recupera il numero del giorno del meseDAY_OF_MONTH=`LANG=it_IT date +%d`# Recupera il nome del meseNAME_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-ge0]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"]]thenecho""echo"L'unità disco $DEVè collegata."elseecho""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."exit1fi # 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à collegateNUM_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]thenecho""echo"ERRORE, SPAZIO INSUFFICIENTE!"echo"Controllo se ci sono altre unità disco collegate."continueelseecho""echo"SPAZIO DISPONIBILE" RSYNC fidone} 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-ge0]doif[-e"$DEV/$ARC/${MONTH[$OLDMONTH]}"]thenecho""TEST=1elseecho""TEST=2fi case$TESTin1)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"]thenecho""echo"Directory presente!"echo""elseecho""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"]thenecho""echo"UNO SNAPSHOT CON QUESTA DATA ESISTE!"echo"PROSEGUO CON IL PROGRAMMA"echo""elseecho""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]doecho"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 ]thenecho"" ERASE elseecho"" CHECK fi