This shows you the differences between two versions of the page.
sde:teme:tema_fr_2 [2020/03/14 13:14] ioana_maria.culic |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Devoir 2 - Mini-busybox ====== | ||
- | ===== Informations générales ===== | ||
- | |||
- | <note important> | ||
- | Date limite: **15 Mars, 23:55**\\ | ||
- | Points: **1 point** de la note finale\\ | ||
- | Téléchargement du devoir: [[https://vmchecker.cs.pub.ro|vmchecker.cs.pub.ro]]\\ | ||
- | Télécharger en retard: **1 points / jour** (maximum 4 jours)\\ | ||
- | </note> | ||
- | |||
- | |||
- | ===== Connaissances évaluées ===== | ||
- | |||
- | * Utiliser le langage Python | ||
- | * Comprendre le mode de fonctionnement de la ligne de commande | ||
- | |||
- | ===== Règles ===== | ||
- | |||
- | - Le devoir doit contenir un fichier nommé //Readme// avec des explications concernant la manière choisie pour résoudre le devoir (-0.1p) | ||
- | - Le devoir doit être implémenté en Python et seulement en utilisant des fonctions POSIX (la bibliothèque **[[https://docs.python.org/3/library/os.html|os]]** de Python). Toute autre implémentation conduira à l'annulation du devoir.(**0 points**) | ||
- | |||
- | <note warning> | ||
- | Utilisez uniquement la bibliothèque Python ** [[https://docs.python.org/3/library/os.html|os]] **, pas la bibliothèque Python posix. | ||
- | </note> | ||
- | ===== Copiage ===== | ||
- | |||
- | Le devoir est individuel. Toute tentative de copier entraînera ** 0p ** pour les devoirs. On utilisera un système automatisé pour détecter le copiage. Si on a des doutes, on va vous adresser des questions supplémentaires concernant le devoir. | ||
- | |||
- | ===== Questions ===== | ||
- | |||
- | Si vous avez des questions concernant le devoir, posez-les en publiant un //issue// sur le github [[https://github.com/upb-fils/sde|repository]] avec le format // [busybox] <le titre de votre question> //. Vous aurez besoin d'un compte github pour publier des questions. | ||
- | |||
- | <note warning> | ||
- | **NE PUBLIEZ PAS DE CODE SOURCE**. Cela est considéré comme copiage et vous aller recevoir **0p** pour le devoir. | ||
- | </note> | ||
- | |||
- | Si vous voulez recevoir un e-mail lorsque des problèmes sont signalés ou lorsqu'il y a de nouveaux messages, accédez au site github [[https://github.com/upb-fils/sde|repository]] et cliquez sur //Watch//. | ||
- | |||
- | |||
- | ===== Mini-busybox ===== | ||
- | |||
- | Le but de ce devoir est d’implémenter un utilitaire capable d'exécuter des commandes de type Linux bash. | ||
- | |||
- | Pour résoudre le devoir, vous allez réaliser un script de Python qui reçoit comme arguments la commande qu'on désire d'exécuter, suivie par ses paramètres. Le script exécutera la commande et après il finira son exécution. | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py cp file folder | ||
- | </code> | ||
- | |||
- | <note> | ||
- | Le programme sera exécuté en utilisant Python 3. | ||
- | </note> | ||
- | |||
- | ===== Commandes acceptées ===== | ||
- | |||
- | En ce qui suit, on va définir les commandes supportées par l'utilitaire, ainsi que le comportement caractéristique et les parametres acceptés. Pour toute autre commande ou pour un format différent, le script va afficher le message **Invalid command** et il va retourner la valeur **-1**. | ||
- | |||
- | <note info> | ||
- | En raison d'incompatibilités entre le système Linux et d'autres systèmes, le code d'erreur renvoyé affiché par le terminal Linux sera égal à 255, pas -1. Si le terminal affiche 255 comme code d'erreur, la solution est correcte. | ||
- | |||
- | Cela se produira également avec les codes d'erreur spécifiés ci-dessous, pour chacun d'eux, le terminal affichera un nombre positif. | ||
- | </note> | ||
- | Si la commande reçue par l'utilitaire a été exécutée sans erreur, le script va retourner la valeur 0. Si non, il va retourner un code d'erreur spécifique, mentionné dans la description de la commande. | ||
- | |||
- | <note> | ||
- | Pour vous aider à comprendre le mode fonctionnement de chaque commande, on a attaché la page de mannuel de celle-ci. On de demande pas l'implémentation de tous les parametres précisés dans le manuel, mais seulement de ceux qui seront précisés dans l'énoncé du devoir. | ||
- | |||
- | Les parametres qui ont la forme [param] sont optionnels. | ||
- | </note> | ||
- | |||
- | Les commandes supportées par l'application mini-busybox sont: | ||
- | * **pwd** - Affiche le chemin complet du directoire courant ([[https://linux.die.net/man/1/pwd]]). | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | $ python busybox.py pwd | ||
- | /home/pi/my_directories | ||
- | </code> | ||
- | |||
- | * ** echo [option] arguments** - Affiche les arguments de la console, suivies par une nouvelle ligne ([[https://linux.die.net/man/1/echo]]). En cas d'erreur il renvoie la valeur -10 (la valeaur 246 sera affiché dans le terminal). | ||
- | * **-n** on n'ajoute pas une nouvelle ligne | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | $ python busybox.py echo a b c | ||
- | a b c | ||
- | $ python busybox.py echo -n a b c | ||
- | a b c$ | ||
- | </code> | ||
- | |||
- | * **cat fichiers** - Concatène le contenu des fichiers et l'affiche a la sortie standard ([[https://linux.die.net/man/1/cat]]). En cas d'erreur il renvoie la valeur -20 (la valeaur 236 sera affiché dans le terminal). | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | $ python busybox.py cat file1 | ||
- | Text in file1 | ||
- | $ python busybox.py cat file2 | ||
- | Text in file 2 | ||
- | $ python busybox.py cat file1 file2 | ||
- | Text in file1 | ||
- | Text in file 2 | ||
- | </code> | ||
- | |||
- | * **mkdir directoires** - Crée les directoires envoyés comme parametre, s'ils n'existent pas. Si l'opération de création des directoires échoue, le script va retourner la valeur -30 (la valeaur 226 sera affiché dans le terminal). ([[https://linux.die.net/man/1/mkdir]]) | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py mkdir my_drectory | ||
- | python busybox.py mkdir my_drectory1 my_drectory2 my_drectory3 | ||
- | </code> | ||
- | |||
- | * **mv source destination** - Déplace/Renomme le fichier/directoire source dans la destination ([[https://linux.die.net/man/1/mv]]). En cas d'erreur il renvoie la valeur -40 (la valeaur 216 sera affiché dans le terminal). | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py mv my_file my_directory | ||
- | python busybox.py mv my_directory1 my_drectory2 | ||
- | </code> | ||
- | |||
- | * **ln [option] source nom_lien** - Crée un lien symbolique avec le nom nom_lien vers le fichier source. On peut créer un lien seulement vers un fichier ([[https://linux.die.net/man/1/ln]]). En cas d'erreur il renvoie la valeur -50 (la valeaur 206 sera affiché dans le terminal). | ||
- | * **-s, -symbolic** crée un lien symbolique a la place d'un lien hard | ||
- | |||
- | **Exemple:** | ||
- | <code bash> | ||
- | python busybox.py ln my_file my_file_link | ||
- | python busybox.py ln -s my_file my_file_link3 | ||
- | </code> | ||
- | * **rmdir directories** - Supprimez les répertoires vides passés comme arguments (https://linux.die.net/man/1/rmdir). En cas d'erreur, il renvoie la valeur -60 (la valeaur 196 sera affiché dans le terminal). | ||
- | **Exemple:** | ||
- | <code bash> | ||
- | python busybox.py rmdir my_empty_directory | ||
- | python busybox.py rmdir my_empty_directory1 my_empty_directory2 | ||
- | </code> | ||
- | * **rm [options] fichiers/directoires** - Supprime les fichiers ou les directoires passés comme arguments. Sans options, il ne peut pas supprimer des directoires. S'il recoit comme parametres aussi des fichiers, que des directoires, il va supprimer seulement les fichiers et il va retourner la valeur -70 (la valeaur 186 sera affiché dans le terminal). ([[https://linux.die.net/man/1/rm]]) | ||
- | * **-r, -R, -recursive** - Supprime les idrectoires et leur contenu | ||
- | * **-d, -dir** - Supprime les directoires sans contenu | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py rm my_file1 my_file2 | ||
- | python busybox.py rm -R my_directory | ||
- | python busybox.py rm --dir my_empty_directory | ||
- | </code> | ||
- | |||
- | * ** ls [options] [directoire]** - Liste le contenu di directoire. Si on ne spécifie aucun directoire, il va lister le contenu du directoire courant; sans l'option **-a/-all**, on n'affiche pas les fichiers/directoires cachés (dont le nom commence par . ). S'il recoit comme parametre le chemin vers un fichier, il va afficher le fichier. Chaque fichier/directoire sera affiché sur une nouvelle ligne ([[https://linux.die.net/man/1/ls]]). En cas d'erreur il renvoie la valeur -80 (la valeaur 176 sera affiché dans le terminal). | ||
- | * **-a, -all** - Affiche aussi les fichiers/directoires cachés, dont le nom commence par "." | ||
- | * **-R, -recursive** - Liste le contenu de chaque directoire de l'hiérarchie. Pour les fichiers/directoires qui ne se trouvent pas directement dans le point de lecture, il va afficher le chemin complet, ex: output/test/file. | ||
- | |||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | $ python busybox.py ls | ||
- | directory1 | ||
- | Directory2 | ||
- | File1 | ||
- | file2 | ||
- | $ python busybox.py ls -a | ||
- | . | ||
- | .. | ||
- | directory1 | ||
- | Directory2 | ||
- | File1 | ||
- | File2 | ||
- | $ python busybox.py ls Directory2 | ||
- | f1 | ||
- | f2 | ||
- | </code> | ||
- | |||
- | * **cp [option] source destination** - Copie un fichier ou un directoire de la source dans la destination. Si on ne mentionne pas le nomme de la destination, le fichier sera copié sous le nom de la source ([[https://linux.die.net/man/1/cp]]). En cas d'erreur il renvoie la valeur -90 (la valeaur 166 sera affiché dans le terminal). | ||
- | * **-R, -r, -recursive** - Copie de maniere récursive; il est utilisé pour copier des directoires avec tout leur contenu | ||
- | |||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py cp my_file my_directory | ||
- | python busybox.py cp -r my_directory1 my_directory2 | ||
- | </code> | ||
- | |||
- | * **touch [options] fichier** - Met à jour la date et l'heure d'acces et de modification d'un fichier à la date et heure courantes. Si le fichier n'existe pas, il est créé au moment de l'exécution du programme (([[https://linux.die.net/man/1/touch]]). En cas d'erreur il renvoie la valeur -100 (la valeaur 156 sera affiché dans le terminal). | ||
- | * **-a** - Change seulement la date et l'heure d'acces | ||
- | * **-c, -no-create** - On ne crée pas le fichier s'il n'existe pas | ||
- | * **-m** - Change seulement la date et l'heure de modification | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py touch my_file | ||
- | python busybox.py touch -a --no-create my_file | ||
- | </code> | ||
- | |||
- | * ** chmod permissions fichier/directoire** - Change les bits de permission (rwx) d'un fichier/directoire ([[https://linux.die.net/man/1/chmod]]). En cas d'erreur il renvoie la valeur -25 (la valeaur 231 sera affiché dans le terminal). | ||
- | Les permissions peuvent etre spécifiées en 2 modes: | ||
- | |||
- | - numérique: un numéro formé de 3 chiffres, chacun représentant une valuer sur 3 bits; ex: 650 | ||
- | - ajouter/supprimer des permissions spécifiques: pour chacune de ces 3 catégories (user, group, others), on peut ajouter ou supprimer des permissions. Les catégories sont: u - user, g - group, o - others, a - all. Le format générique: **u/g/o/a +/- r/w/x** | ||
- | |||
- | **Exemple:** | ||
- | |||
- | <code bash> | ||
- | python busybox.py chmod 570 file | ||
- | python busybox.py chmod u+x file | ||
- | python busybox.py chmod ug+rx file | ||
- | python busybox.py chmod a-rx file | ||
- | </code> | ||
- | |||
- | Pour plus de détails sur le mode de fonctionnement de chaque commande, vous pouvez consulter le manuel spécifique du terminal de Linux: **man commande**. La commande peut etre exécutée en chaque terminal d'un système Linux ou dans le lien attaché a la commande. | ||
- | |||
- | ===== Règles d'implémentation ===== | ||
- | |||
- | * Dans l'implémentation du devoir, vous allez utiliser l'environnement de programmation Python3. | ||
- | * Le fichier principal doit avoir le nom **busybox.py**, car c'est le seut fichier que le systeme de test va prendre en compte. | ||
- | * Pour implémenter les commandes supportées, toutes les opérations seront effectuées seulement en utilisant des fontions POSIX de la bibliotheque **os** caractéristique a Python ([[https://docs.python.org/3/library/os.html]]). | ||
- | * Le programme réalisé doit avoir un comportement générique. Si on observe que le devoire est résolu seulement pour passer certains tests, les points correspondant a ces tests seront annulés. | ||
- | |||
- | <note warning> | ||
- | Utilisez uniquement la bibliothèque Python ** os **, pas la bibliothèque Python posix. | ||
- | </note> | ||
- | |||
- | |||
- | ===== Télécharger les devoirs ===== | ||
- | Les devoirs doivent être téléchargés sur [[https://vmchecker.cs.pub.ro|vmchecker]]. | ||
- | Connectez-vous avec votre nom d'utilisateur moodle, sélectionnez le cours //Systemes d'Explotation (FILS)// et téléchargez [[#archivage-de-devoir | l'archive de devoir]]. | ||
- | |||
- | ==== Readme ==== | ||
- | Le fichier //readme// a le format suivant: | ||
- | |||
- | <code> | ||
- | Nom complet | ||
- | Groupe | ||
- | |||
- | Une explication comment vous avez écrit le devoir, ce que vous avez utilisé, les idées principales. | ||
- | </code> | ||
- | |||
- | |||
- | ==== Archivage de devoir ==== | ||
- | Pour télécharger votre devoir, suivez les instructions suivantes: | ||
- | |||
- | - Créez une archive zip (pas rar, ace, 7zip ou autre) contenant: | ||
- | * Le fichier Python busybox.py | ||
- | * Tout autre fichier python supplémentaire dont vous avez besoin | ||
- | * le fichier Readme | ||
- | - Connectez-vous avec [[https://vmchecker.cs.pub.ro|vmchecker]] | ||
- | - sélectionner le cours //Systemes d'Explotation (FILS)// | ||
- | - sélectionnez //2. Allocator// | ||
- | - télécharger l'archive | ||
- | |||
- | |||
- | L'archive doit contenir tous les fichiers principaux dans la racine, pas dans des sous-directoires. NE PAS archiver le directoire du devoir, mais les fichiers DIRECTEMENT. | ||
- | Lorsque l'archive est téléchargée, //vmchecker// va exécuter: | ||
- | |||
- | <code bash> | ||
- | unzip archive.zip homework | ||
- | cd homework | ||
- | python3 busybox.py commande parametres | ||
- | </code> |