En approfondissant mes connaissances en shell j'ai écrit ce script:

#!/bin/bash
# 1.0

echo "Start at: "`date`

TIMESTAMP=`date +%Y-%m-%d`

# Backup folder
BKDIR=/projects/backup

# SVN save folder
DUMPSVN=$BKDIR/repos

# SVN repositories folder
SVNDIR=/repos

# Delete the old backups if they exist
if [ -d $DUMPSVN ] ; then
  rm -R $DUMPSVN
fi

# Create the new backup folders
mkdir -p $DUMPSVN

# Generate SVN dumps
echo "--------------------------------"
echo " RUNNING SVN BACKUP "$TIMESTAMP
echo "--------------------------------"
echo "Browse the repos directory: "$SVNDIR
cd $SVNDIR

if [ -d $DUMPSVN ] && [ -w $DUMPSVN ] ; then
  for repo in *; do
    echo "Taking backup/svndump for: "$repo
    echo "Executing : svnadmin dump --quiet $repo › $DUMPSVN/$TIMESTAMP.$repo.svn.dump"
    svnadmin dump --quiet $repo$DUMPSVN/$TIMESTAMP.$repo.svn.dump
    
    echo "Executing: tar cvpzf $DUMPSVN/$TIMESTAMP.$repo.svn.dump.gz $DUMPSVN/$TIMESTAMP.$repo.svn.dump"
    tar cvpzf $DUMPSVN/$TIMESTAMP.$repo.svn.dump.gz $DUMPSVN/$TIMESTAMP.$repo.svn.dump
    
    echo "Executing: rm $DUMPSVN/$TIMESTAMP.$repo.svn.dump"
    rm $DUMPSVN/$TIMESTAMP.$repo.svn.dump
    done
else
    echo "Unable to continue SVN backup process"
    echo $DUMPSVN "is *NOT* a directory or you not have write permission."
fi

# launch FTP script to send all files to our backup server
php /home/scripts/php/sendByFtp.php

echo "================================"
echo " BACKUP COMPLETE, THANK YOU :-]"

echo "End at: "`date`

La dernière commande est un script php qui permet d'envoyer les fichiers compressés sur un serveur distant:

require_once( dirname( __FILE__ ) . '/MyFtp.php' );
global $br;

function getFiles($handle, $path)
{
  $coll = array();
  while( false !== ($file = readdir( $handle )) )
  {
    if( !is_dir($path . '/' . $file ) && !in_array($file, array('.', '..') ))
    {
      $coll[$file] = $path . '/' . basename($file);
    }
  }
  return $coll;
}

function sendFiles($ftpHandler, $files)
{
  global $br;
  if( count($files) › 0 )
  {
    foreach($files as $file =› $path)
    {
      echo 'Try to send: ' . $file . $br;
      if( @$ftpHandler-›put( $file, $path ) )
      {
        echo "FTP succeed for " . $path. $br;
      }
      else
      {
        echo "FTP failed for " . $path . $br;
      }
    }
  }
}
$br = " \n";
$host = "ftp.mydomain.net";
$localDir = "/home/backup";
$pass = "mypass";
$user = "my-user-ftp";

echo "Browse local SVN backup dir" . $br;

// tries to open the base directory to make the package.
$handle = @opendir( $localDir . '/repos' ) or die( "Unable to open $localDir/repos" ) ;

//check for files
$files = getFiles($handle, $localDir . '/repos');

//closing the directory
closedir($handle);

$ftpHandler = new MyFtp($user, $pass, $host);

$ftpHandler-›cd('repos');
echo "Go to dir: /" . $ftpHandler-›currentDir . $br;

sendFiles( $ftpHandler, $files );
$ftpHandler-›close();

Le code source de la class MyFtp qui encapsule les traitements ftp est joint à ce post.

Voilà tout est dit dans les bouts de code ci-dessus.

Et pour terminer on ajoute un petit cron et le tour est joué.

Toutefois, l'envoie des fichiers par ftp n'est pas la méthode la plus sûre. L'échec du transfère est fréquent.

Il vaut mieux préférer une connexion avec rsync en ssl, plus fiable à mon sens.

Enjoy :)

A++
NairuS