Présentation du protocole UUCP

Pierre Ficheux (pficheux@com1.fr)

Novembre 1999


0. Résumé

Cette article présente l'utilisation et la configuration du protocole UUCP (Unix to Unix CoPy) sur LINUX. UUCP permet de manière très efficace de transférer des fichiers, du courrier électronique ou bien des news.

1. Introduction et historique

Le protocole UUCP fut introduit dans les premières versions d'UNIX développées par AT&T à la fin des années 1970. La première version d'UUCP fut développée par Mike Lesk en 1976 et fut intégrée à la version V.7 de l'UNIX AT&T diffusée en 1977 (sous le nom d'UUCP version 2). Une nouvelle version fut distribuée avec UNIX System V R3 en 1983. Le nom officiel de cette nouvelle version fut BNU pour Basic Network Utilities. Elle fut cependant célèbre dans la communauté UNIX sous le nom de HoneyDanBer dérivé des noms des 3 auteurs: Peter Honeyman, David A. Nowitz et Brian E. Redman.

Malgré son grand age, UUCP surpasse largement dans certains cas bon nombre de systèmes de transfert de données plus récents. Lorsque l'on ne dispose pas d'une connexion IP permanente, UUCP peut être un système à la fois performant et très économique en particulier pour gèrer le service de courrier électronique même dans le cas d'un site relativement important (comme une petite entreprise comprenant plusieurs dizaines d'utilisateurs).

UUCP fut conçu à une époque ou les réseaux n'existaient pas (ou peu). Il est basé sur un principe de connexion temporaire (dial) qui s'effectue la plupart du temps à l'aide d'un MODEM (appelé aussi dialer). Le temps d'utilisation de la ligne et donc le coût de communication est très optimisé car les transferts UUCP sont rassemblés dans un zone de spool (file d'attente) qui permet de stocker plusieurs transferts (transfert de fichier, de courrier, etc...) avant d'effectuer l'appel effectif. Le protocole UUCP est également reversible ce qui permet de transférer des données dans les 2 sens lors d'un même appel.

Le système peut cependant fonctionner sur d'autres supports comme une connexion série directe ou un réseau.

UUCP est largement configurable à travers des fichiers décrits plus loin, il est également automatisable au maximum ce qui permet de limiter l 'administration du système une fois que celui-ci est correctement configuré. La configuration d'UUCP est cependant un peu délicate pour un profane...

UUCP est disponible en standard sous LINUX avec la version Taylor UUCP (du nom de l'auteur) appelée aussi GNU UUCP. Cette distribution a la particularité de pouvoir émuler les versions AT&T antérieures mais elle apporte aussi un format de fichier de configuration propre (TAYLOR_CONFIG). Le type de configuration est sélectionné par les options de compilation de Taylor UUCP, dans le fichier policy.h de la distribution.

Les différentes version UNIX d'UUCP diffèrent par la structure des fichiers de configuration bien que le protocole utilisé reste compatible. Dans la suite de l'article, nous parlerons de configuration BNU (compatible avec la distribution d'AT&T).

2. Configuration basique d'UUCP

2.1 Introduction

La configuration de UUCP est relativement complexe du fait du grands nombre de fichiers utilisés pour le paramètrage. Ces fichiers sont rassemblés sur un répertoire qui pourra être /etc/uucp ou bien /var/lib/uucp. Les fichiers décrits sont ceux de la version BNU.

2.2 Un exemple de configuration

Supposons que ma machine personnelle appelée mmxpf veuille dialoguer par UUCP avec un machine distante appelée bureau. On doit tout d'abord déclarer la machine bureau dans le fichier Systems de la machine locale par une ligne:

 bureau Any ACU 57600 numéro_bureau "" \d\r login--gin uupf ord: uupf0

Dans le fichier Devices, on ajoutera la ligne:

 ACU modem - 57600 deskline56
qui indique que le pseudo-device ACU (Automatic Call Unit) est associé au device physique /dev/modem qui est en général un lien symbolique sur un device réel. La chaîne deskline56 spécifie la macro d'appel correspondant au modem utilisé (ici un Deskline 56K COM One) et devra être définie dans le fichier Dialers.

Dans le fichier Dialers, on ajoutera la ligne:

 deskline56 =,-, "" \dAT&FE0M1V1X1&K3%TCB\r\c OK\r ATDT\T\r\c CONNECT
qui représente la séquence Hayes utilisée pour initialiser le modem puis composer le numéro de téléphone.

On peut d'ores et déja tester la connexion en utilisant la commande UUCP cu (Call Unix) livrée dans la package UUCP:

cu bureau
...
 
Connected.
~[mmxpf].

Disconnected.
On quitte cu en tapant ~ puis . (il fallait l'inventer :-))

Le fichier Permissions permet de définir les droits d'accès des machines distantes utilisant le protocole UUCP. Il permet également de modifier le nom UUCP avec lequel apparaitra la machine local appelante lors de l'appel au site distant. Voici un exemple fichier Permissions:

MACHINE=bureau LOGNAME=uupf MYNAME=pcpf \
READ=/var/spool/uucppublic:/tmp \
WRITE=/var/spool/uucppublic:/tmp \
SENDFILES=yes REQUEST=yes \
COMMANDS=/bin/rmail:/bin/rnews
Cette configuration indique que lors du dialogue avec la machine bureau en utilisant le login uupf, on sera identifié comme pcpf (alors que le nom local est mmxpf). Les répertoire accessibles par la machine distante sont /var/spool/uucppublic (le défaut) et /tmp, et ceci en lecture et écriture. La machine distante a le droit de télécharger des fichiers sur ces répertoires ainsi que d'exécuter les commandes rmail et rnews.

3. Transfert de fichiers

Le transfert se fait utiliser la commande uucp. Par exemple, le transfert du fichier binaire all.tar.gz depuis le site éloigné bureau vers /var/spool/uucppublic se fera par :
 uucp -r bureau!~/fichier1.tar.gz /var/spool/uucppublic

La chaîne ~/ symbolise le répertoire distant /var/spool/uucppublic normalement réservé aux transferts UUCP. L'option -r indique de placer l'ordre de transfert dans la zone de spool et non d'effectuer un appel immédiat. On peut de même commander un transfert dans l'autre sens par:

 uucp -r fichier2.tar.gz bureau!/tmp
NB: dans la cas de l'utilisation du shell bash sous LINUX, il est nécessaire de placer un backslash devant le ! qui est un caractère spécial.

On peut lire l'état de la file d'attente UUCP avec la commande uustat -s:

root@mmxpf # uustat -s bureau
bureauN007e bureau root 11-24 23:06 Sending /home/pierre/tar_gz/fichier2.tar.gz (35999 bytes) to /tmp
bureauN0081 bureau root 11-24 23:11 Requesting ~/fichier1.tar.gz to /var/spool/uucppublic

On peut annuler le transfert (supprimer la requête de la file) par la commande uustat -k à laquelle on donne l'identificateur de la requête:

uustat -k bureauN0081

4. Courrier électronique

Une utilisation très efficace du protocole UUCP est la gestion de courrier électronique, par exemple:
  1. pour dupliquer/rediriger temporairement le courrier d'un poste de travail classique (utilisant SMTP pour l'envoi de courrier et POP3 pour la lecture) vers un poste personnel ne disposant que d'un modem et d'un budget limité

  2. pour gèrer totalement le courrier électronique d'une petite structure professionnelle (PME, association, site isolé)

Les figures ci-dessous donnent la structure globale des 2 configurations:

fig 1. Configuration pour accès personnel
fig 2. Configuration pour accès professionnel

Dans les deux cas, une configuration UUCP correctement installée sur un simple PC LINUX permettra une utilisation très confortable du courrier électronique et ce de manière transparente pour l'utilisateur. De plus, les temps d'interrogation du serveur de messagerie distant seront beaucoup plus faibles, comparés à des solutions SMTP/POP3.

Dans le cas numéro 1 (PC personnel), on devra tout d'abord indiquer au programme sendmail local que le routage par défaut des courriers se fait par une passerelle UUCP. Cette configuration se fait facilement par exemple en utilisant le programme linuxconf. Une fois cette configuration effectué, on peut tester ce routage en utilisant le mode test de sendmail (option -bt):

root@mmxpf # /usr/lib/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 0,3 somebody@some.where
rewrite: ruleset   0   input: somebody @ some . where
rewrite: ruleset  98   input: somebody @ some . where
...
rewrite: ruleset   3 returns: $# uucp-dom $@ bureau $: somebody < @ some . where >
> ^D
ce qui indique bien qu'un courrier extérieur sera correctement routé par la passerelle UUCP bureau. Si on utilise un outil de courrier pour envoyer un message à truc@com1.fr, la requête sera stockée dans la file UUCP, lisible par la commande uustat:
root@mmxpf # uustat -s bureau
bureauC0083 bureau pierre 11-25 00:20 Executing rmail truc@com1.fr (sending 764 bytes)
Du coté de la machine distante bureau, il suffira de créer un fichier de redirection .forward sur le home-directory de l'utilisateur concerné, par exemple:
pierre,pcpf!pierre
Ce fichier indique que le courrier sera toujours délivré sur la machine bureau mais qu'une copie sera systématiquement envoyée via UUCP à la machine pcpf correspondant à la machine personnelle de l'utilisateur. Pour améliorer encore les choses, on peut ajouter au crontab de l'utilisateur sur la machine bureau une ligne validant automatiquement la copie UUCP le vendredi soir à partir de 19h00 (début du week-end):
0 19 * * 5 cp $HOME/forward.weekend $HOME/.forward
et supprimant la redirection dans la nuit du dimanche au lundi:
0 2 * * 1 rm -f $HOME/.forward

Coté machine distante bureau, on doit s'assurer que la machine pcpf est déclarée dans le fichier Systems par une ligne:

pcpf Never
qui indique que l'on n'appelle jamais ce système mais que c'est toujours lui qui appelle.

Dans le cas d'un serveur de messagerie professionnel, la config sera similaire à quelques points près:

Coté fournisseur d'accès, tous les courriers à destination du domaine associé à l'entreprise devront être routés par UUCP sur le serveur de messagerie. Pour cela il sera nécessaire de configurer sendmail en ajoutant une règle comme:
R$*<@truc.fr>           $#uucp-dom$@truc$:$1
dans le sendmail.cf Il faut noter qu'un seul compte est nécessaire sur le serveur du fournisseur d'accès Internet (le compte accès UUCP) pour gèrer tout le courrier de l'entreprise.

Coté serveur, on devra bien sûr installer un accès modem entrant par exemple en utilisant mgetty. Pour cela on pourra se reporter à l'article Installer un serveur PPP de Linux Magazine numéro 2. L'entrée dans le fichier /etc/passwd pourra être:

uutruc:IJSrjU4zXl2Ys:14:14:login UUCP truc:/var/spool/uucp:/var/lib/uucp/uucico

5. Appel du site distant

L'appel au site distant est effectué par la commande uucico. Cette commande effectue les actions suivantes: La ligne suivante donne exemple d'utilisation de la commande uucico:
 /var/lib/uucp/uucico -r1 -x1 -S bureau
L'option -r1 indique que uucico est l'initiateur du protocole, l'option -x1 indique le niveau de trace. Dans le cas d'une config BNU sur Taylor UUCP, les traces seront sauvées sur le fichier /var/log/uucp/.Admin/audit.local. On pourra donc tracer l'appel en effectuant la commande:
 tail -f /var/log/uucp/.Admin/audit.local
Un première solution simple est d'effectuer des appels réguliers au serveur distant en programmant des exécutions d'uucico dans une crontab. Le petit script ci-dessous permet d'appeler le serveur tout en suivant l'évolution du protocole:
#!/bin/sh
DEBUG=1
DEFAULTSITE=bureau
LOGFILE=/var/log/uucp/.Admin/audit.local

if [ "$1" = "" ]; then
	SITE=$DEFAULTSITE
else
	SITE=$1
fi

/var/lib/uucp/uucico -r1 -x$DEBUG -S $SITE &
tail -f $LOGFILE
ce qui permet d'obtenir une sortie du genre:
uucp bureau (11/14-11:53:33,145,0) Calling system bureau (port modem)
uucp bureau (11/14-11:54:04,145,0) Login successful
uucp bureau (11/14-11:54:04,145,0) Handshake successful (protocol 'i' sending packet/window 1024/16 receiving 1024/16)
bin bureau (11/14-11:54:04,145,0) Receiving rmail pierre (2213 bytes)
bin bureau (11/14-11:54:05,145,0) Receiving rmail pierre (1993 bytes)
bin bureau (11/14-11:54:05,145,0) Receiving rmail pierre (1670 bytes)
bin bureau (11/14-11:54:06,145,0) Receiving rmail pierre (1670 bytes)
bin bureau (11/14-11:54:06,145,0) Receiving rmail pierre (3200 bytes)
bin bureau (11/14-11:54:06,145,0) Receiving rmail pierre (170668 bytes)
bin bureau (11/14-11:54:50,145,0) Receiving rmail pierre (2389 bytes)
bin bureau (11/14-11:54:50,145,0) Receiving rmail pierre (1789 bytes)
uucp bureau (11/14-11:54:51,145,0) Protocol 'i' packets: sent 19, resent 0, received 205
uucp bureau (11/14-11:54:51,145,0) Call complete (48 seconds 185592 bytes 3866 bps)

Cette méthode est utilisable mais peut être améliorée en adoptant les principes suivants: On utilisera pour cela 3 fichiers: Pour faire fonctionner l'ensemble, on pourra ajouter à la crontab de root les lignes:
1 * * * * /var/lib/uucp/uudemon.poll > /dev/null
35 * * * * /var/lib/uucp/uudemon.hour > /dev/null

6. Conclusion

UUCP est un système à la fois très puissant et économique. Il est malheureusement assez peu utilisé par la majorité des fournisseurs d'accès classiques alors qu'il pourrait avantageusement remplacer certaines configs SMTP/POP3 "tordues".

7. Bibliographie