Ce document a été produit par HEVEA.
Votre browser peut avoir a être configuré pour afficher correctement certains symboles.
Reportez-vous à la
documentation d'HEVEA.

Licence d'informatique
Module de C/Unix
Vérification de duplication d'exécutables, distribution de logiciels

Examen -- Partie Unix

Philippe Marquet

Janvier 1998

Les documents de cours et TD sont autorisés.
On rendra deux copies séparées pour la partie Unix et pour la partie langage C. La partie Unix est à rendre sur une copie de couleur.

Ce document est disponible sous forme d'un fichier PostScript compressé.

  Important
Plusieurs commandes Bourne-shell sont à développer. On veillera particulièrement à détailler pour chacune des commandes un algorithme avant de donner le code Bourne-shell lui-même. La notation sera répartie entre ces deux composantes de vos réponses.

1  Vérification de duplication d'exécutables

Les commandes exécutables sont recherchées par le shell dans les répertoires listées dans les variables $path ou $PATH. Il est courant que plusieurs problèmes surviennent à ce niveau : duplication d'un répertoire parmi ceux listés dans $PATH, duplication d'exécutables entre deux répertoires distincts listés dans $PATH, etc. Le but des commandes Bourne-shell qui seront développées est d'identifier ces problèmes.

On développera successivement :
Question 1  [Pourquoi les doublons sont-ils gênants]  

1.1  uniqpath

La syntaxe de la commande uniqpath est la suivante :
uniqpath    [-quiet]    [-path]

La commande retourne sur la sortie standard une liste de répertoires au format de $PATH qui est un sous ensemble des répertoires listés dans $PATH dans lequel les répertoires relatifs (y compris . et ..) sont supprimés et tel que aucun des répertoires listés ne soit présent plusieurs fois.

Par défaut, la commande uniqpath produit sur la sortie d'erreur la liste des répertoires doublons de $PATH ; l'option -quiet indique de ne pas produire ce résultat.

Le résultat produit par la commande uniqpath est par défaut au format utilisé par la variable $PATH ; l'option -path indique de produire un résultat au format de la variable $path.

  Note
Le format de la variable $PATH est construit sur l'exemple suivant :
% echo $PATH
/usr/local/tex/bin/:/usr/local/bin:/usr/sbin:/sbin:/etc:/home/west/marquet/bin\
/linux:/home/west/marquet/bin:.:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/u\
sr/X11R6/bin
Le format de la variable $path est une liste de répertoires :
% echo $path
/usr/local/tex/bin/ /usr/local/bin /usr/sbin /sbin /etc /home/west/marquet/bin\
/linux /home/west/marquet/bin . /usr/local/bin /bin /usr/bin /usr/X11R6/bin /u\
sr/X11R6/bin
Exemples d'utilisation
% uniqpath -path 
/usr/X11R6/bin : 2 occurrences dans $PATH
/usr/local/bin : 2 occurrences dans $PATH
/usr/local/tex/bin/ /usr/local/bin /usr/sbin /sbin /etc /home/west/marquet/bin\
/linux /home/west/marquet/bin /bin /usr/bin /usr/X11R6/bin
% setenv $PATH  .:`uniqpath -quiet`

Question 2  [Commande uniqpath]   Donner l'algorithme puis le code Bourne-shell de la commande uniqpath.

1.2  vrfydupexe

La commande vrfydupexe liste les doublons dans la liste des exécutables trouvés dans les répertoires passés en paramètre.

  Exemple d'utilisation
% vrfydupexe `uniqpath -path`
/usr/X11R6/bin : 2 occurrences dans $PATH
/usr/local/bin : 2 occurrences dans $PATH
-rwxr-xr-x   3 root     system    139264 May 11  1996 /usr/local/bin/zcat
-rwxr-xr-x   3 bin      bin        32768 Feb  3  1995 /usr/bin/zcat
-rwxr-xr-x   1 marquet  west        2341 Sep  8  1997 /home/west/marquet/bin/l\
ndir
-rwxr-xr-x   1 root     root        5768 Nov  6  1996 /usr/X11R6/bin/lndir

Question 3  [Commande vrfydupexe]   Donner l'algorithme puis le code Bourne-shell de la commande vrfydupexe.

2  Distribution de logiciels

La gestion par un administrateur système d'un parc de machines peut nécessiter la mise à disposition sur plusieurs machines d'un même logiciel. Une solution est de rendre le logiciel disponible via l'exportation depuis une machine serveur d'un système de fichiers sur lequel est installé le logiciel. Une alternative est de dupliquer ce logiciel sur un disque local de chacune des machines clientes.
Question 4  [Pourquoi une commande dist]   Discuter brièvement des avantages et inconvénients des deux approches. En particulier, considérer successivement les points de vue de l'administrateur système et de l'utilisateur.

Nous proposons ici de mettre en place un environnement permettant de joindre les avantages des deux solutions. Le logiciel est installé sur une machine dite machine de référence par l'administrateur système. L'environnement de distribution du logiciel est ensuite configuré pour permettre la distribution automatique du logiciel sur l'ensemble des machines des utilisateurs.

La distribution d'un logiciel sur une machine est caractérisée par Ces informations sont présentes dans un fichier de configuration (.cfg). Ces fichiers comportent des lignes de commentaires (débutant par #), des lignes de définition de domaine, et des lignes d'action.

Les lignes de définition de domaine permettent de construire des listes de machines cibles sur lesquelles le logiciel devra être distribué. Ces lignes sont au format :
<Domain-Name> := <Liste de Domain- ou Machine-Name>
La partie droite est une liste de noms de domaines précédemment définis dans le fichier de configuration ou de noms de machines. Les différents termes de la liste sont séparés par des espaces.

Une ligne d'action donne, pour une machine ou un domaine donné, un ensemble de fichiers sources qui devront être distribués sur chacune des machines du domaine. Ces lignes sont au format suivant :
<Domain-Name> : <Entrée Source> [-> <Entrée Destinataire>]
L'entrée destinataire est par défaut la même que l'entrée fichier source. Dans le cas d'un répertoire, l'ensemble des entrées de ce répertoire sont récursivement traitées.

Exemple de fichier de configuration :
% cat ns.cfg
# Fichier de configuration de distribution du logiciel ns
# sur les machines de mon domaine

# Les machines OSF Unix
OSF := luxe bock 
# Les machines Linux
LINUX := sol coors
# L'ensemble des machines de mon domaine 
TOUT := LINUX OSF palm 

# Distribution du logiciel 
TOUT : /usr/local/ns
# Distribution des pages de manuel du logiciel 
TOUT : /usr/local/man/man1/ns.1
# Distribution du binaire du logiciel, un binaire par type
#  d'architecture 
OSF : /usr/local/osf/ns -> /usr/local/bin/ns
LINUX : /usr/local/linux/ns -> /usr/local/bin/ns
palm : /usr/local/linux/ns -> /usr/local/bin/ns
atlas : /usr/local/linux/ns -> /usr/local/bin/ns

Question 5  [Commande listhost]   Donner l'algorithme puis le code d'une commande Bourne-shell listhost qui affiche l'ensemble des machines impliquées dans la distribution d'un logiciel dont le fichier de configuration de distribution est donné en paramètre. Exemple :

% listhost ns.cfg
luxe bock sol coors palm atlas

Question 6  [Commande entry]   Donner l'algorithme puis le code d'une commande Bourne-shell entry qui affiche les parties droites des lignes d'action pour une machine et un fichier de configuration donné. Exemple :

% entry ns.cfg palm
/usr/local/ns
/usr/local/man/man1/ns.1
/usr/local/linux/ns -> /usr/local/bin/ns

La commande Bourne-shell dist :
dist    [-remove]    [-savetargets]    cfgfile    [domain]...
diffuse le logiciel dont le fichier de configuration cfgfile est passé en paramètre. Par défaut la distribution se fait sur l'ensemble des machines concernées par ce fichier de configuration. La présence sur la ligne de commande d'une liste de domaine ou de machine (paramètre domain) indique de limiter la distribution à ces domaines/machines.

L'option -savetargets réalise une copie des fichiers distants avant mise à jour. Tout fichier file mis a jour est préalablement recopié dans file.OLD

L'option -remove supprime les fichiers supplémentaires. Pour chacun des répertoires mis à jour par la distribution, les entrées sur la machine cible qui n'existent pas dans la distribution de référence sont supprimées.

Exemple :
% rsh palm ls /usr/local/ns
/usr/local/ns: 
ns.dat          ns.vtk          version
% ls /usr/local/ns/ns.{dat,vtk} 
/usr/local/ns/ns.dat
/usr/local/ns/ns.vtk
% ls /usr/local/ns/version
/usr/local/ns/version: No such file or directory.
% dist -savetargets -remove ns.cfg palm
-- Sauvegarde de palm:/usr/local/ns/ns.dat dans palm:/usr/local/ns.dat.OLD
-- Sauvegarde de palm:/usr/local/ns/ns.vtk dans palm:/usr/local/ns.vtk.OLD
-- Suppression de palm:/usr/local/ns/version
-- Copie de /usr/local/ns sur palm:/usr/local/ns
-- Sauvegarde de palm:/usr/local/man/man1/ns.1 dans palm:/usr/local/man/man1/ns.1.OLD
-- Copie de /usr/local/man/man1/ns.1 sur palm:/usr/local/man/man1/ns.1
-- Sauvegarde de palm:/usr/local/bin/ns dans palm:/usr/local/bin/ns.OLD
-- Copie de /usr/local/linux/ns sur palm:/usr/local/bin/ns

Question 7  [Commande dist]   Donner l'algorithme puis le code de la commande Bourne-shell dist.

Ce document a été traduit de LATEX par HEVEA.