mercoledì, ottobre 10, 2007

XBackup: Programma per creare, verificare e installare file di backup

In questo periodo avendo parecchio tempo libero mi sono messo in testa di creare un programma di backup. Inizialmente questo programma doveva essere un semplice script di shell, ma solo successivamente ho creato una minuta interfaccia grafica che permette di semplificare le operazioni. Per ora, vi posto
solo il codice del programma chiamato XBackup (creato interamente da me...perfino il nome). Tale programma logicamente deve essere logicamente testato per risolvere i bugs ed inoltre può essere potenziato da chiunque (me compreso). Infatti, se avete dei consigli da darmi o avete fatto delle modifiche fatemelo sapere.

Installazione

Aprite un terminale e lanciate il seguente comando

sudo gedit /usr/bin/xbackup

Logicamente io ho utilizzato gedit. Voi potete usare qualsiasi altro programma di scrittura (kwrite, nano, vim, etc.). Copiate all'interno del file il seguente testo:

#! /bin/bash

#########################
#### XBACKUP ####
#########################

# Questo script vi permette di creare dei backup
# personalizzati utilizzando il comando tar, in particolare
# vengono creati dei file dell'estensione tar.bz2.
# Lo script si avvale del comando zenity per creare l'interfaccia grafica
#
# Lo script crea, nella cartella che durante l'esecuzione del programma
# viene specificata come quella in cui posizionare i file di
# backup, un file di estensione tar.bz2.
# Si può fare il backup di tutto il filesystem, della home o di una cartella a vostra
# scelta.
# Si possono eseguire eseguire operazioni di verifica o installazione del backup
# nonchè di creazione. Inoltre il programma si avvale di espeak per avere un
# supporto vocale. Inoltre si può decidere di avere una versione verbose o no.

# Funzione che configura alcune opzioni del programma quali ambiente grafico, supporto vocale e verbose mode
function backupconfig {
de=`zenity --title="XBackup" --list --text="Quale DE utilizzate tra questi sottostanti?" --radiolist --column="Scegli" --column="Desktop Environment" false "Gnome" false "Kde" false "Xfce"`
if [[ $de = "Gnome" ]]
then
zenity --info --title="XBackup - Informazioni" --text="Ambiente Grafico Gnome"
terminal="gnome-terminal -x"
gestore="nautilus"
elif [[ $de = "Kde" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Ambiente Grafico Kde"
terminal="konsole -e"
gestore="konqueror"
elif [[ $de = "Xfce" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Ambiente Grafico Xfce"
terminal="xfce-terminal -x"
gestore="thunar"
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi


zenity --title="XBackup - Informazioni" --info --text="Potete abilitare il supporto vocale durante il backup. Per il corretto funzionamento del supporto sonoro installare il pacchetto espeak presente nei repository di Ubuntu (comando: sudo apt-get install espeak)"
voce=`zenity --title="XBackup" --list --text="Abilitare il supporto vocale?" --radiolist --column="Scegli" --column="Abilita" false "Si" false "No"`
if [[ $voce = "Si" ]]
then
zenity --info --title="XBackup - Informazioni" --text="Supporto voce abilitato"
espeak "Enable voice"
voce=1
elif [[ $voce = "No" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Supporto voce non abilitato"
voce=0
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi



zenity --info --title="XBackup" --text="Potete abilitare la modalità verbose durante il backup in maniera tale da verificare il corretto funzionamento del software di backup"
verb=`zenity --list --radiolist --title="XBackup" --text="Abilitare la modalità verbose?" --column="Scegli" --column="Abilita" false "Si" false "No"`
if [[ $voce -eq 1 && $verb = "Si" ]]
then
zenity --info --title="XBackup - Informazioni" --text="Modalità verbose abilitata"
espeak "Enable verbose mode"
verb=1
elif [[ $voce -eq 1 && $verb = "No" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Modalità verbose disabilitata"
espeak "Disable verbose mode"
verb=0
elif [[ $voce -eq 0 && $verb = "Si" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Modalità verbose abilitata"
verb=1
elif [[ $voce -eq 0 && $verb = "No" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Modalità verbose disabilitata"
verb=0
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi
}

# Funzione che crea i file di backup
function backupcreate {
zenity --info ---title="XBackup - Informazioni" --text="Adesso verrà aperto un terminale che serve al programma per creare il backup. Sarà richiesto l'inserimento della password di Amministratore (root)"
$terminal sudo apt-get upgrade
$terminal sudo apt-get clean
$terminal sudo apt-get autoremove
#sudo cpufreq-selector -g performance
cartella=`zenity --list --title="XBackup" --text="Di quale cartella vuoi fare il backup?" --radiolist --column="Scegli" --column="Cartelle" false "Home" false "/" false "Altro"`
if [[ $cartella = "/" ]];
then
backup=$dir/filesystem-$(date +%d%b%y).tar.bz2
if [[ $verb -eq 0 ]];
then
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys $cartella &>/dev/null
else
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys $cartella
fi
elif [[ $cartella = "Home" ]];
then
backup=$dir/home-$(date +%d%b%y).tar.bz2
cartella=~
if [[ $verb -eq 0 ]];
then
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup $cartella &>/dev/null
else
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup $cartella
fi
elif [[ $cartella = "Altro" ]];
then
zenity --info --title="XBackup - Informazioni" --text="Adesso ti verrà chiesta la cartella di cui vuoi fare il backup"
cartella=`zenity --file-selection --title="XBackup - Seleziona la directory da backupizzare" --text="Seleziona la directory di cui vuoi fare il backup" --directory`
file=`zenity --title="XBackup - Inserisci il nome del file di backup" --entry --text="Inserisci il nome del file di backup" --entry-text="Altro"`
backup=$dir/$file-$(date +%d%b%y).tar.bz2
if [[ $verb -eq 0 ]];
then
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup $cartella &>/dev/null
else
zenity --info --title="XBackup - Informazioni" --text="Adesso verrà aperta la cartella dove state salvando il backup. Verificate che la dimensione del file di backup aumenti al fine che il programma stia funzionando"
$gestore $dir
$terminal sudo tar -cvjpf $backup $cartella
fi
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi
if [[ $voce -eq 1 ]];
then
espeak "Creation File Backup"
else
sleep 1;
fi
zenity --info --title="XBackup - Informazioni" --text="File creato: $backup"
echo "File creato: $backup"
if [[ $voce -eq 1 ]];
then
espeak "Creation File Complete"
else
sleep 1;
fi

verf=`zenity --title="XBackup" --list --text="Verificare il file di Backup creato?" --radiolist --column="Abilita" --column="Scegli" false "Si" false "No"`
if [[ $verf = "Si" ]]
then
backupverify $backup $verb $voce
elif [[ $verf = "No" ]];
then
sleep 1;
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi


}

# Funzione che verifica i file di backup
function backupverify {
if [[ $voce -eq 1 ]];
then
espeak "Verify integrity"
else
sleep 1;
fi
if [[ $verb -eq 0 ]];
then
$terminal tar -tf $backup &>/dev/null
$terminal echo "Verifica integrità del file di $backup... "
else
$terminal tar -tf $backup
$terminal echo "Verifica integrità del file di $backup... "
fi
if [[ $? -eq 0 ]];
then
zenity --info --title="XBackup" --text="Controllo di integrità completato del file $backup: backup integro"
$terminal echo "Controllo di integrità completato del file $backup: backup integro"
if [[ $voce -eq 1 ]];
then
espeak "Integrity check completed"
else
sleep 1;
fi
else
zenity --info --title="XBackup" --text="Controllo di integrità fallito del file $backup"
$terminal echo "Controllo di integrità fallito"
if [[ $voce -eq 1 ]];
then
espeak "Integrity check failed"
exit 1;
else

sleep 1;
fi
fi


}

# Funzione che installa i file di backup
function backupinstall {
backupconfig
verf=`zenity --title="XBackup" --list --text="Verificare il file di Backup?" --radiolist --column="Abilita" --column="Scegli" false "Si" false "No"`
if [[ $verf = "Si" ]]
then
backupverify $backup $verb $voce
elif [[ $verf = "No" ]];
then
sleep 1;
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi
if [[ $voce -eq 1 ]];
then
espeak "Decompression start"
else
sleep 1;
fi
zenity --info ---title="XBackup - Informazioni" --text="Adesso verrà aperto un terminale che serve al programma per installare il backup. Sarà richiesto l'inserimento della password di Amministratore (root)"
if [[ $verb -eq 1 ]];
then
$terminal sudo tar -xvpjf $backup -C /
zenity --info --title="XBackup" --text="Decompressione dell'archivio $backup..."
$terminal echo "Decompressione dell'archivio $backup..."
else
$terminal sudo tar -xvpjf $backup -C / &>/dev/null
zenity --info --title="XBackup" --text="Decompressione dell'archivio $backup..."
$terminal echo "Decompressione dell'archivio $backup..."
fi
if [[ $voce -eq 1 ]];
then
espeak "Decompression finish"
else
sleep 1;
fi
zenity --info --title="XBackup" --text="Decompressione terminata"
$terminal echo "Decompressione terminata"
}




# MENU PRINCIPALE DI SELEZIONE DELLE OPERAZIONI DA FARE
zenity --info --title="XBackup" --text="PROGRAMMA PER CREARE, VERIFICARE E INSTALLARE BACKUP!"
op=`zenity --width=300 --height=200 --title="XBackup" --list --radiolist --text="Programma di Backup" --column="Scegli" --column="Operazione" false "Verifica" false "Crea" false "Installa"`

if [[ $op = "Crea" ]]
then
zenity --info --title="XBackup - Informazioni" --text="Adesso ti verrà chiesta la cartella dove salvare il file di backup da creare"
dir=`zenity --file-selection --title="XBackup - Seleziona la directory dei backup" --text="Seleziona la directory dei backup" --directory`
backupconfig
backupcreate $dir $verb $voce
elif [[ $op = "Verifica" ]];
then
file=`zenity --title="XBackup - Seleziona il file di estensione .tar.bz2" --file-selection --text="Seleziona il file di estensione .tar.bz2"`
if [[ $file = *.tar.bz2 ]];
then
backup=$file
backupconfig
backupverify $backup $verb $voce
else
zenity --error --title="XBackup - Errore" --text="Il file non presenta l'estensione .tar.bz2 - Uscita inattesa"
exit 1
fi
elif [[ $op = "Installa" ]];
then
file=`zenity --title="XBackup - Seleziona il file di estensione .tar.bz2" --file-selection --text="Seleziona il file di estensione .tar.bz2"`
if [[ $file = *.tar.bz2 ]]
then
backup=$file
backupinstall $backup $verb $voce
else
zenity --error --title="XBackup - Errore" --text="Il file non presenta l'estensione .tar.bz2 - Uscita inattesa"
exit 1
fi
else
zenity --error --title="XBackup - Errore" --text="Nessuna scelta effettuata - Uscita inattesa"
exit 1;
fi
zenity --info --title="XBackup" --text="Grazie per aver usato il software!"

Salvate il file appena creato. Lo chiudete e date i diritti di avvio del programma lanciando il seguente comando:


sudo chmod a+x /usr/bin/xbackup


Se volete potete anche (così ho fatto io) crea una icona con Menu Principale.

VI INFORMO CHE A VOLTE IL SUPPORTO VOCALE BLOCCA L'APPLICAZIONE IN QUANTO ESSO OCCUPA PARECCHIA MEMORIA


Alla prossima
Davide

15 commenti:

Anonimo ha detto...

Grazie, bella utility!
Perchè non la pubblicizzi un po sul forum di ubuntu?
Sono sicuro che verrebbe apprezzata x la semplicità e l'efficacia...

Loris

loris32 ha detto...

Grazie, bella utility!
Perchè non la pubblicizzi un po sul forum di ubuntu?
Sono sicuro che verrebbe apprezzata x la semplicità e l'efficacia...

Loris

Davide ha detto...

Ti ringrazio, loris32 per i complimenti. Penso di aver aperto un post sul forum di ubuntu, ma non penso sia stata apprezzata. Comunque per ora ho lasciato il progetto: non ci sto piu mettendo mani. Volevo farne una interfaccia grafica migliore...mi pare di aver visto anche un software che fa le stesse cose tranne il backup di tutto il filesystem (cosa che mi serve di piu). Se vuoi cmq, puoi continuare il progetto e pubblicizzarlo sul forum.

Ciao
Davide

loris32 ha detto...

Però a me la verifica non funzina correttamente...mmm prima di controllare tutto l'archivio con il comando che hai utilizzato (tar -tf) già mi dice che l'archivio è integro.
Dovrebbe esserci qualcosa che non va

Davide ha detto...

Devo dare una bella revisione a tutto lo script. In questo periodo sono affolato di lavoro e di tesi. Non appena avrò un po di tempo ne do una revisionata. Comunque ti segnalo un bel programma di backup: mi pare si chiami home backup o giu di li,
scritto in python.

Se vuoi, puoi apportare modifiche allo script e inviarmelo per mail. Logicamente lo posto mettendoti come fonte.

Ciao
Davide

loris32 ha detto...

Io ho appena finito il mio di programmino bash per il backup; non ho usato zenity perchè preferisco un programma tutto da terminale, ma credo che parecchia gente invece prediliga le finestre di dialogo...
Tra l'altro, utilizzo "festival" al posto di espeak, te lo consiglio, mi sembra migliore come sintetizzatore di voce.
Comunque spero di avere un po di tempo al più presto in modo da provare a modificare la parte della verifica del tuo script. In tal caso sicuramente ti faccio avere la nuova versione.
Una cosa non mi è chiara: con "tar -tf $< nome_archivio >" di cosa viene fatto il check esattamente?
Ciao,
Loris

loris32 ha detto...
Questo commento è stato eliminato dall'autore.
Davide ha detto...

Semplice, il comando tar -tf è un comando che visualizza a schermo (su terminale) i file presenti dentro un archivio senza estrarli. Ora se l'estrazione non va a buon fine, genera un errore. Il check è fatto in questo modo: se non si arriva alla fine della visualizzazione allora viene ricevuto un errore e restituisce il messaggio di archivio corrotto

loris32 ha detto...

Ok, come pensavo, però l'archivio potrebbe contenere files danneggiati, o non corrispondenti a quelli di origine, o mancanti.
In questo caso il "tar -tf" non si accorge di nulla?

Davide ha detto...

Idea correttissima. Non mi ero posto il problema. Adesso capisco perché: non ho le conoscenze di bash adatte per farlo e quindi mi poggio alla cabala (o fortuna :D).

E' un bel programmino ma deve essere corretto parecchio per essere stabile e fruibile completamente.

Inoltre secondo me dovrei usare dei tool di backup di tipo differenziale in maniera tale da avere un backup base e vari aggiornamenti per non fare il backup completo. Non appena avrò un po di tempo parto con la correzione.

Grazie per le osservazioni

Ciao
Davide

loris32 ha detto...

ok....allora se ti serve poi un aiuto, contattami che ci sono volentieri!

Anonimo ha detto...

La ringrazio per Blog intiresny

Anonimo ha detto...

Perche non:)

Anonimo ha detto...

good start

Anonimo ha detto...

La ringrazio per intiresnuyu iformatsiyu