Machins de dev

Synchronisation asymétrique entre deux dossiers distants

J’ai écrit un (très) petit script qui me permet de synchroniser à sens unique deux dossiers distants.

Ce script s’exécute une fois par jour par cron. À chaque exécution, il va récupérer du dossier source tout ce qui aura été créé ou modifier depuis la dernière bonne exécution du script. Cette synchronisation asymétrique me permet de vider régulièrement le dossier local, qui est dans l’usage un tampon, sans que les éléments déplacés ne soient à nouveaux resynchronisés à partir du dossier distant.

#!/bin/sh
# remote mono-directional sync v2.2

# note: the first time this script runs, nothing append
# because the script initializes the last exec to now.

# configuration parameters
# remote folder to sync to (the source)
REMOTE_FOLDER='/remote/folder'
# remote host and username to id against
REMOTE_URI='remote-user@remote.kveer.fr'
# local folder (the destination)
LOCAL_URI='/mnt/pending'
# file containing the last sync date
LAST_EXECUTION='/var/lib/kveer/last-remote-user-sync'
# the ssh private key to ident to the remote host
REMOTE_KEY='rtorrent-sync-identity'

# private variables -- DO NOT MODIFY
TMP_FILES_TO_SYNC=$(mktemp -p /tmp rsync.XXXXXX)
LAST_EXECUTION_FOLDER=$(dirname $LAST_EXECUTION)
RSYNC_CMD="rsync -4 -htrvRc -z --partial --progress"

# beginning of the script
if [ ! -d `dirname $LAST_EXECUTION` ]; then
        mkdir `dirname $LAST_EXECUTION`
        date '+%Y-%m-%d %H:%M:%S' > $LAST_EXECUTION
fi

# initializing ssh-agent to connect to the remote
eval $(ssh-agent)
ssh-add remote-user-sync-identity

# cleanup
trap '[ -e /proc/$SSH_AGENT_PID ] && kill $SSH_AGENT_PID; [ -f "$TMP_FILES_TO_SYNC" ] && rm "$TMP_FILES_TO_SYNC"' 0 2 3 15

LAST_EXEC=$(cat $LAST_EXECUTION)
ssh "$REMOTE_URI" "cd ${REMOTE_FOLDER};find . -daystart -maxdepth 1 -mindepth 1 -newermt '$LAST_EXEC' -print" > $TMP_FILES_TO_SYNC
NEW_LAST_EXEC=$(date '+%Y-%m-%d %H:%M:%S')
$RSYNC_CMD --files-from=$TMP_FILES_TO_SYNC "${REMOTE_URI}:${REMOTE_FOLDER}" "$LOCAL_URI"
ret=$?

# store last execution
[ "$ret" -eq '0' ] && echo $NEW_LAST_EXEC > $LAST_EXECUTION