Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SCRIPT] I miei script di backup
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools)
View previous topic :: View next topic  
Author Message
spugna
Tux's lil' helper
Tux's lil' helper


Joined: 26 Nov 2004
Posts: 97

PostPosted: Thu Mar 09, 2006 4:42 pm    Post subject: [SCRIPT] I miei script di backup Reply with quote

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 :P
[/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
View user's profile Send private message
Dr.Dran
l33t
l33t


Joined: 08 Oct 2004
Posts: 766
Location: Imola - Italy

PostPosted: Sat Mar 11, 2006 11:29 am    Post subject: Reply with quote

Buon TIP, comunque lo inserirei nella documentazione Italiana :D
_________________
:: [Dr.Dran] Details ::
- Linux User # 286282
- IT FreeLance Consultant
- President of ImoLUG [Imola & Faenza Linux User Group]
Back to top
View user's profile Send private message
lavish
Bodhisattva
Bodhisattva


Joined: 13 Sep 2004
Posts: 4295
Location: Venice Island, European Union

PostPosted: Sun Mar 12, 2006 10:37 am    Post subject: Reply with quote

Spostato da Forum di discussione italiano a Risorse italiane (documentazione e tools) come giustamente suggerito da DranXXX ;)
_________________
www.minimalblue.com
Back to top
View user's profile Send private message
neryo
Veteran
Veteran


Joined: 09 Oct 2004
Posts: 1292
Location: Ferrara, Italy, Europe

PostPosted: Mon Mar 13, 2006 9:42 pm    Post subject: Reply with quote

bel tip.. mi servira' a breve una cosa del genere.. :wink:
_________________
cache: a safe place for hiding or storing things..

D-link DWL-G650 AirPlus
Apache Php Mysql
Back to top
View user's profile Send private message
Naspe
Guru
Guru


Joined: 10 Dec 2003
Posts: 321
Location: Genova - Italy

PostPosted: Fri May 12, 2006 3:56 pm    Post subject: Reply with quote

DAR funziona benissimo anche con ReiserFS e ACL :D
_________________
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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum