#1 Le 17/06/2009, à 09:48
- Autiwa
script de backup/synchronisation entre deux PC via un DD externe ext3
Je viens de finir, après des jours de prise de tête, mon propre script de backup. Avant, j'utilisais rsync et ça m'allait très bien, mais depuis que j'ai deux PC, c'est vraiment prise de tête pour savoir comment faire. Je me suis penché du coté d'unison mais ça ne me convient pas, déjà parce que j'avais séparé les types de backups, mais aussi et surtout parce qu'il me demande à chaque fois dans quel sens je veux faire les backups, alors que je sais très bien à l'avance quel coté je veux écraser avec l'autre.
Autre problème, suivant le PC je ne fais pas le backup de la même façon. Sur mon ordi fixe, j'ai 1.5To, donc je stocke tout. Alors que sur mon ordi portable, je ne stocke que la moitié des choses, mes documents en priorité. J'ai testé aussi le truc de gnome, conduit, mais il bugue trop, donc pas encore utilisable. Bref, coté backup, linux, c'est pas le top. Donc je me suis fait mon petit truc maison et je vous le propose ici au cas où ça intéresse quelqu'un. Bien entendu, je suis ouvert aux critiques, améliorations et reports de bugs. Ce script est très orienté en fonction de mes besoins, donc c'est pas vraiment pour que vous l'utilisiez tel quel, mais plutôt pour que vous puissiez vous en inspirer.
ATTENTION : testez le script avant de le lancer sur des dossiers importants. Pour l'instant, je n'ai testé que la partie laptop => DD, vu que je suis sur mon portable la semaine, et sur mon fixe le week-end. Le script est clairement dans une phase de rodage et de test, il n'est pas mature. Je l'utilise déjà pour mon backup, mais j'ai joué au poker en le lançant la première fois, j'étais conscient des risques !
Maintenant, voici le script :
#!/bin/bash
#v0.2
#script de backup qui permet de "synchroniser" deux ordinateurs via un disque dur formaté en ext3 qui contient une image des fichier que l'on veut synchroniser. Ce script utilise rsync. Il est possible, suite à une erreur utilisateur, que les bons fichiers soient écrasés par les mauvais. Il est aussi possible que mon script ait des bugs, toujours essayer de tester, dans la mesure du possible, le script sur des dossiers de test !!
##########################
#Définition des fonctions
##########################
#le premier argument est le chemin absolu de la source et le deuxième le chemin absolu de la destination du backup
function backup_home()
{
#rsync -av --delete ${source[0]} ${destination[0]} --filter "- .thumbnails/"
rsync -av --delete $1/Modèles/ $2/Modèles/
rsync -av --delete $1/scripts/ $2/scripts/
rsync -av --delete $1/.amsn/ $2/.amsn/
rsync -av --delete $1/.config/emesene1.0/ $2/.config/emesene1.0/ --filter "- autiwa_gmail_com/cache/"
rsync -av --delete $1/.config/smplayer/ $2/.config/smplayer/
rsync -av --delete $1/.evolution/ $2/.evolution/ --filter "- cache/"
rsync -av --delete $1/.gconf/apps/evolution/ $2/.gconf/apps/evolution/
rsync -av --delete $1/.kde/share/apps/digikam/ $2/.kde/share/apps/digikam/
rsync -av --delete $1/.kde/share/apps/kile/ $2/.kde/share/apps/kile/
rsync -av --delete $1/.fonts/ $2/.fonts/
rsync -av --delete $1/.gdl/ $2/.gdl/
rsync -av --delete $1/.gftp/ $2/.gftp/
rsync -av --delete $1/.latex/ $2/.latex/
rsync -av --delete $1/.metamorphose2/ $2/.metamorphose2/
rsync -av --delete $1/.opera/ $2/.opera/ --filter "- opcache/" --filter "- images/" --filter "- cache4/"
rsync -av --delete $1/.purple/ $2/.purple/
rsync -av --delete $1/.quodlibet/ $2/.quodlibet/
rsync -av --delete $1/Bureau/ $2/Bureau/
rsync -av $1/.bashrc $2/.bashrc
}
function backup_documents()
{
echo "Backup des documents"
rsync -av --delete $1/ $2/ --filter "- lost+found" --filter "- .Trash-1000" --filter "- BD" --filter "- Manga" --filter "- Photos"
}
function backup_photo()
{
echo "Backup des photos"
rsync -av --delete $1/ $2/ --filter "- lost+found" --filter "- digikam*.db" --filter "- .Trash-1000"
}
function backup_manga()
{
echo "Backup des mangas"
rsync -av --delete $1/ $2/
}
function backup_BD()
{
echo "Backup des BD's"
rsync -av --delete $1/ $2/
}
function backup_video()
{
echo "Backup des video"
rsync -av $1/Bleach/ $2/Bleach/
rsync -av "$1/Naruto Shippuuden/" "$2/Naruto Shippuuden/"
rsync -av "$1/One Piece/" "$2/One Piece/"
rsync -av "$1/Mugen No Jûnin/" "$2/Mugen No Jûnin/"
}
##########################
#Programme en lui-même
##########################
portable="laptop"
fixe="desktop"
externe="stockage"
perso="/home/autiwa"
documents="$perso/documents"
stockage="/media/stockage"
bu="$stockage/backup"
lancement="/home/autiwa/backup_historique_execution.log"
log="/home/autiwa/backup_execution_script.log"
echo "$(date) Le backup a été lancé">>$lancement
if [ ! -e $stockage ]
then
echo "Erreur, le volume de sauvegarde est absent.">>$lancement
exit
fi
#chemin=( home documents photo manga BD video )
chemin[0]="home"
chemin[1]="documents"
chemin[2]="photo"
chemin[3]="manga"
chemin[4]="BD"
chemin[5]="video"
#on demande à l'utilisation ce qu'il veut faire
choix=$(zenity --list --width=300 --height=250 --text "que voulez vous faire ?" --radiolist \
--column "Choix" --column "Code" --column "Sens de backup" \
FALSE 11 "$portable => $externe" \
FALSE 12 "$externe => $portable" \
FALSE 21 "$fixe => $externe" \
FALSE 22 "$externe => $fixe" \
TRUE 0 "Quitter"\
--print-column=all --separator="|");
#on sépare le retour de la fonction en deux. Une première partie sera le nom de l'action a effectuer, alors que la 2e partie sera le code de l'action en elle même
nom_action=${choix#*|} #on a choisi de séparer les colonne par un "|"
code_action=${choix%%|*}
#on affiche le nom de l'action que l'utilisateur veut effectuer
echo "Action à effectuer : $nom_action">>$lancement
#on teste si l'action a effectuer est "quitter", si c'est le cas, on arrête le programme
if [ "$code_action" = "0" ]
then
echo "Le programme va maintenant se fermer.">>$lancement
exit
fi
# TODO essayer de mettre en valeur l'action en la mettant en gras et en couleur. Il y a un sujet sur ça sur ubuntu-fr
#avec le test suivant, on essaie d'éviter de supprimer des données en faisant le backup dans le mauvais sens.
zenity --title "Alert" --question \
--text="Vous avez choisi de faire le backup <b>${nom_action}</b>. Ceci écrasera les modifications du disque vers lequel vous sauvegardez. Voulez-vous vraiment continuer ?"
#si l'utilisateur a cliqué sur "annuler", on quitte le programme, sinon on continue.
if [ "$?" = 1 ]
then
exit
fi
#on définit les dossiers sources et de destination. Que ce soit pour l'ordi portable (code dizaine) ou pour la tour (code vingtaine) (en effet, la seule différence est que pour le portable, on n'exécute que les 3 premiers, à savoir le home, les documents et les photos. Il y a deux deux cas, un premier (codes finissants par un "1"), où le backup se faire de l'ordi vers le disque externe, et un autre (code finissant par "2") où le backup se fait du disque externe vers l'ordi.
case $code_action in
11|21)
source[0]=$perso
destination[0]="$bu/home_autiwa"
source[1]=$documents
destination[1]="$bu/documents"
source[2]="$documents/Photos"
destination[2]="$stockage/Photos"
source[3]="$documents/Manga"
destination[3]="$stockage/Manga"
#rajouter des "ignore" Manga, BD et cie, pour tenir compte du fait que dans le desktop, ya tout ça dans les documents.
source[4]="$documents/BD"
destination[4]="$stockage/BD"
source[5]="/media/video"
destination[5]="$stockage/Videos"
;;
12|22)
source[0]="$bu/home_autiwa"
destination[0]=$perso
source[1]="$bu/documents"
destination[1]=$documents
source[2]="$stockage/Photos"
destination[2]="$documents/Photos"
source[3]="$stockage/Manga"
destination[3]="$documents/Manga"
#rajout des "ignore" Manga, BD et cie, pour tenir compte du fait que dans le desktop, ya tout ça dans les documents.
source[4]="$stockage/BD"
destination[4]="$documents/BD"
source[5]="$stockage/Videos"
destination[5]="/media/video"
#il reste à écrire toutes les destinations, et ensuite à remplir toutes les fonctions avec les rsync -av ; piocher dans les backup
;;
*)
echo "Le code d'action $code_action a été retourné. Il est peut-être invalide. Le programme va maintenant se fermer.">>$lancement
#je dis peut-être invalide car si on clique sur annulé, ça renvoie ici, donc le programme se termine, mais il affiche la phrase, et ainsi un code valide peut-être retourné alors que le programme se ferme.
exit
esac
#pour les codes dizaines (utilisant le laptop) on ne fait que les 3 premiers. Pour les vingtaines (utilisant le desktop avec plus grand disque dur, et donc je copie aussi les videos et cie dessus), on fait tous les backups. En clair, même si pour le laptop, les sources sont définies, c'est artificiel, les dossiers n'existent pas, et on ne tient pas compte de ces variables dans la suite du programme.
case $code_action in
11|12)
backup_home ${source[0]} ${destination[0]}>$log
backup_documents ${source[1]} ${destination[1]}>>$log
backup_photo ${source[2]} ${destination[2]}>>$log
;;
21|22)
backup_home ${source[0]} ${destination[0]}>$log
backup_documents ${source[1]} ${destination[1]}>>$log
backup_photo ${source[2]} ${destination[2]}>>$log
backup_manga ${source[3]} ${destination[3]}>>$log
backup_BD ${source[4]} ${destination[4]}>>$log
backup_video ${source[5]} ${destination[5]}>>$log
;;
*)
echo "Choix non valide">>$lancement
esac
# for ((i=0;i<6;i++)) do {
# echo "dossier source : ${source[$i]}"
# echo "dossier de destination : ${destination[$i]}"
# }
# done
zenity --info --text="Le Backup a été effectué avec succès." --title="Informations"
Dernière modification par Autiwa (Le 20/06/2009, à 16:34)
Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.
Hors ligne