Commit 90ced6e9 authored by Thierry Fenasse's avatar Thierry Fenasse

Preimier commit

parents
C'est pour automatiser un rsync avec une poubelle.
Fonctionne avec un disque USB dédié, formaté en ext4 (ou autre?) et de préférence chiffré (LUKS?).
Ça fonctionne aussi avec un dossier si vous ne voulez pas dédier un disque USB pour vos backups.
# UTILISATION
Copiez les fichiers suivants sur votre **DESTINATION**.
```
backup.sh
sources.liste
exclusions.liste
```
> Notez que le fichier `exclusions.liste` est vide parceque je suis fénéant et que je prends tout, même le .cache etc.
> Notez que le fichier `sources.liste` contient `etc`, `/home`, `/root` et `var` et que pour que tout soit pris il vaut mieux exécuter le script en tant que root ou avec sudo, ce qui est proposé plus bas.
Modifiez le fichier `sources.liste` en fonction de vos besoins.
Rendez le fichier `backup.sh` exécutable si il ne l'est pas.
```
chmod +x backup.sh
```
Exécutez la commande
```
sudo ./backup.sh
```
Et laissez la magie de `rsync` opérer jusqu'à ce que votre terminal vous rende la main. Ça peut être vraiment long la première fois, surtout si vous avez beaucoup de données.
# POUBELLE ?
Sur le disque (ou le dossier) de backup, il y aura au fil du temps une POUBELLE qui se remplira et qui contiendra ce que `rsync` devra supprimer de votre backup. En effet `rsync` est utilisé ici pour faire un **miroir** de vos données actuelles dans votre DESTINATION. Cependant, `rsync` **déplacera** ce qu'il est sensé supprimer vers cette fameuse POUBELLE, dans un sous dossier correspondant à la date du jour d'exécution de votre backup.
Si votre disque (ou dossier) de DESTINATION manque d'espace, effacez ou déplacez tout ou partie de ce qui est dans POUBELLE.
# TODO
- tester avec les `exclusions.listes`
- gérer le nettoyage de la POUBELLE en cas de manque d'espace?
- capturer les erreurs de rsync «echo error > rapport», celles qui s'affichent dans le terminal (voir exemple 1 ci-dessous)
- améliorer le tout
**EXEMPLE 1**
```
rsync: opendir "/home/tierce/.cache/dconf" failed: Permission denied (13)
rsync: send_files failed to open "/home/tierce/.cache/thumbnails/fail/gnome-thumbnail-factory/bb7474f71147532b50657337ce16d8e1.png": Permission denied (13)
rsync: send_files failed to open "/home/tierce/.cache/thumbnails/fail/gnome-thumbnail-factory/c2e42a136e968c73f0ce4943fa667f66.png": Permission denied (13)
rsync: send_files failed to open "/home/tierce/.cache/thumbnails/normal/97e0dd3e104be05e5134fd2bda881a50.png": Permission denied (13)
```
#!/bin/bash
#
# Petit script de backup ne cherchant qu'a évoluer.
#
#################################################################
# Déclaration de variables
#
# DESTINATION est le disque USB (ou le dossier) contenant ce script
# LISTE est la liste de dossiers qu'il faut prendre dans la sauvegarde
# DUJOURHEURE qui sera ajouté au fichiers supprimés de la destination lors de la tâche de sauvegarde.
# DUJOUR qui sera ajouter devant le fichier log. Pour le moment, c'est son nom.
# MACHINE est le nom de l'hote qui exécute la tâche
# MOUNTSTATUS est à 0 ou 1 si le disque USB est monté
NOMDUVOLUME=$(basename ${PWD})
DESTINATION=$(pwd)
LISTE=$(cat sources.liste)
EXCLUSIONS="exclusions.liste"
DUJOURHEURE=$(date "+%Y-%m-%d-%H-%M-%S")
DUJOUR=$(date "+%G-%m-%d")
MACHINE=$(hostname)
MOUNTSTATUS=`mount | grep ${NOMDUVOLUME} | wc -l`
## Pour débugger
## 0 pour désactiver
## 1 pour lister les variable avant éxécution
DEBUG=0
if [ $DEBUG = 1 ]; then
echo $NOMDUVOLUME
echo $DESTINATION
echo $LISTE
echo $EXCLUSIONS
echo $MACHINE
echo $MOUNTSTATUS
exit 0
fi
function doCheckDirectories {
## Pour tester et créer si nécessaire les dossiers de destination
echo
## Vérifie que le dossier RAPPORTS existe
if [ ! -d ${DESTINATION}/RAPPORTS ]; then
echo "${DESTINATION}/RAPPORTS inexistant, création . . ."
mkdir "${DESTINATION}/RAPPORTS"
echo
fi
## Idem pour la POUBELLE qui contiendra les dossiers créés à la date de chaque backup
if [ ! -d ${DESTINATION}/POUBELLE ]; then
echo "${DESTINATION}/POUBELLE inexistante, création . . ."
mkdir "${DESTINATION}/POUBELLE"
echo
fi
## Idem pour la POUBELLE DU JOUR qui contiendra ce que la commande rsync --delete supprime
if [ ! -d ${DESTINATION}/POUBELLE/${DUJOUR} ]; then
echo "${DESTINATION}/POUBELLE/${DUJOUR} inexistante, création . . ."
mkdir "${DESTINATION}/POUBELLE/${DUJOUR}"
echo
fi
}
function doBackup {
echo
#pour chaque élément de la liste, faire un rsync
for s in ${LISTE}; do
# En cas de plusieurs backups sur une seule journée : avec --suffix du jour ajouté aux fichiers de la POUBELLE
# rsync -aRb --exclude-from ${EXCLUSIONS} --stats --backup-dir=${DESTINATION}/POUBELLE/${DUJOUR} --delete --suffix=.${DUJOURHEURE} $s ${DESTINATION}
# Pour "un rsync par jour, sans --suffix ajouté aux fichiers de la POUBELLE
rsync -aRb --exclude-from ${EXCLUSIONS} --stats --backup-dir=${DESTINATION}/POUBELLE/${DUJOUR} --delete $s ${DESTINATION} --ignore-errors
done
}
function startScript {
## Pour écrire dans le rapport
echo "-----------------------------------------------------"
echo "Démarrage de la sauvegarde"
echo "Serveur: ${MACHINE}"
echo "Date: `date`"
echo "-----------------------------------------------------"
echo
}
function finishScript {
## Pour écrire dans le rapport
echo
echo "-----------------------------------------------------"
echo "Fin de la sauvegarde"
echo "Serveur: ${MACHINE}"
echo "Date: `date`"
echo "-----------------------------------------------------"
}
#################################################################
## Script
## vérifie si le disque USB est monté
## Vérifions la présence de la ou des destinations
doCheckDirectories >> /tmp/$DUJOUR.log
## Démarrage du travail de sauvegarde
startScript >> /tmp/$DUJOUR.log
## Fait la sauvegarde
doBackup >> /tmp/$DUJOUR.log
## Termine le script
finishScript >> /tmp/$DUJOUR.log
## Supprime les dossiers poubelle vides créés inutilement par rsync
find ${DESTINATION}/POUBELLE/ -type d -empty -delete
## Déplacement du fichier journal dans le dossier RAPPORTS sur le disque USB.
mv /tmp/$DUJOUR.log $DESTINATION/RAPPORTS/$DUJOUR.log
/home
/var
/etc
/root
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment