Souvent je me suis demandé comment mettre en place de manière automatique un script permettant de sauvegarder des dossiers locaux sur un partage de fichiers samba, depuis linux ou Mac OSX. La réponse n’est pas très compliquée.La solution à mettre en place se compose de deux étapes et donc deux scripts. Le premier doit s’assurer que le partage samba est toujours bien monté sur la machine exécutant la sauvegarde (ici un mac sous Snow Leopard). Pour se faire, nous allons exécuter via cron le script suivant tous les jours à 11h59 (p.ex.) :

#!/bin/sh
# Put Samba Host IP as Host
host="10.0.1.103"

# Desktop Path with trailing slash
desktop="/Volumes/"

# Share Username
username="myUser"

# Share Password
password="myPassword"

# Share 1 Name
shr1="sharedFolderName"

# Ping the host to see if it exists
outp=`ping -c 1 $host | grep "0.0% packet loss"`

# Based on ping create folders and mount
# or don't mount and delete folders if they exist
if [ "$outp" = "1 packets transmitted, 1 packets received, 0.0% packet loss" ]; then
echo "Found $host, mounting file systems..."
# Share 1
dir1=${desktop}${shr1}

if [ ! -d "$dir1" ]; then
# Can't Find Directory So Create It
echo "Creating Mount Point: $dir1";
mkdir "$dir1"
else
echo "Found Mount Point: $dir1"
fi

if [ -d "$dir1" ]; then
echo "Mounting..."
mount_smbfs //"$username":"$password"@"$host"/"$shr1" "$desktop""$shr1"
fi
fi

Ensuite, il nous faut exécuter le script de sauvegarde à 12h (p.ex.). Voici son contenu :

#!/bin/sh
FOLDER=encore;
LOCAL_TARGET=/Volumes/sharedFolderName;
# Rotating backups:

# step 1: delete the oldest backup, if it exists
# rm options are (r)ecursive and (f)orce
if [ -d $LOCAL_TARGET/$FOLDER.5 ] ; then
rm -rf $LOCAL_TARGET/$FOLDER.5 ;
fi;

# step 2: shift (rename) the middle backup(s) back by one, if they exist
if [ -d $LOCAL_TARGET/$FOLDER.4 ] ; then
mv $LOCAL_TARGET/$FOLDER.2 $LOCAL_TARGET/$FOLDER.5 ;
fi;

# step 2: shift (rename) the middle backup(s) back by one, if they exist
if [ -d $LOCAL_TARGET/$FOLDER.3 ] ; then
mv $LOCAL_TARGET/$FOLDER.2 $LOCAL_TARGET/$FOLDER.4 ;
fi;

# step 2: shift (rename) the middle backup(s) back by one, if they exist
if [ -d $LOCAL_TARGET/$FOLDER.2 ] ; then
mv $LOCAL_TARGET/$FOLDER.2 $LOCAL_TARGET/$FOLDER.3 ;
fi;

if [ -d $LOCAL_TARGET/$FOLDER.1 ] ; then
mv $LOCAL_TARGET/$FOLDER.1 $LOCAL_TARGET/$FOLDER.2 ;
fi;

# step 3: make a hard-link-only copy of the latest backup, if it exists
# cpio options are single (p)ass, create dir and (l)ink files
if [ -d $LOCAL_TARGET/$FOLDER.0 ] ; then
cp -adl $LOCAL_TARGET/$FOLDER.0 $LOCAL_TARGET/$FOLDER.1
fi;

# step 4: create backup by updating previous
# rsync options are (a)rchive and (delete) extra
rsync -arvz --delete-after --ignore-errors ~/Desktop/toSave1 ~/Desktop/toSave2  $LOCAL_TARGET/$FOLDER.0/;
# step 5: update backup.0 to reflect the backup date and time
touch $LOCAL_TARGET/$FOLDER.0 ;

Dans cet exemple, on sauvegarde ~/Desktop/toSave1 ~/Desktop/toSave2 (il est possible d’en mettre autant que souhaité) et on conserve les sauvegardes des 5 derniers jours (au plus ou moins en modifiant le premier script)