Lo script proposto da Tongiu esegue il backup dei file contenuti in delle directory specificate nel file di configurazione
Lo script backup esegue il backup dei file contenuti in delle directory specificate nel file di configurazione /usr/local/etc/backup.conf dalle variabili SOURCE[1] SOURCE[2] etc. Per aggiungere una directory di cui fare il backup basta aggiungere le corrispondenti variabili nel file di configurazione.
Il backup sarà un backup totale, nel giorno della settimana specificato nella parte generale del file di
configurazione dalla variabile GIORNO_BACK_TOTALE. Il giorno della settimana deve essere specificato in
inglese secondo le
convenzioni del comando "date" (Sun = Sunday Mon = Monday etc).
Tutti gli altri giorni della settimana verrà fatto un backup incrementale, salvando solamente i file
modificati durante il giorno in corso. Affinchè tutto funzioni a dovere occorre lanciare lo script prima di mezzanotte.
Io eseguo lo script con cron tutte le sere alle 22.30 mediante l'aggiunta della riga : 22 30 * * * /usr/local/bin/backup 1> /root/log_backup in /var/spool/cron/crontabs/root. Ho scelto di reindirizzare l'output in /root/log_backup ma per chi non lo ritenesse necessario si può
reindirizare tutto a /dev/null.
I file di backup saranno messi sul disco specificato nel file di configurazione con la variabile DISCO_DI_BACKUP.
Ovviamente è il caso che sia un disco diverso da quello in cui ci sono i dati di cui fare i backup. Nel mio caso uso il disco di un altro PC.
E' necesario che ci sia una riga in fstab con i parametri per fare il mount di /mnt/backup. Viene generato un file di backup per ciascuna directory indicata nel file di configurazione. I file di backup
generati hanno i nomi indicati nelle variabili FILE_BACKUP[ .. ]. Mediante la variabile "date" i nomi generati comprenderanno anche l'indicazione del giorno in cui il backup è stato eseguito. I nomi saranno del tipo :
report_Mon_21Jun04.tgz Per ciascuna directory sorgente (in cui ci sono i file di cui fare il backup) viene generata una corrispondente
directory in /mnt/backup il cui nome deve essere specificato nelle variabili DIR_BACKUP[..]
Lo script genera un file di log per ciascuna directory di cui si è fatto il backup. Il file di log viene inserito
nella stessa directory in cui viene salvato il file di backup.
Le righe da aggiungere al file /usr/loca/etc/backup.conf per aggiungere la n-esima directory sono le seguenti:
####### N-ESIMA DIRECTORY ########### SOURCE[n]="/home/directory_n" DIR_BACKUP[n]=$DISCO_DI_BACKUP"/directory_n" FILE_BACKUP[n]="directori_n_`date +"%a_%d%b%y"`.tgz"
con n= 1, 2, 3, etc
Il file di configurazione è fatto per fare il backup delle directory
/home/report /home/directory2
nel disco /mnt/backup. I file di backup saranno:
/mnt/backup/report/report_Mon_21Jun04.tgz (oggi è il 21 giugno)
e
/mnt/backup/directory2/directory2_Mon_21Jun04.tgz
Lo script usa tar e zip per fare la compressione. Il prossimo passo è usare DAR
# /usr/local/etc/backup.conf
# file di configurazione di /usr/local/bin/backup
# by Tongiu GIUGNO 2004
###### PARTE GENERALE ##############
# disco su cui mettere i file di backup
DISCO_DI_BACKUP="/mnt/backup"
# giorno della settimana in cui fare il backup totale
# in tutti gli altri giorni si fa il backup incrementale
GIORNO_BACK_TOT="Sun"
###### PRIMA DIRECTORY ###########
# directory dove ci sono i file di cui si vuole fare il backup
SOURCE[1]="/home/report"
# directory in cui ci saranno i file risultato del backup
DIR_BACKUP[1]=$DISCO_DI_BACKUP"/report"
# file risultato del backup
FILE_BACKUP[1]="report_`date +"%a_%d%b%y"`.tgz"
####### SECONDA DIRECTORY ###########
SOURCE[2]="/home/directory_2"
DIR_BACKUP[2]=$DISCO_DI_BACKUP"/directory_2"
FILE_BACKUP[2]="directory_2_`date +"%a_%d%b%y"`.tgz"#!/bin/sh
# esegure questo script con cron aggiungendo
# 22 30 * * * /usr/local/bin/backup 1> /root/log_backup
# in /var/spool/cron/crontabs
# così esegue il backup ogni sera alle 22.30
# e killare e riavviare cron
# by Tongiu GIUGNO 2004
esegui ()
{
SOURCE=$1
DIR_BACKUP=$2
FILE_BACKUP=$3
GIORNO_BACK_TOT=$4
LOG=$DIR_BACKUP"/log"
GIORNO=$(date '+%a')
if [ $GIORNO = $GIORNO_BACK_TOT ]; then
# se fa il backup totale cancella il log
rm -f $LOG
touch $LOG
fi
DATA=$(date '+%Y%m%d' )
# se non esiste la directory dove mettere il file di backup la crea
if [ ! -d $DIR_BACKUP ]; then
mkdir $DIR_BACKUP
echo Directory di backup $DIR_BACKUP non esisteva - directory creata >> $LOG
fi
echo >> $LOG
echo ++++++++++++++++++ BACKUP di $(date '+%c' ) +++++++++++++++++++++ >> $LOG
echo >> $LOG
DESTIN=$DIR_BACKUP"/"$FILE_BACKUP
#rimuove il backup della settimana scorsa se esiste
if [ -e $DIR_BACKUP"/"*$GIORNO* ]; then
echo esisteva backup $DIR_BACKUP"/"*$GIORNO* - rimuovo >> $LOG
rm $DIR_BACKUP"/"*$GIORNO*
fi
if [ $GIORNO != $GIORNO_BACK_TOT ]
then
# il backup incrementale
echo "backup incrementale" tar czvNf $DATA $DESTIN $SOURCE >> $LOG
tar czvNf $DATA $DESTIN $SOURCE 2>> $LOG
else
# fai il backup totale
echo "backup totale" tar czvf $DESTIN $SOURCE >> $LOG
tar czvf $DESTIN $SOURCE 2>> $LOG
fi
echo >> $LOG
echo ++++++++++++++++ FINE BACKUP +++++++++++++++++++++ >> $LOG
echo >> $LOG
}
######################
####### MAIN #########
######################
# prende le variabili dal file di configurazione in /usr/local/etc
source /usr/local/etc/backup.conf
# se il disco non è montato fa il mount
# opzione -q di grep elimina l output ma mantiene le condizioni vero e falso
if !(grep -q $DISCO_DI_BACKUP /proc/mounts) ; then
mount $DISCO_DI_BACKUP
fi
# conta quante volte è presente la variabile FILE_BACKUP per sapere
# quante sono le directory di cui deve fare il backup
NUM=$(grep -c FILE_BACKUP /usr/local/etc/backup.conf)
for i in `seq 1 $NUM`;
do
esegui "${SOURCE[$i]}" "${DIR_BACKUP[$i]}" "${FILE_BACKUP[$i]}" "$GIORNO_BACK_TOT"
done
umount $DISCO_DI_BACKUP