Mise en place d'un serveur de sauvegarde à moindre coût

Yann MORÈRE

Résumé

Ce document propose la mise en place d'un serveur de sauvegarde simple, à l'aide d'outils libres et de quelques disques durs. Ce n'est pas effectivement une sauvegarde au sens pur du terme, mais cela permet une synchronisation automatique des fichiers à partir de postes Windows et Linux sur une machine distante avec une connexion sécurisée, sans l'intervention de l'utilisateur d'une part, et d'autre part un mirroring sur deux autres disques sur cette même machine distante.

1  Installation et utilisation de cwrsync sous windows

L'utilitaire rsync va permettre de réaliser les sauvegardes sur le serveur. Cette sauvegarde sera intelligente car la commande ne fait que synchroniser les fichiers entre la machine et le serveur de sauvegarde. Seule la première sauvegarde transfèrera l'intégralité des données. Par la suite, seuls les fichiers modifiés entre deux sauvegardes seront transférés.
Cet utilitaire est disponible en standard sur les systèmes Unix, mais n'existe pas sur les systèmes Windows. Il faut pour cela, soit utiliser les outils Cygwin en installant l'environnement, soit en récupérant seulement l'utilitaire rsync.
Ce dernier est disponible sur le site http://www.itefix.no/phpws/index.php, il s'agit de cwrsync qui se presente sous la forme d'un installable.
Vous pouvez aussi télécharger le paquet suivant qui contient tout ce qui est nécessaire pour une installation sous windows (script d'installation, scp, exemple de fichier de configuration de sauvegarde) lcwrsync.zip
En tant qu'administrateur, installer le logiciel, en gardant les options par défaut.
Dans une fenêtre de commande (démarrer->executer-> taper cmd puis ok) on va générer les fichiers necessaires à la connexion.

1.1  Génération de la clé DSA pour authentification

c:\cwrsync\ssh-keygen -t dsa -f c:\cwrsync\id_dsa

Un jeu de clé publique et privée est généré et est copié dans le répertoire cwrsync.
Si aucun fichier n'est spécifié, les clés sont copiées dans le répertoire /cygdrive/c/Documents and Settings/user/.ssh/id_dsa et /cygdrive/c/Documents and Settings/user/.ssh/id_dsa.pub par défaut.
Afin de mieux sécuriser le système il est possible de donnée une passphrase lors de la création des clés. Attention il ne faut pas spécifier le nom de fichier pour la création des clés. Laisser les clés dans le répertoire .ssh qui se trouve dans Documents and Settings de l'utilisateur. Sinon ssh ne retrouve pas

1.2  Création de l'utilisateur de sauvegarde sur le serveur (sous linux)

sur le serveur Unix : adduser -m yannsauv -s /bin/bash passwd yannsauv
adduser morere #ajoute l'utilisateur morere
smbpasswd -a morere # ajoute l'utilisateur samba morere
su morere
ssh-keygen -t dsa

La dernière commande génère les clés du coté serveur et crée le répertoire .ssh.

1.3  Connexion automatique sur le serveur avec ssh

On va copier la clé publique du client sur le serveur dans le répertoire de user/.ssh afin de réaliser une connexion automatique.
La commande scp, n'existe pas non plus disponible en standard sous windows. Putty fournit la commande necessaire par pscp disponible sur http://www.chiark.greenend.org.uk/~sgtatham/putty/.
Attention, la version 0.52 pose des problèmes avec XP, j'ai utilisé la version 0.55.
pscp "C:\Documents and Settings\user\.ssh\id_dsa.pub" 
morere@1974.57.140.212:.ssh/authorized_keys

Un test de connexion est réalisé par la commande
ssh morere@194.57.140.212

ou dans le cas ou on spécifie le nom de fichier de clé :
pscp "C:\cwrsync\id_dsa.pub" morere@1974.57.140.212:.ssh/authorized_keys

Un test de connexion est réalisé par la commande
ssh -i c:\cwrsync\id_dsa morere@194.57.140.212

et la connexion devrait être automatique. L'option -i permet de spécifier ou ssh doit aller chercher la clé privée pour valider la connexion.
Dans le cas ou plusieurs machines se connectent sur le même compte pour faire des sauvegardes, il faut concaténer à la main les clés publiques dans le fichier $HOME/.ssh/authorized_keys sur le serveur.

1.4  Sauvegarde par rsync

Maintenant il faut envoyer par rsync les fichiers sur le serveur.
Il existe un problème avec les noms de fichiers longs et les C:\Documents and Settings\user par exemples, que rsync refuse.
Une première astuce est de se placer dans le répertoire qui convient, et d'appeller la commande rsync avec son chemin. Voici un exemple de fichier sauv.bat que l'on place dans le répertoire .ssh de l'utilisateur.
@ECHO OFF
cd C:\Documents and Settings\user
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -i c:\cwrsync\id_dsa -l morere" 
"Bureau" 194.57.140.212:backup
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -i c:\cwrsync\id_dsa -l morere" 
"Favoris" 194.57.140.212:backup
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -i c:\cwrsync\id_dsa -l morere" "Mes 
documents" 194.57.140.212:backup

Une autre astuce, beaucoup plus propre est de passer par l'utilisation de /cygdrive/c/ qui remplace c:\ et permet d'utiliser des chemins absolus.
@ECHO OFF
echo utilisation de /cygdrive/c/Documents and Settings/user/
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -i c:\cwrsync\id_dsa -l morere" 
"/cygdrive/c/Documents and Settings/user/Bureau" 194.57.140.212:backup
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -l morere" 
"/cygdrive/c/Documents and Settings/user/Favoris" 194.57.140.212:backup
c:\cwrsync\rsync -av --rsh="c:\cwrsync\ssh -l morere" 
"/cygdrive/c/Documents and Settings/user/Mes documents" 194.57.140.212:backup

Ces actions permettent de sauver les répertoires Bureau, Favoris et Mes Documents sur le serveur de sauvegarde dans le répertoire backup.
Rsync possède de nombreuses options listées ci-dessous
 -v, --verbose               increase verbosity
 -q, --quiet                 decrease verbosity
 -c, --checksum              always checksum
 -a, --archive               archive mode, equivalent to -rlptgoD
 -r, --recursive             recurse into directories
 -R, --relative              use relative path names
     --no-relative           turn off --relative
     --no-implied-dirs       don't send implied dirs with -R
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir            make backups into this directory
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)
 -u, --update                update only (don't overwrite newer files)
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            copy the referent of all symlinks
     --copy-unsafe-links     copy the referent of "unsafe" symlinks
     --safe-links            ignore "unsafe" symlinks
 -H, --hard-links            preserve hard links
 -p, --perms                 preserve permissions
 -o, --owner                 preserve owner (root only)
 -g, --group                 preserve group
 -D, --devices               preserve devices (root only)
 -t, --times                 preserve times
 -S, --sparse                handle sparse files efficiently
 -n, --dry-run               show what would have been transferred
 -W, --whole-file            copy whole files, no incremental checks
     --no-whole-file         turn off --whole-file
 -x, --one-file-system       don't cross filesystem boundaries
 -B, --block-size=SIZE       checksum blocking size (default 700)
 -e, --rsh=COMMAND           specify the remote shell
     --rsync-path=PATH       specify path to rsync on the remote machine
     --existing              only update files that already exist
     --ignore-existing       ignore files that already exist on receiver
     --delete                delete files that don't exist on sender
     --delete-excluded       also delete excluded files on receiver
     --delete-after          receiver deletes after transfer, not before
     --ignore-errors         delete even if there are I/O errors
     --max-delete=NUM        don't delete more than NUM files
     --partial               keep partially transferred files
     --force                 force deletion of dirs even if not empty
     --numeric-ids           don't map uid/gid values by user/group name
     --timeout=TIME          set I/O timeout in seconds
 -I, --ignore-times          turn off mod time & file size quick check
     --size-only             ignore mod time for quick check (use size)
     --modify-window=NUM     compare mod times with reduced accuracy
 -T  --temp-dir=DIR          create temporary files in directory DIR
     --compare-dest=DIR      also compare received files relative to DIR
     --link-dest=DIR         create hardlinks to DIR for unchanged files
 -P                          equivalent to --partial --progress
 -z, --compress              compress file data
 -C, --cvs-exclude           auto ignore files in the same way CVS does
     --exclude=PATTERN       exclude files matching PATTERN
     --exclude-from=FILE     exclude patterns listed in FILE
     --include=PATTERN       don't exclude files matching PATTERN
     --include-from=FILE     don't exclude patterns listed in FILE
     --files-from=FILE       read FILE for list of source-file names
 -0  --from0                 all file lists are delimited by nulls
     --version               print version number
     --daemon                run as an rsync daemon
     --no-detach             do not detach from the parent
     --address=ADDRESS       bind to the specified address
     --config=FILE           specify alternate rsyncd.conf file
     --port=PORT             specify alternate rsyncd port number
     --blocking-io           use blocking I/O for the remote shell
     --no-blocking-io        turn off --blocking-io
     --stats                 give some file transfer stats
     --progress              show progress during transfer
     --log-format=FORMAT     log file transfers using specified format
     --password-file=FILE    get password from FILE
     --bwlimit=KBPS          limit I/O bandwidth, KBytes per second
     --write-batch=PREFIX    write batch fileset starting with PREFIX
     --read-batch=PREFIX     read batch fileset starting with PREFIX
 -h, --help                  show this help screen

Ce qu'il faut retenir c'est que -a remplace -rlptgoD qui est à peut près tout ce dont on a besoin. On peut ajouter -v pour avoir le mode verbeux.
-a, --archive
    Ceci est équivalent à -rlptgoD. C'est un moyen rapide de dire que vous
 voulez les sous répertoire en préservant tout. 

Pour aller plus loin, il faudrait stocker dans un fichier les répertoires à sauver et les répertoires à exclure. Ceci peut être fait avec les options
--exclude=PATTERN
    This option allows you to selectively exclude certain files from the list of
 files to be transferred. This is most useful in combination with a recursive 
transfer. 
    You may use as many --exclude options on the command line as you like to 
build up the list of files to exclude. 
    See the EXCLUDE PATTERNS section for detailed information on this option. 
--exclude-from=FILE
    This option is similar to the --exclude option, but instead it adds all 
exclude patterns listed in the file FILE to the exclude list. Blank lines in 
FILE and lines starting with ';' or '#' are ignored. If FILE is - the list will 
be read from standard input. 
--include=PATTERN
    This option tells rsync to not exclude the specified pattern of filenames. 
This is useful as it allows you to build up quite complex exclude/include rules. 
    See the EXCLUDE PATTERNS section for detailed information on this option. 
--include-from=FILE
    This specifies a list of include patterns from a file. If FILE is - the list
 will be read from standard input. 
--files-from=FILE
    Using this option allows you to specify the exact list of files to transfer 
(as read from the specified FILE or "-" for stdin). It also tweaks the default 
behavior of rsync to make transferring just the specified files and directories 
easier. For instance, the --relative option is enabled by default when this 
option is used (use --no-relative if you want to turn that off), all directories 
specified in the list are created on the destination (rather than being noisily 
skipped without -r), and the -a (--archive) option's behavior does not imply -r 
(--recursive) -- specify it explicitly, if you want it. 
    The file names that are read from the FILE are all relative to the source 
dir -- any leading slashes are removed and no ".." references are allowed to go 
higher than the source dir. For example, take this command: 

    rsync -a --files-from=/tmp/foo /usr remote:/backup

    If /tmp/foo contains the string "bin" (or even "/bin"), the /usr/bin 
directory will be created as /backup/bin on the remote host (but the contents of
 the /usr/bin dir would not be sent unless you specified -r or the names were 
explicitly listed in /tmp/foo). Also keep in mind that the effect of the 
(enabled by default) --relative option is to duplicate only the path info that 
is read from the file -- it does not force the duplication of the source-spec 
path (/usr in this case). 
    In addition, the --files-from file can be read from the remote host instead 
of the local host if you specify a "host:" in front of the file (the host must 
match one end of the transfer). As a short-cut, you can specify just a prefix of 
":" to mean "use the remote end of the transfer". For example: 

    rsync -a --files-from=:/path/file-list src:/ /tmp/copy

    This would copy all the files specified in the /path/file-list file that was
 located on the remote "src" host. 

Il est possible de faire plus générique, en plaçant dans des fichiers la liste des choses que l'on veut sauver et ce que l'on veut éviter.
Dans notre cas, on va sauver les répertoires /cygdrive/c/Documents and Settings/user/, c'est à dire les données de l'utilisateur user en evitant de sauver les fichiers inutiles comme Application Data.
fichier sauv.bat
@ECHO OFF
c:\cwrsync\rsync -av --include-from="c:\cwrsync\include.txt" --exclude-from="c:\
cwrsync\exclude.txt" --rsh="c:\cwrsync\ssh -l yannsauv" "/cygdrive/c/Documents a
nd Settings/Administrateur/" 194.57.140.212:backup_admin

yann@tuxpowered:~/temp/cwrsync$ more include.txt 
Favoris
Mes documents
Bureau
yann@tuxpowered:~/temp/cwrsync$ more exclude.txt 
.ssh
Application Data
Local Settings
Modèles
ntuser.ini
Voisinage réseau
Recent
SendTo
Voisinage d'impression
ntuser.dat.LOG
NTUSER.DAT
yann@tuxpowered:~/temp/cwrsync$

voici un autre exemple plus récent : fichier sauv.bat
@ECHO OFF
rem Sauvegarde du rep Documents and settings
c:\cwrsync\rsync -av --include-from="c:\cwrsync\includec.txt" --exclude-from="c:\cwrsync\excludec.txt" --rsh="ssh -i c:\cwrsync\id_dsa -l morere" "/cygdrive/c/Documents and Settings/yann/" 194.57.140.212:windows/Documents_and_Settings
rem Sauvegarde du rep utilisateur
c:\cwrsync\rsync -av --include-from="c:\cwrsync\included.txt" --exclude-from="c:\cwrsync\excluded.txt" --rsh="ssh -i c:\cwrsync\id_dsa -l morere" "/cygdrive/d/utilisateurs/yann/" 194.57.140.212:windows/utilisateurs

fichier excludec.txt
.ssh
Local Settings
Modèles
ntuser.ini
NTUSER.DAT
NTUSER.DAT.LOG
Voisinage réseau
Voisinage d'impression
SendTo
Menu Démarrer
Recent

fichier excluded.txt
HTML
devis_commandes
doc_materiel
fond d'ecran
icones
image_skel
sites_web
temp

Afin da faire une installation quasi automatique sur les postes clients, il est possible d'utiliser le petit script suivant (fichier install_user.bat) :
@ECHO OFF
echo Installation pour utilisateur %1
echo Génération des clés
c:\cwrsync\ssh-keygen -t dsa -f c:\cwrsync\id_dsa
echo Copie des clés sur le serveur
C:\cwrsync\scp  "c:\cwrsync\id_dsa.pub" %1@194.57.140.212:.ssh/authorized_keys 
echo Test de connexion automatique
c:\cwrsync\ssh  -i c:\cwrsync\id_dsa %1@194.57.140.212

L'utilisation est assez simple, il suffit d'appeler le script avec le login de l'utilisateur à créer :
install_user morere

Il suffit alors de répondre aux questions posées par les différents programmes.
De même, si vous avez deux disques durs locaux, il est possible de réaliser une sauvegarde synchronisée, toujours en utilisant cwrsync.
Le fichier sauv_local.bat permet de faire cela :
@ECHO OFF
echo Sauvegarde du rep Documents and settings
c:\cwrsync\rsync -av --include-from="c:\cwrsync\includec.txt" 
--exclude-from="c:\cwrsync\excludec.txt" "/cygdrive/c/Documents and 
Settings/yann/" "/cygdrive/h/utilisateurs/yann_windows/documents_and_settings"
echo Sauvegarde du rep utilisateur
c:\cwrsync\rsync -av --include-from="c:\cwrsync\included.txt" 
--exclude-from="c:\cwrsync\excluded.txt" "/cygdrive/d/utilisateurs/yann/" 
"/cygdrive/h/utilisateurs/yann_windows/"

Ensuite il est possible de réaliser cela de manière automatique, grâce au Tâches Planifiées sous windows. Menu Démarrer->Paramètres->Panneau de configuration...
images/rsync2_html_m3a597d11.png
Ensuite double click sur Tâche planifiée, puis parcourir
images/rsync2_html_m4b6ff3b4.png
Choisir le nom de la tâche et la fréquence d'exécution puis suivant
images/rsync2_html_21010088.png
choisir l'heure de démarrage
images/rsync2_html_m26358e2b.png
Choisir le programme qui doit être lancer par le planificateur. Dans notre cas il s'agira d'un fichier bat qui contiendra les commandes de sauvegarde.
images/rsync2_html_41c70a48.png
images/rsync2_html_73005130.png
Choisir l'utilisateur sous lequel va s'exécuter la sauvegarde
images/rsync2_html_4c55086b.png
Visualiser les propriétés avancées
images/rsync2_html_1abcc057.png
images/rsync2_html_m43f80e1.png
images/rsync2_html_3c831531.png
images/rsync2_html_1fc8ee16.png
La tâche est maintenant planifiée.

1.5  Important : Limitation

Afin que cette tâche puisse être lancée par le planificateur, il est nécessaire que l'utilisateur soit loggé sur la machine (sinon les connexions réseau ne sont pas activées et le rsync via ssh ne peut pas fonctionner).
Ainsi, si l'utilisateur doit quitter son bureau et que la sauvegarde est programmée à 00h00 tous les jours, il doit verrouiller sa station (touche Windows-L ou démarrer->verrouiller) et non se déconnecter.
Une piste pour résoudre ce problème, est de créer un service Windows qui fera le travail.

2  Restauration des données

Afin de simplifier le problème de la restauration des données, c'est un serveur samba qui a été choisi. Ce choix donne aussi de la souplesse aux utilisateurs, qui pourront choisir les fichiers à restaurer sur leur machine.
Bien sur il est tout à fait possible de restaurer les données de l'utilisateurs d'un seul coup en utilisant le script restaure.bat suivant :
@ECHO OFF
rem Sauvegarde du rep Documents and settings
c:\cwrsync\rsync -av --rsh="ssh -i c:\cwrsync\id_dsa -l morere" 194.57.140.212:windows/Documents_and_Settings "/cygdrive/c/Documents and Settings/yann/"
rem Sauvegarde du rep utilisateur
c:\cwrsync\rsync -av --rsh="ssh -i c:\cwrsync\id_dsa -l morere"  194.57.140.212:windows/utilisateurs "/cygdrive/d/utilisateurs/yann/"

Il suffit d'intervertir l'ordre de la source et de la destination par rapport à la sauvegarde.

2.1  Configuration de Samba

Pour cela je vous renvoie à la page très bien faite de Yves Agostini http://www.crium.univ-metz.fr/docs/system/samba/.
mon fichier de configuration est le suivant /etc/samba/smb.conf
[global]
   workgroup = LASC
   netbios name = SERVEUR_KSTORE
   server string = Serveur Samba du LASC
   #optionnel  netbios aliases = SERVEUR_KSTORE
   
   os level = 99
   local master = yes
   
   printcap name = /etc/printcap
   load printers = yes
   
   socket options = TCP_NODELAY
   
   #security =  share
   #encrypt passwords = no   
   security = user
   encrypt passwords = yes
   smb passwd file = /etc/samba/smbpasswd
   guest account = nobody
   hosts allow = 194.57.140. 127.

[public]
   comment = Public Stuff
   path = /home/samba
   public = yes
   writable = no
   printable = no
   browseable = yes

[homes]
   comment = Home Directories
   browseable = no
   writable = yes

[printers]
   comment = All Printers
   path = /var/spool/samba
   browseable = no
# Set public = yes to allow user 'guest account' to print
   public = yes
   writable = no
   printable = yes


l'ajout d'un utilisateur samba sur le serveur se fait par la commande
smbpasswd -a login

le système demande alors un mot de passe et un confirmation de mot de passe.
Il est possible d'utiliser pour samba les mêmes mots de passe que pour accéder à la machines windows. Dans ce cas, l'accès au serveur Samba sera quasiment transparent pour l'utilisateur (pas de login et pas de mot de passe).
Si les mots de passe sont différents, ce qui est préférable pour la sécurité, l'utilisateur, lors de la connexion sera invité à saisir un login et un mot de passe.

2.2  Connexion Du coté client

Par l'intermédaire du voisinage réseau, l'utilisateur se connecte sur le serveur Samba de son groupe de travail, par l'intermédiaire de son login et mot de passe.
images/favoris_reseau.jpg
images/favoris_reseau2.jpg
images/favoris_reseau3.jpg
Un fois connecté sur le serveur, il ne reste plus à l'utilisateur de copier du serveur et coller en local les répertoire ou fichier qu'il veut restaurer.
Il est vraiment difficile de faire moins compliquer.

3  Installation et utilisation de rsync sous Linux/Unix

Sous Unix/Linux, la commande rsync est disponible. Si elle n'est pas installée par défaut, installez le paquetage correspondant. Pour notre debian un simple apt-get install rsync suffit en tant que root.
Ensuite comme sous windows, il faut générer le jeu de clé publique/privée pour l'utilisateur. La syntaxe de commande est la même :
ssh-keygen -t dsa

Cette commande génère les clés de l'utilisateur et les place dans le répertoire $HOME/.ssh.
Il faut ensuite copier la clé publique sur le serveur.
scp ~\.ssh\id_dsa.pub morere@1974.57.140.212:.ssh/authorized_keys

Un test de connexion est réalisé par la commande
ssh morere@194.57.140.212

Il suffit ensuite d'utiliser la commande rsync dans un script shell de la manière suivante (fichier sauvegarde.sh) :
#!/bin/bash
rsync -av --exclude-from=$HOME/sauvegarde/exclude.txt --rsh="ssh -l morere" 
$HOME 194.57.140.212:linux

avec son fichier exclude
temp
GNUstep

Ensuite on insert une ligne dans la crontab par crontab -u user -e
0 2 * * * /home/user/sauvegarde/sauvegarde.sh

et voila le tour est joué, on sauvegarde le répertoire home sur le serveur dans le répertoire linux tous les jour à 2h00.

4  Sauvegarde des données du serveur Mirroring

Afin de limiter au maximum les coûts, la lourde tâche de sauvegarde sera assurée par deux disques durs.
Le but est alors de sauver alternativement le contenu du répertoire /home du troisième disque sur l'un des deux disques de sauvegarde.
Pour cela on utilise 3 disques de 120Go pour le stockage et un disque de 3.2Go pour le système (Une debian Sarge (testing)).
morere@kstore:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda2              2845540   1529672   1171324  57% /
tmpfs                   128332         0    128332   0% /dev/shm
/dev/hde1            118176996   1796260 110377696   2% /home
/dev/hdg1            118176996   1794960 110378996   2% /sauvegarde1
/dev/hdh1            118176996     32828 112141128   1% /sauvegarde2
morere@kstore:~$ 

Un des disques de 120Go contient les répertoires home des utilisateurs et les deux autres servent à faire les sauvegardes synchronisées un jour sur deux (ou moins suivant le choix que l'on fait).
Dans mon cas, tous les jours impairs, les répertoires home sont synchronisés sur le disque /sauvegarde1, et tous les jours pairs sur le disque /sauvegarde2.
Ceci est réalisé par une simple commande insérée dans le cron par crontab -e en tant que root.
0 0 * * 0,2,4,6 rsync -a --exclude-from=/root/exclude /home/ /sauvegarde1/
0 0 * * 1,3,5 rsync -a --exclude-from=/root/exclude /home/ /sauvegarde2/

kstore:~# more exlude 
/home/webCDcreator/
/home/lost+found/
/home/ftp/
kstore:~# 

Pour cela on utilisera une nouvelle fois le programme rsync. Voir la sécurisation du script et les fichiers exclude avec rsync Configuration de samba pour faire la récupération des données Voila, pour l'instant le serveur est opérationnel pour notre laboratoire. La notion de quotas n'a pas été prise en compte. En effet les disques sont pour l'instant surdimensionnés pour nos besoins.
De même la suite du projet concerne l'écriture d'un programme C/GTK+ pour la configuration simplifiée et la création automatique des fichiers sauv.bat , exclude.txt etc.
Les questions et commentaires sont les bienvenus à l'adresse suivante : morere@lasc.univ-metz.fr



File translated from TEX by TTH, version 3.63.
On 29 Sep 2004, 08:49.