Page 1 sur 1

Script de backup avec limitation du nombre de sauvegardes sur le serveur distant

Posté : 16 avr. 2015, 11:09
par js-martin
Bonjour,

J'ai un ami qui utilise le script de sauvegarde FTP mais qui regrettait qu'il y avait un fichier de plus chaque jour sur son espace de stockage.

Rappel du lien : http://easydomoticz.com/backup-journali ... rveur-ftp/

Je n'avais pas encore protégé ma base de données Domoticz, alors j'ai regardé comment faire. Je n'ai pas besoin de sauvegarder les scripts (je n'ai pas prévu de les modifier quotidiennement ;) ), donc je suis parti de le code sur le wiki de Domoticz qui ne sauvegarde que la base de données : http://www.domoticz.com/wiki/Daily_back ... ternal_hdd

J'ai ajouté une variable :

Code : Tout sélectionner

MAX_FILES=7 
elle indique le nombre maxi de sauvegarde de la base de données. Avec une sauvegarde par jour, cela vous permet d'avoir une semaine roulante de sauvegardes.

Voici le script complet opérationnel :

Code : Tout sélectionner

#!/bin/bash
# LOCAL/FTP/SCP/MAIL PARAMETERS
SERVER="192.168.0.20"   # IP of Network disk, used for ftp
USERNAME="my_login"         # FTP username of Network disk used for ftp
PASSWORD="my_password"         # FTP password of Network disk used for ftp
DESTDIR="/public/backup_domoticz"   # distant storage
DOMO_IP="192.168.0.10"  # Domoticz IP
DOMO_PORT="8080"        # Domoticz port
MAX_FILES=7        # Max history files
### END OF USER CONFIGURABLE PARAMETERS

TIMESTAMP=`/bin/date +%Y%m%d%H%M`
BACKUPFILE="domoticz_$TIMESTAMP.db" # backups will be named "domoticz_YYYYMMDDHHMM.db.gz"
BACKUPFILEGZ="$BACKUPFILE".gz

### Create backup and ZIP it
curl -s http://$DOMO_IP:$DOMO_PORT/backupdatabase.php > /tmp/$BACKUPFILE
gzip -9 /tmp/$BACKUPFILE

### Send to Network disk through FTP
curl -s --disable-epsv -v -T"/tmp/$BACKUPFILEGZ" -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"

### Get list of distant FTP directory
curl -s -l -o /tmp/list.tmp  -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"

### Get number of distant backup
nb_files=$(cat /tmp/list.tmp | wc -l)
echo "number of distant files = $nb_files "

###  MAX_FILES test
if [ "$nb_files" -gt "$MAX_FILES" ]
then
        echo "too much file on distant FTP server"
        older_file=$(sort /tmp/list.tmp | grep -m 1 "")
        echo "I delete $older_file"
        curl -s -Q "-DELE $older_file" -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"
fi

### Remove temp files
/bin/rm /tmp/$BACKUPFILEGZ
/bin/rm /tmp/list.tmp
### Done!

une petite explication pour les curieux :
je mets dans un fichier temporaire (-o /tmp/list.tmp), la liste des fichiers distants en ne gardant que le nom (-l)

Code : Tout sélectionner

curl -s -l -o /tmp/list.tmp  -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"
je compte le nombre de ligne de ce fichier (wc -l) et je mets cette valeur dans la variable $nb_files

Code : Tout sélectionner

nb_files=$(cat /tmp/list.tmp | wc -l)
Si l'on a atteind le nombre maximum de fichiers (if [ "$nb_files" -gt "$MAX_FILES" ]) alors je trie mon fichier temporaire (sort /tmp/list.tmp) et, par construction du nom de fichier, le plus ancien se retrouve en tête de liste ; du coup, je ne récupère que le premier nom ( grep -m 1 "")

Code : Tout sélectionner

older_file=$(sort /tmp/list.tmp | grep -m 1 "")
Enfin, il suffit de supprimer le fichier distant avec une commande curl "avancée" (le -Q indique que l'on passe en mode de commande car il n'y a pas d'options curl pour effacer directement)

Code : Tout sélectionner

curl -s -Q "-DELE $older_file" -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"
EDIT : pour un filesystem type UNIX, il y a parfois un fichier ".." qui se glisse dans la liste des fichiers.

Du coup, il suffit de remplacer la ligne :

Code : Tout sélectionner

older_file=$(  sort /var/tmp/list.tmp | grep -m 1 "")
par :

Code : Tout sélectionner

older_file=$(sed -n '/^.\{3\}/p' /var/tmp/list.tmp | sort | grep -m 1 "")
le sed -n '/^.\{3\}/p' va supprimer tous les fichiers parasites de moins de 3 caractères ;)

Re: Script de backup avec limitation du nombre de sauvegardes

Posté : 16 avr. 2015, 21:01
par Flintstones
Merci J-S ! Je mets le script ce soir.

Re: Script de backup avec limitation du nombre de sauvegardes

Posté : 16 avr. 2015, 22:36
par js-martin
Tu nous diras si cela fonctionne chez toi ;)

Re: Script de backup avec limitation du nombre de sauvegardes

Posté : 17 avr. 2015, 08:14
par Flintstones
testé et validé ;)

Re: Script de backup avec limitation du nombre de sauvegardes

Posté : 21 avr. 2015, 08:57
par manuloup
Bonjour,

Perso dans mon script j'utilise un bon vieux find -mtime des familles :

find . -name "*.tgz" -mtime +7 -exec rm -rf {} \;

Ca marche parfaitement :)

Re: Script de backup avec limitation du nombre de sauvegardes

Posté : 03 mai 2015, 22:58
par js-martin
Flintstones a écrit :testé et validé ;)
super !
manuloup a écrit :Perso dans mon script : find . -name "*.tgz" -mtime +7 -exec rm -rf {} \;
La difficulté manuloup est que les fichiers sont accessibles en FTP... Du coup, le "find ." ne marche pas sur le serveur distant...(ni le rm)
J'ai édité le titre pour que cela soit plus clair ;)