[Bash] Script de backup avec limitation du nombre de sauvegardes sur le serveur distant
Publié : 16 avr. 2015, 11:09
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 :
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 :
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)
je compte le nombre de ligne de ce fichier (wc -l) et je mets cette valeur dans la variable $nb_files
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 "")
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)
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 :
par :
le sed -n '/^.\{3\}/p' va supprimer tous les fichiers parasites de moins de 3 caractères 
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
J'ai ajouté une variable :
Code : Tout sélectionner
MAX_FILES=7 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/"Code : Tout sélectionner
nb_files=$(cat /tmp/list.tmp | wc -l)Code : Tout sélectionner
older_file=$(sort /tmp/list.tmp | grep -m 1 "")Code : Tout sélectionner
curl -s -Q "-DELE $older_file" -u"$USERNAME:$PASSWORD" "ftp://$SERVER$DESTDIR/"Du coup, il suffit de remplacer la ligne :
Code : Tout sélectionner
older_file=$( sort /var/tmp/list.tmp | grep -m 1 "")Code : Tout sélectionner
older_file=$(sed -n '/^.\{3\}/p' /var/tmp/list.tmp | sort | grep -m 1 "")