Si vous utilisez le fort pratique script Perl « rrsync », livré avec la distribution de rsync, et permettant de contraindre un client utilisant une clé SSH spécifique à rester dans un répertoire précis et uniquement celui-là (un chroot virtuel, en quelque sorte), il y a de fortes chances pour que ce script échoue lamentablement une fois la mise à jour vers la version 3.0.0 de rsync effectuée, et ce même si vous utilisez le rrsync se trouvant dans la nouvelle version. Vous aurez alors l’occasion de faire connaissance avec ce sympathique message d’erreur :

rrsync: invalid rsync-command syntax or options

En effet, sous certaines conditions, lorsque le rsync client lance son homologue côté serveur, il lui passe certaines options qui n’existaient pas dans la version précédente de rsync. Voici une ligne de commande (lancée en interne par rsync sur le serveur) type rsync < 3.0.0 :

rsync --server --sender -logDtpr . ./

Et voici une ligne de commande type rsync >= 3.0.0 :

rsync --server --sender -logDtpre.iL . ./

On constate que de nouveaux caractères font leur apparition : e.iL. A quoi correspondent-ils ? Notez que les options de rsync lorsque celui-ci fonctionne avec --server (qui est une option interne « cachée », cf rsync(1)) sont légèrement différentes de celles utilisées en mode « normal ». On trouve une explication de ces nouveaux caractères dans le fichier options.c de rsync, fonction server_options() :

/* We make use of the -e option to let the server know about any
 * pre-release protocol version && some behavior flags. */
argstr[x++] = 'e';
#if SUBPROTOCOL_VERSION != 0
if (protocol_version == PROTOCOL_VERSION) {
	x += snprintf(argstr+x, sizeof argstr - x,
		"%d.%d", PROTOCOL_VERSION, SUBPROTOCOL_VERSION);
} else
#endif
	argstr[x++] = '.';
set_allow_inc_recurse();
if (allow_inc_recurse)
	argstr[x++] = 'i';
#if defined HAVE_LUTIMES && defined HAVE_UTIMES
argstr[x++] = 'L';
#endif

On constate que :

  • L’option « e » sert à informer le rsync côté serveur du protocole utilisé par le rsync côté client au cas où les deux rsync auraient des versions de protocole différentes. En fait, rrsync gère l’option « e », mais s’attend à la trouver sous cette forme : « eX.Y », où X et Y sont des nombres représentant respectivement le protocole et le sous-protocole utilisé. Or, ici, on voit que cette option peut également s’écrire simplement « e. » lorsque les protocoles sont de même version, ce que rrsync ne reconnaît pas, d’où erreur.
  • L’option « i » n’est pas reconnue par rrsync, d’où erreur.
  • L’option « L » est reconnue par rrsync.

Pour corriger le problème, il faut donc modifier rrsync pour ajouter la nouvelle option « i » et la nouvelle syntaxe « e. ».

J’ai concocté un patch qui effectue ces modifications : rrsync-bug-3.0.0.patch.