Outils personnels

Rdiff-backup : Différence entre versions

De wikiGite

(Fichier rdbackup.conf v2.3)
Ligne 65 : Ligne 65 :
  
 
== script rdbackup.sh ==
 
== script rdbackup.sh ==
=== rdbackup.sh v2.4 ===
+
=== rdbackup.sh v2.5 ===
  #!/bin/bash
+
  #!/bin/bash  
 
  # Backup Script (RDIFF-BACKUP over SSH and RSYNC)
 
  # Backup Script (RDIFF-BACKUP over SSH and RSYNC)
 
  # FSo 06/2010
 
  # FSo 06/2010
  # V 2.4
+
  # V 2.5
 
  # from sbackup.sh (RSYNC)
 
  # from sbackup.sh (RSYNC)
 
  # Changelog :
 
  # Changelog :
 +
# 2.5 - Ehanced directional options (local/remote choice for source and destination)
 
  # 2.4 - Stop if necessary Apache service before dumping MySQL
 
  # 2.4 - Stop if necessary Apache service before dumping MySQL
 
  # 2.3 - Added backup sens (local to local or local to remote)
 
  # 2.3 - Added backup sens (local to local or local to remote)
Ligne 78 : Ligne 79 :
 
  # 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
 
  # 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  
 
  # 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 ]
 
  if [ $# -gt 0 ]
 
  then
 
  then
 
  # let use the given full path config (.conf) file
 
  # let use the given full path config (.conf) file
     . $1
+
     if [ -f $1 ]
 +
    then
 +
      . $1
 +
    else
 +
      echo "$1 introuvable !"
 +
      exit 1
 +
    fi
 
  else
 
  else
 
  # Application specific
 
  # Application specific
     . $(dirname $0)/rdbackup.conf
+
     if [ -f $(dirname $0)/rdbackup.conf ]
 +
    then
 +
      . $(dirname $0)/rdbackup.conf
 +
    else
 +
      echo "$(dirname $0)/rdbackup.conf introuvable !"
 +
      exit 1
 +
    fi
 +
fi
 +
 
 +
if [ ! -f $LIST ]
 +
then
 +
    echo "$LIST introuvable !"
 +
    exit 1
 
  fi
 
  fi
 
 
  while read line
 
  while read line
 
  do
 
  do
Ligne 93 : Ligne 119 :
 
     shift
 
     shift
 
  done < $LIST
 
  done < $LIST
+
 
 
  if [ ! -e $APPLICATION_DIR/$PID_FILE ]
 
  if [ ! -e $APPLICATION_DIR/$PID_FILE ]
 
  then
 
  then
 +
    if [ ! -d $BCK_DIR ]
 +
    then
 +
      mkdir -p $BCK_DIR
 +
      if [ $? -ne 0 ]
 +
      then
 +
          echo "Creation $BCK_DIR impossible !"
 +
          exit 1
 +
      fi
 +
    fi
 
   # Script pre-backup
 
   # Script pre-backup
 
     if [ -f $PRESCRIPT ]
 
     if [ -f $PRESCRIPT ]
Ligne 141 : Ligne 176 :
 
       if [ ! "x$EXCLUDE" == "x" ]
 
       if [ ! "x$EXCLUDE" == "x" ]
 
       then
 
       then
 +
          if [ ! -f $EXCLUDE ]
 +
          then
 +
            echo "$EXCLUDE introuvable !"
 +
            exit 1
 +
          fi
 
           EXCLUDE_OPT=""
 
           EXCLUDE_OPT=""
 
           while read line
 
           while read line
 
           do
 
           do
             if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
+
             if  [[ $line =~ ^$rdir ]]
 
             then
 
             then
 
                 EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
 
                 EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
Ligne 155 : Ligne 195 :
 
       echo >> $APPLICATION_DIR/$LOG_FILE
 
       echo >> $APPLICATION_DIR/$LOG_FILE
 
       echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
       echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
       if [ $LOCAL -eq 1 ]
+
       if [ $SLOCAL -eq 0 ]
 +
      then
 +
          RSSCHEMA=--remote-schema
 +
          RSOPTION="\"ssh -p $SOURCEPORT %s rdiff-backup --server\""
 +
          SDIR="$SOURCEUSR@$SOURCEIP::${rdir}"
 +
      else
 +
          RSSCHEMA=""
 +
          RSOPTION=""
 +
          SDIR="${rdir}"
 +
      fi
 +
      if [ $DLOCAL -eq 0 ]
 
       then
 
       then
           echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
+
           RDSCHEMA=--remote-schema
           rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT ${rdir} ${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
+
           RDOPTION="\"ssh -p $DESTINATIONPORT %s rdiff-backup --server\""
 +
          DDIR="$DESTINATIONUSR@$DESTINATIONIP::${BCK_DIR}$rdir"
 
       else
 
       else
           echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
+
           RDSCHEMA=""
           rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
+
           RDOPTION=""
 +
          DDIR="${BCK_DIR}$rdir"
 
       fi
 
       fi
 +
      echo rdiff-backup $RDIFF_OPTS $EXCLUDE_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 $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
       ERROR=$?
 
       ERROR=$?
 
       if [ $ERROR -ne 0 ]
 
       if [ $ERROR -ne 0 ]
Ligne 170 : Ligne 225 :
 
       else
 
       else
 
           echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
           echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
           if [ $LOCAL -eq 1 ]
+
           echo rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE
          then
+
  # Note : "eval" is necessary to correctly keep the quotes in $RDOPTION
            echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
+
           eval rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1
            rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
           else
 
            echo rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
            rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
          fi
 
 
           ERROR=$?
 
           ERROR=$?
 
           if [ $ERROR -ne 0 ]
 
           if [ $ERROR -ne 0 ]
Ligne 193 : Ligne 243 :
 
         grep -i warning $APPLICATION_DIR/$LOG_FILE
 
         grep -i warning $APPLICATION_DIR/$LOG_FILE
 
         grep -i error $APPLICATION_DIR/$LOG_FILE
 
         grep -i error $APPLICATION_DIR/$LOG_FILE
       )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
+
       )| mail -s "RDIFF ERROR ON $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
 
     else
 
     else
 +
      # Script post-backup
 +
      if [ -f $POSTSCRIPT ]
 +
      then
 +
          $POSTSCRIPT
 +
          if [ $? -ne 0 ]
 +
          then
 +
            ERRORS="$ERRORS - Script POST-BACKUP error"
 +
          fi
 +
      fi
 
       (date
 
       (date
 +
        echo $ERRORS
 
         ls -l $APPLICATION_DIR/$LOG_FILE
 
         ls -l $APPLICATION_DIR/$LOG_FILE
 
         df -k $APPLICATION_DIR
 
         df -k $APPLICATION_DIR
       )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
+
       )| mail -s "Backup $SERVERNAME $(date +%d/%m) successfull" $MAIL_ADMIN
 
     fi
 
     fi
 
     date >> $APPLICATION_DIR/$LOG_FILE
 
     date >> $APPLICATION_DIR/$LOG_FILE
Ligne 204 : Ligne 264 :
 
     rm -f $APPLICATION_DIR/$PID_FILE
 
     rm -f $APPLICATION_DIR/$PID_FILE
 
  else
 
  else
     (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
+
     (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "BACKUP ERROR ON $SERVERNAME [on $(hostname)]" $MAIL_ADMIN
 
  fi
 
  fi
  

Version du 31 janvier 2012 à 09:42

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.

# 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
# 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.



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 !).


script rdbackup.sh

rdbackup.sh v2.5

#!/bin/bash 
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
# FSo 06/2010
# V 2.5
# from sbackup.sh (RSYNC)
# Changelog :
# 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 [ ! -f $LIST ]
then
   echo "$LIST introuvable !"
   exit 1
fi
while read line
do
   REMOTE_DIR="$REMOTE_DIR $line"
   shift
done < $LIST
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
 # Script pre-backup
   if [ -f $PRESCRIPT ]
   then
      $PRESCRIPT
      if [ $? -ne 0 ]
      then
         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.sql_$DB.gz $APPLICATION_DIR/mysqldump.sql_$DB.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
   echo $$ > $APPLICATION_DIR/$PID_FILE
   /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: "
   for rdir in $(echo $REMOTE_DIR)
   do
      if [ ! "x$EXCLUDE" == "x" ]
      then
         if [ ! -f $EXCLUDE ]
         then
            echo "$EXCLUDE introuvable !"
            exit 1
         fi
         EXCLUDE_OPT=""
         while read line
         do
            if  $line =~ ^$rdir 
            then
               EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
            fi
            shift
         done < $EXCLUDE
      fi
      # 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::${rdir}"
      else
         RSSCHEMA=""
         RSOPTION=""
         SDIR="${rdir}"
      fi
      if [ $DLOCAL -eq 0 ]
      then
         RDSCHEMA=--remote-schema
         RDOPTION="\"ssh -p $DESTINATIONPORT %s rdiff-backup --server\""
         DDIR="$DESTINATIONUSR@$DESTINATIONIP::${BCK_DIR}$rdir"
      else
         RDSCHEMA=""
         RDOPTION=""
         DDIR="${BCK_DIR}$rdir"
      fi
      echo rdiff-backup $RDIFF_OPTS $EXCLUDE_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 $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1
      ERROR=$?
      if [ $ERROR -ne 0 ]
      then
         ERRORS="$ERRORS $BASE=$ERROR:"
         ERROR_FLAG=1
      else
         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
   done
   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 $(date +%d/%m)" $MAIL_ADMIN
   else
     # Script post-backup
      if [ -f $POSTSCRIPT ]
      then
         $POSTSCRIPT
         if [ $? -ne 0 ]
         then
            ERRORS="$ERRORS - Script POST-BACKUP error"
         fi
      fi
      (date
       echo $ERRORS
       ls -l $APPLICATION_DIR/$LOG_FILE
       df -k $APPLICATION_DIR
      )| mail -s "Backup $SERVERNAME $(date +%d/%m) successfull" $MAIL_ADMIN
   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)]" $MAIL_ADMIN
fi

Fichier rdbackup.conf v2.4

A positionner dans le même répertoire que le script

# Rdbackup configuration file
MAIL_ADMIN=<Mail de l'admin>
SERVERNAME=$(hostname)
# LOCAL = 1 : backup to local directory (or NFS mount or SMB mount)
# LOCAL = 0 : backup to a remote server (via SSH)
LOCAL=1
# Stop Apache before dumping MySQL ? Yes if STOPAPACHE=1
STOPAPACHE=0
# IP, port, user of backup server (if remote)
SERVERIP=192.168.1.10
SERVERPORT=22
SERVERUSR=root
# 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=</path/to/application>
# Or :
# APPLICATION_DIR=$SCRIPT_DIR
LIST=$SCRIPT_DIR/rdbackup.list
EXCLUDE=$SCRIPT_DIR/rdbackup.exclude
# LOG and other files
LOG_FILE=rdiff.log
STAT_FILE=rdiff.stats
PID_FILE=rdiff.pid
# Options
RDIFF_OPTS="-v5 --force"
RETENTION="--remove-older-than 1W"
# Script to launch BEFORE backup
PRESCRIPT=
# BACKUP DESTINATION DIRECTORY (local or on remote server)
BCK_DIR=/home/backup
# DUMP MYSQL
# Change to MYSQLDUMP=0 to disable
MYSQLDUMP=1 
MYSQL_PASSWORD=<Mot de passe MySQL>
# MYDB=<mysql_db_name> # Or :
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)
MYSQLDUMP_OPTS="--routines"

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 )