Consignes :
- Vous devez exécuter vos scripts pour les tester. Si les scripts
ne peuvent pas s'exécuter ou ne produisent pas le résultat escompté,
vous perdrez des points ;
- Vous pouvez vous appuyer sur l'annexe shell qui se trouve ici ;
- Le barème est donné à titre indicatif.
Dans cet exercice, vous êtes plongés dans une "escape game". Le but d'une "escape game",
comme vous le savez probablement, est de sortir au bout d'une heure (et quinze minutes dans ce cas précis).
Le jeu a été conçu pour un nombre quelconque de joueurs, mais, dans
cette partie, vous jouez à deux. Vous prenez le rôle de Sherlock
Holmes. Un ami à vous prend le rôle du Dr. Watson. Vous vous trouvez dans
l'antre d'un criminel en série et devez résoudre un crime qui s'est
déroulé entre 1891 et 1899.
Initialement, chacun de vous est dans une pièce séparée et
vous ne pouvez donc pas communiquer. Dans un premier temps,
vous devez préparer votre environnement (exercice 1).
Dans un second temps, vous devez établir une connexion avec votre ami (exercice 2). Enfin,
vous devrez trouver le code pour sortir (exercice 3). Notez que vous pouvez faire l'exercice 3
indépendemment de l'exercice 2.
Préparations (2 points, ~5min)
Pour faire le contrôle, vous aurez besoin de
l'archive
suivante
qui contient un ensemble de répertoires et
les scripts
et
.
Récupérez l'archive, décompressez-la, entrez dans le répertoire
csc3102-cf1,
et vérifiez que le contenu est bien celui affiché par la commande
ls
indiquée à la fin de cette séquence d'instructions :
$ tar -xf csc3102-cf1.tgz
$ cd csc3102-cf1
$ ls
ma_liste_de_crimes/ P.sh sauvegarde.sh V.sh
Le répertoire csc3102-cf1 dans lequel vous vous trouvez
est votre répertoire de travail. Tous
vos scripts doivent donc être créés ici.
Établissement de la communication (10 points, ~40min)
Dans cette première partie du jeu, vous devez établir la connexion avec votre ami.
Créez un script nommé sherlock.sh. Vérifiez qu'il y a bien un
argument qui est passé au script. Cet argument représente le nombre de
joueurs. Vérifiez que ce nombre est égal à 2 et quittez en renvoyant
une erreur si ce n'est pas le cas.
Dans le script, créez un tube nommé
allo et ouvrez-le en
lecture/écriture avec la commande exec.
Maintenant que le canal de communication a été créé, vous devez
vérifier que la communication fonctionne bien. Pour cela, vous devez  :
- Créer un script watson.sh.
- Ouvrir le tube allo en lecture/écriture dans watson.sh.
- Vous devriez maintenant pouvoir communiquer avec votre ami. Dans
sherlock.sh, après l'ouverture du tube, lancez le processus watson.sh
en arrière plan.
- Afin d'initialiser la communication, Watson écrit son PID dans le
tube et Sherlock doit le stocker dans une variable nommée ami.
Dans cette "escape game", la communication se fera dans un seul sens :
Watson écrit à Sherlock qui de son côté lit les messages.
Modifiez votre script watson.sh de façon à ce que Watson écrive
« Tu m'entends ? » dans le tube et que Sherlock lise le contenu du
tube. Vérifiez que Sherlock lit bien ce que Watson a écrit en affichant
le message reçu dans le terminal.
Comme expliqué précédemment, vous devez résoudre un crime qui s'est déroulé
entre 1891 et 1899. Pour cela Watson dispose d'un ensemble de documents
se trouvant dans l'archive que vous avez téléchargée au début de l'examen.
Dans l'archive vous trouverez les documents de Watson dans le
répertoire
ma_liste_de_crime.
Étant donné que le crime s'est déroulé entre
1891 et 1899, Watson doit sélectionner uniquement les répertoires
commençant par "189".
Dans votre script watson.sh, affichez sur le terminal l'ensemble des sous-répertoires
directs de ma_liste_de_crime dont le nom commence par 189.
Ici, on ne cherche que les répertoires se trouvant dans
ma_liste_de_crimes, et non dans les répertoires enfants
de ma_liste_de_crimes.
Maintenant, au lieu d'afficher ces noms de répertoire à l'écran, écrivez-les, un à un, dans le
tube. Une fois que Watson a fini d'écrire les répertoires,
il doit prévenir Sherlock en écrivant le message "done" dans le tube.
À présent, faites en sorte que Sherlock lise tous les messages
envoyés par Watson tant qu'il n'a pas reçu le message "done". Vous
pouvez faire cela en testant, dans une boucle while, que le message lu
n'est pas égal à done. Au fur et à mesure qu'il reçoit les messages,
Sherlock les affiche sur le terminal.
Le fait d'afficher ou de ne pas afficher le message de terminaison
"done" n'est pas sanctionné.
Lorsque Sherlock reçoit les noms des répertoire, il lance le
script de sauvegarde nommé
sauvegarde.sh fourni
dans l'archive. Ce script prend en paramètre
un nom de répertoire lu par Sherlock dans le tube et écrit
ce nom dans le fichier
crime_list.
Ajoutez donc un appel
à
sauvegarde.sh après chaque lecture du tube (Le mot done, indiquant la fin des envois
faits par Watson, ne doit pas être écrit dans le fichier
crime_list).
Le lancement de sauvegarde.sh doit se faire en arrière plan.
Notez qu'avant de commencer à
écrire, sauvegarde.sh vérifie l'existence du fichier crime_list.
Si par hasard vous avez des erreurs, le fichier crime_list
risque de contenir des noms provenant d'exécutions précédentes.
Pour éviter ce problème, il faut supprimer
le fichier crime_list avec la commande rm -f crime_list
au début de sherlock.sh.
Étant donné que chaque appel à sauvegarde.sh se fait en arrière
plan, il se peut qu'il y ait plusieurs processus lancés en
parallèle. Ces processus accèdent de manière concurrente au fichier
crime_list. Dans sauvegarde.sh, identifiez et protégez la section
critique.
Si vous n'arrivez pas à sortir de la pièce au bout
d'une heure et quinze minutes, les propriétaires de l'escape game envoient
un SIGINT ou un SIGTERM à Sherlock. Modifiez le script sherlock.sh de
façon à ce qu'il détruise le tube nommé, le fichier crime_list et
qu'il quitte à la réception d'un de ces signaux.
Découverte du code caché dans le plus gros fichier (8 points, ~35min)
Vous pouvez réaliser cette partie même si vous n'avez pas
fait l'exercice précédent. Pour cela, il vous suffit de mettre les
sous-répertoires de ma_liste_de_crimes dont
le nom commence par 189 dans crime_list manuellement.
Commencez par créer un nouveau script sortie.sh. Ce script
est celui que Sherlock exécute pour résoudre l'énigme.
De façon à éviter de vous bloquer si vous n'avez pas réussi à terminer
l'exercice précédent, on suppose que vous lancez ce script directement
à partir du terminal (la façon logique de faire aurait été de le lancer
après la fin de la réception des messages de Watson dans sherlock.sh).
Assurez-vous que crime_list contient bien les répertoires
commençant par 189, quitte à les ajouter manuellement au fichiers si vous
avez eu une erreur.
Dans sortie.sh, lisez le fichier crime_list ligne à ligne
et affichez chaque ligne dans le terminal.
Pour chaque répertoire se trouvant dans
crime_list, affichez tous
les fichiers ordinaires dont le nom commence par 0.
Les fichiers cherchés peuvent se trouver dans des sous-répertoires.
Dans
sortie.sh, après avoir supprimé l'affichage des noms des fichiers, identifiez le
fichier de plus grande taille parmi les fichier que vous avez trouvés à la question précédente,
et sauvegardez son chemin dans une variable.
On vous rappelle que la commande "du fich" donne la taille du
fichier fich.
Finalement, affichez le contenu de ce fichier à la fin de sortie.sh.
Ce fichier contient le nom du coupable. Bravo vous avez réussi cette escape game.