View previous topic :: View next topic |
Author |
Message |
spugna Tux's lil' helper
Joined: 26 Nov 2004 Posts: 97
|
Posted: Thu Mar 09, 2006 4:42 pm Post subject: [SCRIPT] I miei script di backup |
|
|
Ciao a tutti, oggi ho voglia di intasare il forum con la mia ultima invenzione: gli script di backup.
Questa è la mia prima esperienza di scripting in bash, quindi siate clementi.
Il programmino in questione è stato inserito in questo scenario:
- Samba Server con supporto ACL
- Area storage principale (SATA RAID 5 160 GB)
- Area backup (3 dischi da 200 GB cad.)
Il tutto è nato perché al cliente "serviva" di backuppare:
Settimana Pari
Settimana1 Completo
Martedi1 Diff. Settimana1
Mercoledi1 Diff. Settimana1
Giovedi1 Diff. Settimana1
Venerdi1 Diff. Settimana1
Sabato1 Diff. Settimana1
Settimana Dispari
Settimana2 Completo
Martedi2 Diff. Settimana2
Mercoledi2 Diff. Settimana2
Giovedi2 Diff. Settimana2
Venerdi2 Diff. Settimana2
Sabato2 Diff. Lunedi2
Per l'occasione ho pensato di utilizzare DAR, visto che ha un buon supporto per le acl (su filesystem Ext3). Inoltre risulta molto facile eseguire backup differenziali.
Il primo script è questo e si occupa di eseguire i backup:
Code: |
#!/bin/bash
#File /usr/local/bin/dar_backup.sh
##############################################################################################
# DBP - Dar Backup Program
# Versione: 0.0.1
# Data: 15/06/2005
##############################################################################################
function completo
{
rm -f $dar_dest_dir/*
echo "Esecuzione Backup completo ..." >> $message_file
dar -c $1 -R $dar_source_dir $dar_opts >> $message_file
DAR_CHECK_FILE=$1
}
source /etc/dar_backup/global.conf
# Se ho specificato il parametro 2 includo come source il secondo parametro se
# la settimana è dispari
if [ "$1" = "" ]; then
echo "Specificare un job."
exit 1
fi
if [ "$2" != "" ]; then
thisweek=$(date +%W)
if [ $(expr $thisweek % 2) = "0" ]; then
source $job_dir/$1
else
source $job_dir/$2
fi
else
source $job_dir/$1
fi
#Data/Ora di Avvio
START_TIME=$(date +'%s')
DATA_AVVIO=$(date "+%d/%m/%y %R") #Data di Avvio in Formato gg/mm/aa hh:mm
message_file="$log_dir/$dar_dest_file-$(date +%d%m%y)"
#Intestazione del Messaggio
echo "---------------------------------------------------------------------------------------" > $message_file
echo " DBP - Lavoro di Backup " >> $message_file
echo "---------------------------------------------------------------------------------------" >> $message_file
echo "" >> $message_file
echo " Nome Job di Backup: $job_description" >> $message_file
echo " Data di Avvio: $DATA_AVVIO" >> $message_file
echo " Directory: $dar_source_dir" >> $message_file
echo "" >> $message_file
echo "---------------------------------------------------------------------------------------" >> $message_file
echo "" >> $message_file
#Controllo che non ci sia un override delle opzioni
if [ "$dar_override_opts" != "" ]; then
dar_opts=$dar_override_opts
fi
if [ "$dar_comp_file" = "" ]; then #Sto eseguendo un backup completo
completo "$dar_dest_dir/$dar_dest_file"
else
#Sto eseguendo un backup differenziale
if [ -e "$dar_dest_dir/$dar_comp_file.1.dar" ]; then
# Se esiste il file completo di riferimento eseguo il differenziale
echo "Esecuzione Backup differenziale da $dar_dest_dir/$dar_comp_file ..." >> $message_file
dar -c "$dar_dest_dir/$dar_dest_file" -A "$dar_dest_dir/$dar_comp_file" -R $dar_source_dir $dar_opts >> $message_file
DAR_CHECK_FILE="$dar_dest_dir/$dar_dest_file"
else
# Non esiste il file completo quindi eseguo backup completo
echo "Backup differenziale non possibile," >> $message_file
completo "$dar_dest_dir/$dar_comp_file"
fi
fi
exit_code=$?
mail_subject="[!!] Backup non completato"
RESULT=0
case "$exit_code" in
"0")
exit_message="Backup Completato con Successo.";
RESULT=0
mail_subject="[OK] Backup Completato"
;;
"1")
exit_message="Riga di comando errata.";
;;
"2")
exit_message="Errore hardware o di memoria.";
;;
"3")
exit_message="Errore di programma.";
;;
"4")
exit_message="Processo in attesa di risposta da utente.";
;;
"5")
exit_message="Impossibile aprire o leggere il file.";
;;
"6")
exit_message="Errore durante l'esecuzione del comando (-E).";
;;
"7")
exit_message="Errore di chiamata alla libreria.";
;;
"8")
exit_message="Overflow.";
;;
*)
exit_message="Errore sconosciuto.";
;;
esac
echo "" >> $message_file
echo $exit_message >> $message_file
if [ $log_verbose = "yes" ]; then
echo "" >> $message_file
echo "----------------------------------------------------------------------------------" >> $message_file
echo " Elenco dei file inclusi nel Backup" >> $message_file
echo " ---------------------------------------------------------------------------------" >> $message_file
echo "" >> $message_file
dar -l $DAR_CHECK_FILE -N -as >> $message_file
echo "----------------------------------------------------------------------------------" >> $message_file
fi
END_TIME=$(date +'%s')
TOTAL_TIME=$(expr $END_TIME - $START_TIME)
HOURS=$(expr $TOTAL_TIME / 3600)
REMAINDER=$(expr $TOTAL_TIME % 3600)
MINUTES=$(expr $REMAINDER / 60)
SECONDS=$(expr $REMAINDER % 60)
echo "" >> $message_file
echo "Durata Totale del processo: $HOURS ore, $MINUTES minuti e $SECONDS secondi." >> $message_file
#Invio della Mail
cat $message_file | mail -s "$mail_subject" -b "$mail_cc" "$admin_email"
#if [ $log_dir != "" ]; then
# mv "$message_file" "$log_dir/$dar_dest_file-$(date +%d%m%y)"
#else
# rm $message_file
#fi
exit $RESULT
|
Nel file /etc/dar_backup/global.conf sono presenti le principali direttive
Code: |
dar_opts="-y -N -w" #Opzioni riga di comando per DAR
job_dir="/etc/dar_backup/jobs" #directory jobs
log_verbose="no"
log_dir="/var/log/dar_backup" #directory per i logs
admin_email="admin@example.com"
mail_cc="logs@example.com"
mail_from="storage@example.com"
|
nella job_dir sono presenti i file che identificano i jobs di backup. Per ragioni di spazio metto solo i primi 2 jobs:
Code: |
#File /etc/dar_backup/jobs/settimana1
job_description="Settimana 1 (Backup Completo)"
dar_source_dir="/home"
dar_comp_file=""
dar_dest_dir="/mnt/backup/disk1/settimanale"
dar_dest_file="settimana1"
#File /etc/dar_backup/jobs/martedi1
job_description="Martedi1 (Differenziale di Settimana1)"
dar_source_dir="/home"
dar_comp_file="settimana1"
dar_dest_dir="/mnt/backup/disk1/settimanale"
dar_dest_file="martedi1"
#File /etc/dar_backup/jobs/mese1
job_description="Mese 1 (Backup Completo)"
dar_source_dir="/home"
dar_comp_file=""
dar_dest_dir="/mnt/backup/disk1/mensile"
dar_dest_file="mese1"
time_ctrl=63
|
[EDIT]
Inizialmente avevo scritto questo:
"Così tutto funziona... basta mettere in cron e il gioco è fatto! Purtroppo mi sono accorto che con cron non si può distinguere settimana pari e settimana dispari, allora ho ben pensato di attaccare alla mia suite di backup anche quest'altro script:"
In effetti mi sono reso conto che questo script non fa assolutamente quel tipo di controllo, ma fa tutt'altro...
In controllo dell'alternanza delle settimane viene eseguito nel primo script
[/EDIT]
Lo script seguente controlla in ogni file di configurazione presente nella directory dei jobs se è presente il parametro time_ctrl. Se presente controlla che il valore di time_ctrl non sia superiore a quello specificato nel file, altrimenti manda in esecuzione il job corrispondente.
Lo script serve per eseguire quei lavori che potrebbero non essere stati eseguiti causa macchina spenta.
Code: |
#File /usr/local/bin/jobcontrol.sh
#!/bin/bash
#Script per il controllo dei job dar_backup
source /etc/dar_backup/global.conf
function jobcontrol
{
time_ctrl=""
source $1
dar_dest_path=$dar_dest_dir/$dar_dest_file.1.dar
if [ -e $dar_dest_path ] && [ "$time_ctrl" != "" ]; then
DATA_FILE=$(stat -c '%Y' $dar_dest_path)
DATA_OGGI=$(date '+%s')
DIFF_DATA=$(expr $DATA_OGGI - $DATA_FILE)
DIFF_DATA=$(expr $DIFF_DATA / 3600 / 24)
ESEGUI=$(expr $DIFF_DATA \> $time_ctrl)
if [ "$ESEGUI" = "1" ]; then
/usr/local/bin/dar_backup.sh $dar_dest_file
fi
fi
}
for file in $job_dir/*; do
jobcontrol $file
done
|
et voilà, in /etc/crontab metto:
Code: |
40 12 * * 1 /usr/local/bin/dar_backup.sh settimana1 settimana2
40 12 * * 2 /usr/local/bin/dar_backup.sh martedi1 martedi2
0 15 1 1-11/2 * /usr/local/bin/dar_backup.sh mese1
0 17 * * * /usr/local/bin/jobcontrol.sh
|
Spero che questi script possano servire a qualcuno, o che magari qualcuno di voi li provi e magari apporti qualche miglioramento. _________________ Don't think, drink your wine, watch the fire burn... his problems not mine...
Just be that model citizen.
Last edited by spugna on Mon Mar 13, 2006 9:26 am; edited 1 time in total |
|
Back to top |
|
|
Dr.Dran l33t
Joined: 08 Oct 2004 Posts: 766 Location: Imola - Italy
|
Posted: Sat Mar 11, 2006 11:29 am Post subject: |
|
|
Buon TIP, comunque lo inserirei nella documentazione Italiana _________________ :: [Dr.Dran] Details ::
- Linux User # 286282
- IT FreeLance Consultant
- President of ImoLUG [Imola & Faenza Linux User Group] |
|
Back to top |
|
|
lavish Bodhisattva
Joined: 13 Sep 2004 Posts: 4296
|
Posted: Sun Mar 12, 2006 10:37 am Post subject: |
|
|
Spostato da Forum di discussione italiano a Risorse italiane (documentazione e tools) come giustamente suggerito da DranXXX _________________ minimalblue.com | secgroup.github.io/ |
|
Back to top |
|
|
neryo Veteran
Joined: 09 Oct 2004 Posts: 1292 Location: Ferrara, Italy, Europe
|
Posted: Mon Mar 13, 2006 9:42 pm Post subject: |
|
|
bel tip.. mi servira' a breve una cosa del genere.. _________________ cache: a safe place for hiding or storing things..
D-link DWL-G650 AirPlus
Apache Php Mysql |
|
Back to top |
|
|
Naspe Guru
Joined: 10 Dec 2003 Posts: 321 Location: Genova - Italy
|
Posted: Fri May 12, 2006 3:56 pm Post subject: |
|
|
DAR funziona benissimo anche con ReiserFS e ACL _________________ God Is Real... Unless Declared As Integer...
Provoca Il Più Bravo... Morirai Come Uno Schiavo!!!
Hai Evocato Il Tuono!!! Ora Raccogli Tempesta!!! |
|
Back to top |
|
|
|