Aller au contenu

Administration Unix - TP séance 10

À la fin de la séance, déposez votre fichier de réponses sur la page Ametice en suivant bien les instructions, même si vous n'avez pas fini la planche ; lorsque vous aurez terminé, vous pourrez re-déposer la version finale.

Le deadline de rendu pour tous les TP est : mardi 3 janvier à 23h.

Mini-projet (3/3) : navigation dans des pages html de miniatures

(suite des planches TP8 et TP9 sur le script miniatures.sh)

a) À l'aide de la commande wget, récupérez le tarball

https://pageperso.lis-lab.fr/~edouard.thiel/ens/adunix/pub/img-tp10.tgz

puis décompactez-le dans /tmp.

Remplacez ensuite le programme principal de votre script miniatures.sh par ces lignes :

rep1="/tmp/img-tp10"
rep2="/tmp/minia-tp10"
generer_miniatures_rep "$rep1" "$rep2"
generer_page_html "$rep1" "$rep2"

Exécutez votre script, puis à l'aide de votre navigateur, ouvrez la page

file:///tmp/minia-tp10/index.html

Vous devriez voir deux miniatures (Homer et Tux) et leur lien vers l'image originale, qui s'ouvre lorsque le lien est cliqué (sinon, voir la remarque qui suit).

Remarque : lorsque Firefox est installé dans un Snap (cas par défaut sur Ubuntu 22.04+), ce navigateur n'a pas accès à /tmp. Dans ce cas, créez un répertoire $HOME/tmp, décompactez le tarball dedans, puis ouvrez dans le navigateur file:///$HOME/tmp/minia-tp10/index.html en remplaçant $HOME par sa valeur ; dans la suite de l'énoncé remplacez partout /tmp par $HOME/tmp.

b) Rajoutez un fonction generer_bloc_navigation, qui prend en argument un chemin absolu rep_srca, puis génère à l'aide d'un here-document le bloc html suivant :

<p>Navigation :</p>
<ul>
  <li><a href="../index.html">parent</a></li>
</ul>

c) Modifiez la fonction generer_bloc_navigation de manière à ce que après le premier <li>...</li>, pour chaque sous-répertoire de rep_srca, elle écrive une ligne de la forme :

  <li><a href="sous_rep/index.html">sous_rep</a></li>

en remplaçant sous_rep par le nom du sous-répertoire (sans aucun chemin).

Remarque : pour parcourir tous les sous-répertoires, il suffit de parcourir tous les fichier et d'ignorer ceux qui ne sont pas des répertoires.

Appelez la fonction à la fin du script en lui passant "/tmp/img-tp10". On devrait obtenir l'affichage suivant :

<p>Navigation :</p
<ul>
  <li><a href="../index.html">parent</a></li>
  <li><a href=chats/index.html>chats</a></li>
  <li><a href=fleurs/index.html>fleurs</a></li>
</ul>

d) Dans la fonction generer_page_html, appelez generer_bloc_navigation en lui passant le chemin source absolu rep_srca, de manière à lui faire insérer le bloc des répertoires juste après le titre principal <h1>...</h1>.

Relancez votre script puis vérifiez dans le navigateur que le paragraphe de navigation apparaît avec les liens.

Remarque : pour le moment, lorsqu'on clique sur les liens des répertoires dans le navigateur, on obtient une erreur de fichier introuvable, c'est normal.

e) Dans le programme principal, remplacez provisoirement rep1 et rep2 par :

rep1="/tmp/img-tp10/chats"
rep2="/tmp/minia-tp10/chats"

puis relancez le script.

Ouvrez la page

file:///tmp/minia-tp10/index.html

puis cliquez sur "chats", cela devait vous conduire sur la page des chats ; dans celle-ci, cliquez sur "parent", cela devrait vous ramener dans la page initiale.

f) Nous allons maintenant générer récursivement toutes les miniatures et fichiers index.html pour chaque sous-répertoire, en nous inspirant du parcours récursif effectué par la fonction chercher_fichier dans le cours n°8 section 9.2.3.

Écrivez une fonction generer_tout_recursif qui prend en argument 1 la base du répertoire source, noté base_src (par exemple "/tmp/img-tp10"), en argument 2 la base du répertoire destination, noté base_dest (par exemple "/tmp/minia-tp10"), et en argument 3 un sous-répertoire, noté sous_rep, de base_src (par exemple "chats", ou "fleurs/roses" ; il peut aussi être ".").

La fonction parcourt tous les sous-répertoires rep de base_src/sous_rep, et pour chacun fait un appel récursif en passant à la fonction : base_src (inchangé), base_dest (inchangé), et le chemin de rep relativement à base_src (par exemple si sous_rep est "fleurs" et rep est "/tmp/img-tp10/fleurs/roses", le 3e argument passé sera "fleurs/roses").

La fonction affecte ensuite rep1 comme le chemin base_src/sous_rep, et rep2 comme le chemin base_dest/sous_rep, puis appelle generer_miniatures_rep et generer_page_html en leur passant rep1 et rep2.

Pour tester, supprimez récursivement /tmp/minia-tp10, puis dans le script, remplacez le programme principal par

rep1="/tmp/img-tp10"
rep2="/tmp/minia-tp10"
generer_tout_recursif "$rep1" "$rep2" "."

Vérifiez ensuite dans le navigateur que les pages de miniatures s'affichent et que vous pouvez passer de l'une à l'autre (chats, fleurs, roses, etc) (sauf dans la page principale, le lien "parent" pointera vers un fichier inexistant /tmp/index.html, c'est normal).

g) Remplacez le programme principal de manière à gérer les options suivantes en utilisant un case :

-h ou --help    affiche l'usage

-m rep1 rep2    génère les miniatures de rep1 dans rep2

-i rep1 rep2    génère l'index pour rep1 dans rep2

-r rep1 rep2    génère récursivement les miniatures et les index
                à partir de rep1 dans rep2

Dans le cas d'une erreur, le programme affichera un message d'erreur ainsi que l'usage dans la sortie d'erreur puis échouera.

Vérifiez avec /tmp/img-tp10 et /tmp/minia-tp10 (après avoir effacé ce dernier).