CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique

CSC3102 – Contrôle Final 1 – Année 2018/2019

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.
exec 3 nom-du-tube

Maintenant que le canal de communication a été créé, vous devez vérifier que la communication fonctionne bien. Pour cela, vous devez&nbsp :
  • 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 &laquo Tu m'entends ? &raquo 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.