Outils personnels

Rdiff-backup : Différence entre versions

De wikiGite

(script rdbackup.sh)
Ligne 168 : Ligne 168 :
 
  wget --content-disposition --no-check-certificate https://indefero.systea.fr/p/rdbackup/source/download/master/
 
  wget --content-disposition --no-check-certificate https://indefero.systea.fr/p/rdbackup/source/download/master/
  
=== rdbackup.sh v3.0 ===
+
=== rdbackup.sh ===
<source lang="bash">
+
Le script évolue constamment. La dernière version est disponible sur le dépôt public https://indefero.systea.fr/p/rdbackup/source/tree/master/.
#!/bin/bash
 
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
 
# (C) FSo 06/2010
 
# V 3.0
 
# from sbackup.sh (RSYNC)
 
# Changelog :
 
# 3.0 - Return to a normal usage of "--include" from rdiff-backup instead of
 
#      backuping each dir. individually. This allow tools like rdiff-backup-web
 
#      to handle entire backup of a server.
 
# 2.6 - Some optimizations on directional options
 
# 2.5 - Ehanced directional options (local/remote choice for source and destination)
 
# 2.4 - Stop if necessary Apache service before dumping MySQL
 
# 2.3 - Added backup sens (local to local or local to remote)
 
#    - Added backup destination in .conf file : LOCAL or REMOTE
 
# 2.2 - Reverse backup from client to backup server
 
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
 
# 2.0 - Moving variables in a .conf file
 
 
ELAPSED=$(which time)
 
if [ ! -x $ELAPSED ]
 
then
 
    unset ELAPSED
 
else
 
    ELAPSED="$ELAPSED -fElapsed:%E"
 
fi
 
 
if [ $# -gt 0 ]
 
then
 
# let use the given full path config (.conf) file
 
    if [ -f $1 ]
 
    then
 
      . $1
 
    else
 
      echo "$1 introuvable !"
 
      exit 1
 
    fi
 
else
 
# Application specific
 
    if [ -f $(dirname $0)/rdbackup.conf ]
 
    then
 
      . $(dirname $0)/rdbackup.conf
 
    else
 
      echo "$(dirname $0)/rdbackup.conf introuvable !"
 
      exit 1
 
    fi
 
fi
 
 
if [ ! -z "$LIST" ]
 
then
 
    if [ ! -f $LIST ]
 
    then
 
      echo "$LIST introuvable !"
 
      exit 1
 
    fi
 
    while read line
 
    do
 
      if [ ! -z "$line" ]
 
      then
 
          if [ -z "$INCLUDE_OPT" ]
 
          then
 
            INCLUDE_OPT="--include $line"
 
          else
 
            INCLUDE_OPT="$INCLUDE_OPT --include $line"
 
          fi
 
      fi
 
      shift
 
    done < $LIST
 
    # Add a final exclusion of "/" to avoid full root backup
 
    INCLUDE_OPT="$INCLUDE_OPT --exclude '**'"
 
fi
 
 
if [ ! -z "$EXCLUDE" ]
 
then
 
    if [ ! -f $EXCLUDE ]
 
    then
 
      echo "$EXCLUDE introuvable !"
 
      exit 1
 
    fi
 
    EXCLUDE_OPT=""
 
    while read line
 
    do
 
      if [ ! -z "$line" ]
 
      then
 
          if [ -z "$EXCLUDE_OPT" ]
 
          then
 
            EXCLUDE_OPT="--exclude $line"
 
          else
 
            EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
 
        fi
 
      fi
 
      shift
 
    done < $EXCLUDE
 
fi
 
 
if [ ! -e $APPLICATION_DIR/$PID_FILE ]
 
then
 
    if [ ! -d $BCK_DIR ]
 
    then
 
      mkdir -p $BCK_DIR
 
      if [ $? -ne 0 ]
 
      then
 
          echo "Creation $BCK_DIR impossible !"
 
          exit 1
 
      fi
 
    fi
 
    echo $$ > $APPLICATION_DIR/$PID_FILE
 
  # Script pre-backup
 
    if [ -f $PRESCRIPT ]
 
    then
 
      $PRESCRIPT
 
      if [ $? -ne 0 ]
 
      then
 
          rm -f $APPLICATION_DIR/$PID_FILE
 
          (echo "$PRESCRIPT ERROR ON $HOSTNAME") | mail -s "BACKUP ERROR ON $SERVERNAME [on $(hostname)] $(date +%d/%m)" $MAIL_ADMIN
 
          exit 1
 
      fi
 
    fi
 
    if [ $STOPAPACHE -eq 1 ]
 
    then
 
      service httpd stop
 
    fi
 
    if [ $MYSQLDUMP -eq 1 ]
 
    then
 
      for DB in $MYDB
 
      do
 
          mv $APPLICATION_DIR/mysqldump_$DB.sql.gz $APPLICATION_DIR/mysqldump_$DB.sql.gz.0 2>> $APPLICATION_DIR/$LOG_FILE.0
 
          mysqldump $DB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0
 
          gzip $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0
 
      done
 
    fi
 
    if [ $STOPAPACHE -eq 1 ]
 
    then
 
      service httpd start
 
    fi
 
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
 
    if [ -e  $APPLICATION_DIR/$LOG_FILE ]
 
    then
 
        mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
 
    fi
 
    if [ -e  $APPLICATION_DIR/$STAT_FILE ]
 
    then
 
        mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
 
    fi
 
    echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
 
    #Boucle de backup
 
    ERROR_FLAG=0
 
    ERROR=0
 
    ERRORS="ERREURS: "
 
 
    # rdiff
 
    date >> $APPLICATION_DIR/$LOG_FILE
 
    echo >> $APPLICATION_DIR/$LOG_FILE
 
    echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
    if [ $SLOCAL -eq 0 ]
 
    then
 
      RSSCHEMA=--remote-schema
 
      RSOPTION="\"ssh -p $SOURCEPORT %s rdiff-backup --server\""
 
      SDIR="$SOURCEUSR@$SOURCEIP::/"
 
    else
 
      RSSCHEMA=""
 
      RSOPTION=""
 
      SDIR="/"
 
    fi
 
    if [ $DLOCAL -eq 0 ]
 
    then
 
      RDSCHEMA=--remote-schema
 
      RDOPTION="\"ssh -p $DESTINATIONPORT %s rdiff-backup --server\""
 
      DDIR="$DESTINATIONUSR@$DESTINATIONIP::${BCK_DIR}"
 
    else
 
      RDSCHEMA=""
 
      RDOPTION=""
 
      DDIR="${BCK_DIR}"
 
    fi
 
    echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $INCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE
 
# Note : "eval" is necessary to correctly keep the quotes in $RSOPTION
 
    eval $ELAPSED rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $INCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
    ERROR=$?
 
    if [ $ERROR -ne 0 ]
 
    then
 
      ERRORS="$ERRORS $BASE=$ERROR:"
 
      ERROR_FLAG=1
 
    else
 
      if [ "${RETENTION:0:19}" != "--remove-older-than" ]
 
      then
 
          RETENTION="--remove-older-than $RETENTION --force"
 
      fi
 
      echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
      echo rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE
 
# Note : "eval" is necessary to correctly keep the quotes in $RDOPTION
 
      eval rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
      ERROR=$?
 
      if [ $ERROR -ne 0 ]
 
      then
 
          ERRORS="$ERRORS $BASE=$ERROR:"
 
          ERROR_FLAG=1
 
      fi
 
    fi
 
 
    if [ $ERROR_FLAG -eq 1 ]
 
    then
 
      (echo $ERRORS
 
        date
 
        echo Voir $APPLICATION_DIR/$LOG_FILE
 
        grep -i warning $APPLICATION_DIR/$LOG_FILE
 
        grep -i error $APPLICATION_DIR/$LOG_FILE
 
      )| mail -s "RDIFF ERROR ON $SERVERNAME [on $(hostname)] $(date +%d/%m)" $MAIL_ADMIN
 
    else
 
      # Script post-backup
 
      if [ -f $POSTSCRIPT ]
 
      then
 
          $POSTSCRIPT
 
          if [ $? -ne 0 ]
 
          then
 
            ERRORS="$ERRORS - Script POST-BACKUP error"
 
            ERROR_FLAG=1
 
          fi
 
      fi
 
      if [ $MAIL_IF_SUCCESS -eq 1 ]
 
      then
 
          if [ $ERROR_FLAG -eq 0 ]
 
          then
 
            ERRORS=""
 
          fi
 
          (date
 
          echo $ERRORS
 
          ls -l $APPLICATION_DIR/$LOG_FILE
 
          df -k $APPLICATION_DIR
 
          )| mail -s "Backup $SERVERNAME [on $(hostname)] successfull $(date +%d/%m)" $MAIL_ADMIN
 
      fi
 
    fi
 
    date >> $APPLICATION_DIR/$LOG_FILE
 
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
    rm -f $APPLICATION_DIR/$PID_FILE
 
else
 
    (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "BACKUP ERROR ON $SERVERNAME [on $(hostname)] $(date +%d/%m)" $MAIL_ADMIN
 
fi
 
 
 
</source>
 
-----------------------
 
 
 
=== Fichier rdbackup.conf v3.0 ===
 
'''A positionner dans le même répertoire que le script'''.
 
 
 
En '''<span style="color:red">rouge</span>''' : paramètres à modifier a minima. En '''<span style="color:green">vert</span>''' : paramètres à vérifier.
 
# Rdbackup configuration file
 
MAIL_ADMIN='''<span style="color:red">admin@domain.com</span>'''
 
MAIL_IF_SUCCESS=1
 
# If more mail addresses needed : MAIL_ADMIN="admin1@domain.com admin2@domain.com"
 
SERVERNAME='''<span style="color:red">server.domain.com</span>'''
 
SUFFIX='''<span style="color:red">_server</span>'''
 
# Backup source
 
# SLOCAL=0 : backup FROM a remote server (via SSH)
 
# SLOCAL=1 : backup FROM a local directory (or NFS mount or SMB mount)
 
SLOCAL='''<span style="color:green">1</span>'''
 
# Source IP, port, user of backup server (if remote)
 
SOURCEIP=server.domain.com
 
SOURCEPORT=22
 
SOURCEUSR=root
 
# Backup destination
 
# DLOCAL=0 : backup TO a remote server (via SSH)
 
# DLOCAL=1 : backup TO a local directory (or NFS mount or SMB mount)
 
DLOCAL='''<span style="color:green">0</span>''
 
# BACKUP DESTINATION DIRECTORY (local or on remote server)
 
BCK_DIR='''<span style="color:red">/media/backup/$SERVERNAME</span>'''
 
# destination IP, port, user of backup server (if remote)
 
DESTINATIONIP='''<span style="color:green">192.168.0.100</span>'''
 
DESTINATIONPORT='''<span style="color:green">22</span>'''
 
DESTINATIONUSR='''<span style="color:green">root</span>'''
 
# Path where are rdbackup.sh, .conf, .list and .exclude
 
SCRIPT_DIR=$(dirname $0)
 
# Specific application path, for log/pid files, mysqldump destination and df
 
APPLICATION_DIR=$SCRIPT_DIR
 
# Or :
 
#APPLICATION_DIR=</path/to/application>
 
LIST=$SCRIPT_DIR/rdbackup${SUFFIX}.list
 
EXCLUDE=$SCRIPT_DIR/rdbackup${SUFFIX}.exclude
 
# LOG and other files
 
LOG_FILE=rdbackup${SUFFIX}.log
 
STAT_FILE=rdbackup${SUFFIX}.stats
 
PID_FILE=rdbackup${SUFFIX}.pid
 
# Options
 
RDIFF_OPTS="-v5 --force --create-full-path --exclude-fifos --exclude-sockets"
 
# Cleanup options (default : 1 week)
 
RETENTION=1W
 
# Script to launch BEFORE backup
 
PRESCRIPT=
 
# Script to launch AFTER backup
 
POSTSCRIPT=
 
# DUMP MYSQL
 
# Stop Apache before dumping MySQL ? Yes if STOPAPACHE=1
 
STOPAPACHE=0
 
#  Dump disabled if MYSQLDUMP=0
 
MYSQLDUMP=0
 
MYSQL_PASSWORD='''<span style="color:red">Mot_de_passe_MySQL</span>'''
 
# MYDB=<mysql_db_name> # Or :
 
if [ $MYSQLDUMP -eq 1 ]
 
then
 
    MYDB=$(mysql --execute "show databases\G" --password=$MYSQL_PASSWORD | grep -v row | sed -e 's/Database: //g' | grep -v mysql | grep -v information_schema | grep -v performance_schema)
 
fi
 
MYSQLDUMP_OPTS="--routines"
 
 
 
== Point à vérifier pour l'ajout d'un serveur ==
 
Pour une sauvegarde lancée à partir d'un serveur de backup central, vers les serveur à sauvegarder :
 
# configurer les fichiers .conf, .list et .backup sur le serveur de backup
 
# Copier la clé /root/.ssh/id_dsa.pub du serveur de backup dans /root/.ssh/authorized_keys du serveur sauvegardé
 
# vérifier que le serveur de backup se connecte sans mot de passe au serveur à sauvegarder par ssh root@serveur_a_sauvegarder (profiter de ce test pour enregistrer la clé publique du serveur à sauvegarder)
 
# Vérifier que rdiff-backup est bien installé et à la bonne version sur le serveur à sauvegarder !
 
------------------------------
 
  
 
= Windows =
 
= Windows =

Version du 25 juillet 2013 à 07:16

Linux

Installation

Sur Debian 5 --> v1.2.5 (la différence de version mineure (.5 pour .8) ne provoque qu'un avertissement)

apt-get install rdiff-backup

Si on veut une version plus récente, il faut compiler :

apt-get install librsync-dev python-dev
wget http://savannah.nongnu.org/download/rdiff-backup/rdiff-backup-1.2.8.tar.gz
tar -xvzf rdiff-backup-1.2.8.tar.gz
cd rdiff-backup-1.2.8
python setup.py install

Sur CentOS, si ça n'a pas déjà été fait (pour munin par exemple), installation repos RPMForge (-> Dépôts complémentaires).

Puis

yum --enablerepo=rpmforge install rdiff-backup

Echanger les clés DSA entre les serveurs

Afin que la connexion de Rdiff-backup via SSH ne demande pas de mot de passe, la clé ~/.ssh/id_dsa.pub de l'utilisateur qui se connecte à partir du "client" rdiff-backup doit être copiée "en une seule ligne" dans ~/.ssh/authorized_keys de l'utilisateur cible sur le serveur à sauvegarder. (se reporter à une procédure d'échange de clés pour SSH)


Test d'accès à un serveur

rdiff-backup --test-server root@192.168.1.21::/home

Sauvegardes

à partir d'un backup existant (cp ou rsync) : le répertoire destination existe mais n'est pas au format rdiff (manque les infos rdiff-data), il faut le forcer la première fois :

rdiff-backup --force -v5 root@192.168.1.2::/etc /backup/etc > rdiff_server1.log 2>&1

Ensuite on peut enlever le "--force".


Nettoyage

des incréments supérieurs à une fenêtre de rétention :

rdiff-backup -v5 --remove-older-than 4W /backup

Le "4W" signifie "4 weeks", soit 4 semaines à conserver. On peut donner un nombre de jours ("D") ou d'heures ("H"). Tous les incréments supérieurs à ce délai seront supprimés.

Informations sur les sauvegardes

Liste des incréments :
Sur le serveur de sauvegarde :

rdiff-backup -l /home/backup/server1/home/

A partir du serveur sauvegardé (remote-schema n'est utile que si le port ssh n'est pas standard) :

rdiff-backup -l --remote-schema='ssh -p 225 -C %s rdiff-backup --server' root@192.168.1.250::/home/backup

On peut lister aussi les tailles des différents incréments

rdiff-backup --list-increment-sizes /home/backup/server1/home/

Restore - Exemples

NOTE : le restore NE FONCTIONNE PAS SUR LES LIENS. Il faut indiquer le "vrai" répertoire ou fichier physique à restorer.

NOTE 2 : VERIFIER LES DROITS DES REPERTOIRES APRES UNE RESTAURATION, ils peuvent avoir changé.

# fichier /etc/hosts d'il y a 1 heure (--force si le fichier existe et qu'il faut l'écraser)
rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts

NOTE : le nom du fichier doit être indiqué à la source COMME A LA DESTINATION, sinon rdiff remonte TOUT LE REPERTOIRE !

# répertoire /etc d'il y a 3 jours
rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc

NOTE : le "-r" est obligatoire, on peut mettre "-r now", ou mieux: " -r "1B" " pour remonter la dernière sauvegarde. D'autres solutions sont "1D" (comme pour le backup) pour remonter la veille, ou 5m3s, ou 2010-12-21.
NOTE 2 : pour remonter un répertoire complet, il faut l'indiquer la source comme à la destination SANS "/" APRES (voir ci-dessus l'exemple /etc)

Exemple plus complet :

# rdiff-backup -l /mnt/backup/server1
Found 5 increments:
   increments.2013-04-12T01:28:44+02:00.dir   Fri Apr 12 01:28:44 2013
   increments.2013-04-13T01:29:00+02:00.dir   Sat Apr 13 01:29:00 2013
   increments.2013-04-15T01:27:16+02:00.dir   Mon Apr 15 01:27:16 2013
   increments.2013-04-16T01:29:06+02:00.dir   Tue Apr 16 01:29:06 2013
   increments.2013-04-17T01:31:23+02:00.dir   Wed Apr 17 01:31:23 2013
Current mirror: Thu Apr 18 01:29:44 2013
# rdiff-backup -v5 -r "2013-04-12" --force /mnt/backup/server1/home/web root@server1.localdomain::/home/web

NOTE : partages CIFS/SMBFS

Documentation rdiff-backup :

rdiff-backup fails to run, printing an exception about "assert not upper_a.lstat()" failing. This can be resolved by unmounting the share, running the following command as root:
$ echo 0 > /proc/fs/cifs/LookupCacheEnabled
and then remounting the CIFS share.

Penser à ajouter cette ligne à /etc/rc.local pour qu'elle soit exécutée au démarrage du serveur.

De plus, si Windows est la destination des backups (par un montage samba sur une machine linux par exemple), il faut penser que le système cible ne connait pas les ACL unix (droits sur les fichiers, propriétaires, etc...). Il faut donc dire à rdiff-backup de ne pas essayer de faire des "chmod" et "chown". Windows ne sait pas non plus interpréter les liens, qu'ils soient hards ou symboliques.

Lancer rdiff-backup avec les options suivantes (en plus d'éventuelles autres options qui semblent utiles):

--no-hard-links --exclude-symbolic-links --no-acls --no-eas

Dans le fichier de configuration du script rdbackup ci-dessous, le paramètre RDIFF_OPTS serait donc:

RDIFF_OPTS="-v5 --force --create-full-path --exclude-fifos --exclude-sockets --no-hard-links --exclude-symbolic-links --no-acls --no-eas"

DEPANNAGE

Si après un problème de sauvegarde (disque plein, coupure de session ssh, etc...), les backups suivants se terminent en erreur (erreurs checksum ou autres), il faut supprimer le répertoire rdiff-backup-data et relancer un backup avec --force pour repartir à zéro (on perd l'historique des incréments !).

Rdiff-backup-web

Installer rdiff-backup-web sur un serveur apache/php/mysql ayant accès aux répertoires de backup.

apt-get install apache2 php5 php-mysql mysql-server
cd /var/www
wget http://sourceforge.net/projects/rdiffbackupweb/files/rdiffbackupweb/0.09/rdiff-backup-web.0.09.tar.gz
tar -xvzf rdiff-backup-web.0.09.tar.gz

Déclarer un virtualhost Apache avec comme DocumentRoot le répertoire rdiff-backup-web ainsi créé.

Créer une base mysql (par convention nommée "rdiff"). Créer un utilisateur rdiff ayant tous les droits sur cette base.

mysql -p
mysql> create database rdiff;
mysql> grant all privileges on rdiff.* to rdiff identified by 'mot_de_passe';
mysql> exit

Charger la base

mysql -p rdiff < /var/www/rdiff-backup-web/rdiff.sql

Configurer cette base et l'utilisateur dans /var/www/rdiff-backup-web/config.php, ainsi que l'arborescence de la destination des backups.

Se connecter à l'interface dans un navigateur, connexion avec "admin"/"admin" par défaut. Supprimer l'utilisateur "test" inutil et changer tout de suite le mot de passe admin.

rdiffweb

rdiffWeb est une interface web avec un backend en python pour naviguer et restaurer les backups fait avec rdiff-backup.

http://www.rdiffweb.org/wiki/index.php?title=Installation
http://open.nshare.de/wiki/setup/rdiffweb-behind-apache-reverse-proxy

Installation sur Centos 6

Ajouter le dépôt rpmforge

Installer les dépendances:

yum install sqlite-devel
yum install --enablerepo=rpmforge python-cherrypy
  • Installer le rpm :
yum install http://www.rdiffweb.org/releases/rdiffWeb-0.6.3-1.noarch.rpm
  • Installer le rpm source :
wget http://www.rdiffweb.org/releases/rdiffWeb-0.6.3-1.src.rpm
yum install rpmdevtools yum-utils
rpmbuild --rebuild rdiffWeb-0.6.3-1.src.rpm
yum install rpmbuild/RPMS/noarch/rdiffWeb-0.6.3-1.noarch.rpm

lancer cette commande permet de configurer rdiff-web :

rdiff-web-config

Éditer le fichier de configuration :

vim /etc/rdiffweb/rdw.conf

Ajouter ceci

ServerHost=0.0.0.0
ServerPort=8080


Mettre 0.0.0.0 permet d’accéder à l'interface web depuis un autre ordinateur sur le port 8080. Le port peut également être modifié. ATTENTION : La configuration automatique de rdw.conf met 'ServerName'. Il faut le remplacer par 'ServerHost'.

Problème de lancement de rdiffweb :

cherrypy.engine.on_stop_engine_list.append(lambda: killEvent.set())
AttributeError: 'Bus' object has no attribute 'on_stop_engine_list'

lancer rdiffweb -d , modifier le script d'init en conséquence.

Installation sur Debian

exécuter le script se trouvant sur le dépôt git :

https://indefero.systea.fr/p/rdiffweb/source/tree/master/rdiffweb-install-debian.sh

Le script original se trouve sur http://www.timedicer.co.uk/programs/help/rdiffweb-install.sh.php . le script précédant est allégé par rapport à celui-ci.

Script bash

script rdbackup.sh

Un dépot git contenant les sources est disponible ici : https://indefero.systea.fr/p/rdbackup/source/tree/master/

Pour récupérer directement la derniere version disponible avec wget :

wget --content-disposition --no-check-certificate https://indefero.systea.fr/p/rdbackup/source/download/master/

rdbackup.sh

Le script évolue constamment. La dernière version est disponible sur le dépôt public https://indefero.systea.fr/p/rdbackup/source/tree/master/.

Windows

Installation

Télécharger :

  • Rdiff (rdiff-backup-1.2.8-win32.zip)
http://www.nongnu.org/rdiff-backup/
  • putty, plink et puttygen
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
  • Blat (blat262.full.sip)
http://sourceforge.net/projects/blat/files/

Préparation de la connexion SSH

Note : on considère ici que la sauvegarde est lancée d'un poste Windows vers un serveur linux

Lancer puttygen. Sélectionner "SSH-2 DSA" en bas, cliquer sur "Generate" et bouger la souris dans l'espace blanc au milieu de la fenêtre.

Copier la clé DSA qui s'affiche en haut de la fenêtre (sans oublier aucun caractère !), la passer telle, en une seule ligne, quelle vers le serveur linux (via un fichier par scp/ftp, ou mail, ou copier/coller dans une console putty) dans le fichier ~/.ssh/authorized_keys du serveur.

Sauvegarder les clés dans le répertoire Documents and Setting (Win XP/2003) ou Users (Win 7/2008) de l'utilisateur qui lancera rdiff-backup.

  • Clé publique :
en cliquant sur "save public key"
nommer le fichier privatekey.pub
  • Clé privée :
en cliquant sur "save private key"
nommer le fichier privatekey.ppk

Tests de connexion

Tester la connexion avec plink (ce qui permet d'enregistrer localement la clé du serveur à la première connexion) :

c:\backup\plink.exe -i C:\Users\<utilisateur windows>\privatekey.ppk utilisateur_cible@server.systea.net

la connexion doit se faire sans demande de mot de passe.

Tester rdiff-backup :

c:\backup\rdiff-backup -v5 --test-server --remote-schema "c:\backup\plink.exe -P 22 -i C:\Users\<utilisateur windows>\privatekey.ppk %s rdiff-backup --server" utilisateur_cible@server.systea.net::/tmp

Test de Blat

Tester un envoi (le nom de fichier qui constituera le corps du mail est obligatoire, sinon blat reste "en attente" et ne rend jamais la main).

blat c:\backup\fichier.txt -to destinataire@server.systea.net -server smtp.orange.fr -f expediteur@serveur.com -s "SUJET DU MAIL"

Script de sauvegarde

NOTE : le "%s" doit être transformé en "%%s" pour être reconnu par l'interpréteur DOS.

rem @echo off
set ERROR=0
set MAILOPTS=-server smtp.orange.fr -f expediteur@serveur.com

copy c:\backup\backup.log c:\backup\backup.log.0

c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" "c:/partage/" USER@SERVER.systea.net::/home/backup/partage > c:\backup\backup.log 2>&1
IF NOT "%ERRORLEVEL%"=="0" (
   set ERROR=1)
REM le LOG n'est pas relaché tout de suite, on doit simuler une pause de 5 secondes...
ping -n 5 127.0.0.1
c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" --remove-older-than 4W USER@SERVER.systea.net::/home/backup/partage >> c:\backup\backup.log 2>&1
IF NOT "%ERRORLEVEL%"=="0" (
   set ERROR=1)
ping -n 5 127.0.0.1

IF "%ERROR%"=="0" (
   c:\backup\blat\full\blat c:\backup\backup.log -to destinataire@systea.net %MAILOPTS% -s "Sauvegarde terminee" > c:\backup\blat.log 2>&1 )
IF NOT "%ERROR%"=="0" (
   c:\backup\blat\full\blat c:\backup\backup.log -to destinataire@systea.net %MAILOPTS% -s "Probleme sauvegarde" > c:\backup\blat.log 2>&1 )