Sauvegarde automatique 0.9
Posté le 16. October 2006 dans SysAdmin
Ce billet concerne une application, de mon cru, écrite en bash
.
Elle utilise l'application dar
pour effectuer des sauvegardes et les
copier sur un périphérique USB ou/et sur le réseau.Tous les patchs,
corrections, améliorations sont les bienvenues sur cette application
maison.
Pour fonctionner l'application se configure à l'aide d'un fichier du
dossier /etc
qui permet de déterminer une liste de dossier à
sauvegarder (/etc/autobackup
). Dans ce fichier, on y défini le dossier
à sauvegarde, le dossier de destination, le nombre de sauvegarde
incrémentale (ou dit d'une autre facon, au bout de combien fois faut-il
créer une nouvelle sauvegarde compléte?).
Il permet aussi de définir des points de copie où l'on place les différentes sauvegardes. (Ex: un périphérique USB, un dossier SSH).Ces points sont, bien sûr, utilisés seulement s'ils existent. Le fichier est copié sur le périphérique USB, s'il est branché, sur la machine distante si elle est allumée, ....
Il ne reste plus qu'à configurer ces petits scripts et les mettre dans un cron
Contenu exemple du fichier de configuration
# This config file make relation for backup
# Options
BACKUP_OPT="-v -s 4613734400 -D -z9 -m 150"
BACKUP_EXCLUDE_EXT="-Z *.avi -Z *.bz2 -Z *.gif -Z *.gz -Z *.jpg -Z *.mov -Z *.mpg -Z *.pbm -Z *.pdf -Z *.png -Z *.pnm -Z *.Z -Z *.zip"
BACKUP_EXCLUDE_PATH="-P phoenix/.bogofilter -P phoenix/.fonts -P phoenix/.kde/cache-maxiding -P phoenix/.kde/socket-maxiding -P phoenix/.kde/tmp-maxiding -P phoenix/.spamassassin -P phoenix/.thumbnails -P phoenix/.turboprint -P phoenix/.unison -P phoenix/.wesnoth -P phoenix/.widelands -P phoenix/.wine* -P phoenix/usr -P phoenix/virtuel -P .Trash-* -P phoenix/tmp"
# Copy Backup
COPYTO="usbdrive network"
# Copy to usb drive
usbdrive_type="usb"
usbdrive_dev="/dev/usb/disk1"
usbdrive_mountpoint="/media/disque/"
usbdrive_pathname="backup/"
# Copy to network
network_type="net"
network_host="miniding"
network_user="phoenix"
# no network_pass : use ssh key for backup
network_dir="/home/phoenix/backup"
# Home
home_name=maxiding_home
home_source=/home/
home_destination=/gravure/dar/home/
home_inc_max=10
# Etc
etc_name=maxiding_etc
etc_source=/etc/
etc_destination=/gravure/dar/etc/
etc_inc_max=10
Sauvegarde automatique
#!/bin/sh
#############################################################################
## Copyright (C) 2006 by Ulrich Van Den Hekke ##
## ulrich.vdh@free.fr ##
## ##
## This program is free software; you can redistribute it and/or modify ##
## it under the terms of the GNU General Public License as published by ##
## the Free Software Foundation; either version 2 of the License, or ##
## (at your option) any later version. ##
## ##
# /var
## This program is distributed in the hope that it will be useful, ##
## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
## GNU General Public License for more details. ##
## ##
## You should have received a copy of the GNU General Public License ##
## along with this program; if not, write to the ##
## Free Software Foundation, Inc., ##
## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ##
#############################################################################
if [ -e /etc/autobackup ] ; then
. /etc/autobackup
else
echo "Please configure the autobackup config file"
exit 1
fi
if [ $# -ne 1 ] ; then
echo "Please specify a project to backup"
exit 2
fi
# Define name of variable to use
var_name="\$$1_name"
var_source="\$$1_source"
var_destination="\$$1_destination"
var_inc_max="\$$1_inc_max"
# Define content of variable for the project
BACKUP_SRC=`eval echo $var_source`
BACKUP_DST=`eval echo $var_destination`
BACKUP_NAME=`eval echo $var_name`
BACKUP_INCREMENTAL_MAX=`eval echo $var_inc_max`
if [ -z "$BACKUP_NAME" ] ; then
echo "Project undefined"
exit 3
fi
BACKUP_BIN=dar
DATE_BACKUP=`date +%Y%m%d`
BACKUP_ARCHIVE="${BACKUP_NAME}_${DATE_BACKUP}"
# From config file
# COUNT_INCREMENTAL_BACKUP
# LAST_BACKUP
# LAST_COMPLETE_BACKUP
# Some options
# -v verbose
# -c archive name
# -R root place
# -s slice size
# -p slice pause
# -D backup empty dir
# -z9 compression gzip level 9
# -m for minimal size
# -Z exclude from compression
# -P exclude file
function start_backup() {
echo "Backup of $BACKUP_SRC in progress ..."
$BACKUP_BIN -c ${BACKUP_DST}${BACKUP_ARCHIVE} -R $BACKUP_SRC $BACKUP_OPT $BACKUP_EXCLUDE_EXT $BACKUP_EXCLUDE_PATH > ${BACKUP_DST}${BACKUP_NAME}.log
}
function load_backup_config() {
echo -n "Load config file ... "
if [ -e ${BACKUP_DST}${BACKUP_NAME}.config ] ; then
. ${BACKUP_DST}${BACKUP_NAME}.config
echo "loaded."
else
COUNT_INCREMENTAL_BACKUP=$BACKUP_INCREMENTAL_MAX
echo "not found"
fi
}
function save_backup_config() {
echo "Save backup config file ..."
echo "COUNT_INCREMENTAL_BACKUP=$COUNT_INCREMENTAL_BACKUP" > ${BACKUP_DST}${BACKUP_NAME}.config
echo "LAST_BACKUP=$DATE_BACKUP" >> ${BACKUP_DST}${BACKUP_NAME}.config
echo "LAST_COMPLETE_BACKUP=$LAST_COMPLETE_BACKUP" >> ${BACKUP_DST}${BACKUP_NAME}.config
}
function define_incremental() {
echo "There is $COUNT_INCREMENTAL_BACKUP on $BACKUP_INCREMENTAL_MAX"
if [ $COUNT_INCREMENTAL_BACKUP -lt $BACKUP_INCREMENTAL_MAX ] ; then
echo "Backup is incremental from $LAST_COMPLETE_BACKUP"
COUNT_INCREMENTAL_BACKUP=`expr $COUNT_INCREMENTAL_BACKUP + 1`
BACKUP_OPT="-A ${BACKUP_DST}${BACKUP_NAME}_${LAST_COMPLETE_BACKUP} ${BACKUP_OPT}"
else
echo "Backup is complete"
COUNT_INCREMENTAL_BACKUP=1
LAST_COMPLETE_BACKUP=$DATE_BACKUP
fi
}
load_backup_config;
define_incremental;
start_backup;
save_backup_config;
Copie automatique
#!/bin/sh
#############################################################################
## Copyright (C) 2006 by Ulrich Van Den Hekke ##
## ulrich.vdh@free.fr ##
## ##
## This program is free software; you can redistribute it and/or modify ##
## it under the terms of the GNU General Public License as published by ##
## the Free Software Foundation; either version 2 of the License, or ##
## (at your option) any later version. ##
## ##
## This program is distributed in the hope that it will be useful, ##
## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
## GNU General Public License for more details. ##
## ##
## You should have received a copy of the GNU General Public License ##
## along with this program; if not, write to the ##
## Free Software Foundation, Inc., ##
## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ##
#############################################################################
if [ -e /etc/autobackup ] ; then
. /etc/autobackup
else
echo "Please configure the autobackup config file"
exit 1
fi
if [ $# -ne 1 ] ; then
echo "Please specify a project to backup"
exit 2
fi
# Define name of variable to use
var_name="\$$1_name"
var_source="\$$1_source"
var_destination="\$$1_destination"
var_inc_max="\$$1_inc_max"
# Define content of variable for the project
BACKUP_SRC=`eval echo $var_source`
BACKUP_DST=`eval echo $var_destination`
BACKUP_NAME=`eval echo $var_name`
BACKUP_INCREMENTAL_MAX=`eval echo $var_inc_max`
if [ -z "$BACKUP_NAME" ] ; then
echo "Project undefined"
exit 3
fi
# From config file
# COUNT_INCREMENTAL_BACKUP
# LAST_BACKUP
# LAST_COMPLETE_BACKUP
function load_backup_config() {
echo -n "Load config file ... "
if [ -e ${BACKUP_DST}${BACKUP_NAME}.config ] ; then
. ${BACKUP_DST}${BACKUP_NAME}.config
BACKUP_ARCHIVE="${BACKUP_NAME}_${LAST_BACKUP}"
echo "loaded."
else
echo "not found"
exit 4
fi
}
function save_by_network() {
echo -n "Save on computer $HOST as $USER on $DIR"
ping -c 3 -W 10 $HOST > /dev/null
if [ $? -ne 0 ] ; then
echo "failed"
else
DESTINATION="${HOST}:${DIR}"
if [ -n $USER ] ; then
DESTINATION="${USER}@${DESTINATION}"
fi
scp ${BACKUP_DST}${BACKUP_ARCHIVE}* $DESTINATION
if [ $? -ne 0 ] ; then
echo "failed"
else
echo "ok"
fi
fi
}
function save_by_usb() {
echo -n "Save on drive $DEV "
if [ -e $DEV ] ; then
TOUMOUNT=1
LINECOUNT=`mount | grep $DEV | cut -f 1 -d\ | wc -l `
if [ $LINECOUNT -gt 0 ] ; then
MOUNTPOINT=`mount | grep $DEV | cut -f 3 -d\ `
TOUMOUNT=0
else
mount $MOUNTPOINT
if [ $? -ne 0 ] ; then
echo "mount failed "
fi
fi
if [ -d ${MOUNTPOINT}${PATHNAME} ] ; then
for FILE in `ls -1 ${BACKUP_DST}${BACKUP_ARCHIVE}*` ; do
FILENAME=`basename $FILE`
if [ -e ${MOUNTPOINT}${PATHNAME}${FILENAME} ] ; then
echo "exist "
else
cp ${FILE} ${MOUNTPOINT}${PATHNAME}
fi
done
echo "ok"
else
echo "failed"
fi
if [ $TOUMOUNT -eq 1 ] ; then
umount $MOUNTPOINT
fi
else
echo "device not found"
fi
}
function copy_to() {
echo "Start make copy of backup $BACKUP_NAME"
for NAME in $COPYTO ; do
var_type="\$${NAME}_type"
TYPE=`eval echo $var_type`
echo "--> $NAME as $TYPE"
case $TYPE in
"usb")
var_dev="\$${NAME}_dev"
DEV=`eval echo $var_dev`
var_mountpoint="\$${NAME}_mountpoint"
MOUNTPOINT=`eval echo $var_mountpoint`
var_pathname="\$${NAME}_pathname"
PATHNAME=`eval echo $var_pathname`
save_by_usb;
;;
"net")
var_host="\$${NAME}_host"
HOST=`eval echo $var_host`
var_user="\$${NAME}_user"
USER=`eval echo $var_user`
var_dir="\$${NAME}_dir"
DIR=`eval echo $var_dir`
save_by_network;
;;
esac
done
}
copy_to;