This shows you the differences between two versions of the page.
sde:teme:tema_ro_2_busybox [2020/03/09 15:03] ioana_maria.culic |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tema 2 - Mini-busybox ====== | ||
- | |||
- | ===== Informații generale ===== | ||
- | |||
- | <note important> | ||
- | Deadline: **15 Martie, ora 23:55**\\ | ||
- | Punctaj: **1 punct** din notă\\ | ||
- | Încărcarea temei: [[https://vmchecker.cs.pub.ro|vmchecker.cs.pub.ro]]\\ | ||
- | Încărcarea cu întârziere: **1 punct / zi** (maxim 4 zile)\\ | ||
- | </note> | ||
- | |||
- | ===== Cunoștințe evaluate ===== | ||
- | |||
- | * Folosirea limbajului Python | ||
- | * Modul de funcționare a liniei de comandă | ||
- | |||
- | ===== Reguli ===== | ||
- | |||
- | - Tema trebuie să conțină un fișier Readme în care să explicați cum ații făcut tema **(-0.1p)**. | ||
- | - Tema trebuie implementată folosind limbajul Python și doar folosind funcții POSIX (biblioteca Python **[[https://docs.python.org/3/library/os.html|os]]**). Orice alte implementări vor duce la anularea temei **(0 puncte)**. | ||
- | |||
- | <note warning> | ||
- | Folosiți doar biblioteca Python **[[https://docs.python.org/3/library/os.html|os]]**, nu biblioteca Python posix. | ||
- | </note> | ||
- | |||
- | ===== Copierea ===== | ||
- | |||
- | Tema se rezolvă individual. Orice tentativă de copiere va rezulta în **0 puncte** pentru tema respectivă. Vom utiliza și sisteme automate de detectare a copierii. Dacă avem dubii, vă vom adresa întrebări suplimentare legate de temă. | ||
- | |||
- | ===== Întrebări ===== | ||
- | |||
- | Dacă aveți întrebări legate de temă, vă rugăm să scrieți un issue pe repository-ul de github [[https://github.com/upb-fils/sde.git|repository]] cu titlul de forma [busybox] <titlul întrebări voastre>. Aveți nevoie de un cont de github pentru a scrie întrebări. | ||
- | |||
- | <note warning> | ||
- | **NU PUBLICAȚI COD SURSĂ**. Acesta va fi considerată copiere și se va penaliza cu **0 puncte** pe temă pentru voi. | ||
- | </note> | ||
- | |||
- | Dacă doriți să primiți un email când se pun întrebări noi sau cand apar răspunsuri, accesați github [[https://github.com/upb-fils/sde|repository]] și faceți click pe //Watch//. | ||
- | |||
- | ===== Mini-busybox ===== | ||
- | |||
- | Scopul acestei teme este implementarea unui utilitar capabil să execute comenzi tip Linux bash. | ||
- | |||
- | Pentru rezolvarea temei veți realiza un script Python care primește ca argumente comanda ce se dorește a fi executată, urmată de parametrii acesteia. Scriptul va executa comanda după care își va încheia execuția. | ||
- | |||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py cp file folder | ||
- | </code> | ||
- | |||
- | <note info> | ||
- | Programul va fi rulat folosind Python 3. | ||
- | </note> | ||
- | |||
- | ==== Comenzi suportate ==== | ||
- | |||
- | În continuare, vom defini comenzile suportate de utilitar, împreună cu comportamentul caracteristic și parametrii pe care acestea de suportă. Pentru orice altă comandă sau orice alt format, scriptul va afișa mesajul **Invalid command** și va returna valoarea **-1**. | ||
- | |||
- | În cazul în care comanda primită de utilitar a fost rulată cu succes, acesta va returna valoarea 0. În caz contrar, acesta va returna un cod de eroare specific, mentionat in descrierea comenzii. | ||
- | |||
- | <note info> | ||
- | Pentru a vă ajuta în înțelegerea modului de funcționare a fiecărei comenzi, am atașat pagina de manual a acesteia. Nu se cere implementarea tuturor parametrilor precizați în manual, doar a celor precizați în cerință. | ||
- | |||
- | Parametrii de forma [parametru] sunt optionali. | ||
- | </note> | ||
- | |||
- | Comenzile suportate de aplicația mini-busybox sunt: | ||
- | |||
- | *** pwd** - Afișează calea completă a directorului curent. (https://linux.die.net/man/1/pwd) | ||
- | |||
- | **Exemplu:** | ||
- | <code bash> | ||
- | $ python busybox.py pwd | ||
- | /home/pi/my_directories | ||
- | </code> | ||
- | |||
- | * **echo [opțiune] argumente** - Afișează argumentele în consolă urmate de linie nouă (https://linux.die.net/man/1/echo). In caz de eroare intoarce valoarea -10 | ||
- | * **-n** nu adaugă o linie nouă la final | ||
- | |||
- | **Exemplu:** | ||
- | <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 fișiere** - Concatenează conținutul fișierelor și îl afișează la ieșirea standard (https://linux.die.net/man/1/cat). In caz de eroare intoarce valoarea -20. | ||
- | |||
- | **Exemplu:** | ||
- | <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 directoare** - Crează directoarele pasate ca parametru, dacă nu exista deja. Dacă operația de creare a directoarelor eșuează, scriptul va întoarce valoarea -30 (https://linux.die.net/man/1/mkdir) | ||
- | |||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py mkdir my_drectory | ||
- | python busybox.py mkdir my_drectory1 my_drectory2 my_drectory3 | ||
- | </code> | ||
- | |||
- | * **mv sursă destinație** - Mută/redenumește fișierul/directorul sursă în destinație (https://linux.die.net/man/1/mv). In caz de eroare intoarce valoarea -40. | ||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py mv my_file my_directory | ||
- | python busybox.py mv my_directory1 my_drectory2 | ||
- | </code> | ||
- | |||
- | * **ln [opțiune] sursă nume_link** - Creează un link cu numele nume_link către fisierul sursă. Se poate crea un link doar către un fișier (https://linux.die.net/man/1/ln). In caz de eroare intoarce valoarea -50. | ||
- | * **-s, --symbolic** creează un link simbolic în locul unui link hard | ||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py ln my_file my_file_link | ||
- | python busybox.py ln -s my_file my_file_link3 | ||
- | </code> | ||
- | |||
- | * **rmdir directoare** - Șterge directoarele goale pasate ca parametru (https://linux.die.net/man/1/rmdir). In caz de eroare intoarce valoarea -60. | ||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py rmdir my_empty_directory | ||
- | python busybox.py rmdir my_empty_directory1 my_empty_directory2 | ||
- | </code> | ||
- | |||
- | * **rm [opțiuni] fișiere/directoare** - Șterge fișierele sau directoarele pasate ca parametru. Fără opțiuni, nu șterge directoare, dacă se pasează ca parametrii și fișiere și directoare, fișierele se șterg și se întoarce valoarea -70. (https://linux.die.net/man/1/rm) | ||
- | * **-r, -R, --recursive** șterge directoarele și tot conținutul acestora | ||
- | * **-d, --dir** șterge directoarele goale | ||
- | **Exemplu:** | ||
- | <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 [opțiuni] [director]** - Listează conținutul directorului. Dacă nu este specificat un director, listează conținutul directorului curent; fără opțiunea **-a/--all**, nu se afișează fișierele/directoarele ascunse (al căror nume incepe cu .). Dacă primește ca parametru calea către un fișier, va afișa însuși parametrul. Fiecare fișier/director se va afișa pe o linie nouă. In caz de eroare intoarce valoarea -80(https://linux.die.net/man/1/ls). | ||
- | * **-a, --all** afișează și fișierele/directoarele ascunse (al căror nume incepe cu .) | ||
- | * **-R, --recursive** afișează conținutul fiecărui director din ierarhie. Pentru fisierele/directoarele care nu se găsesc direct în punctul de citire, se va afișa calea completă, ex: output/test/file. | ||
- | **Exemplu:** | ||
- | <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 [opțiune] sursă destinație** - Copiază un fișier sau un director sursă în destinație. Dacă nu se precizează numele destinației, fișierul va fi copiat sub numele sursei (https://linux.die.net/man/1/cp). In caz de eroare intoarce valoarea -90. | ||
- | * **-R, -r, --recursive** copiază recursiv; se folosește pentru copierea directoarelor și copiază directorul cu tot conținutul acestuia | ||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py cp my_file my_directory | ||
- | python busybox.py cp -r my_directory1 my_directory2 | ||
- | </code> | ||
- | |||
- | * **touch [opțiuni] fișier** - Actualizează data și ora de acces și de modificare a unui fișier la data și ora curentă. Dacă fișierul nu există, acesta este creat la rularea comenzii (https://linux.die.net/man/1/touch). In caz de eroare intoarce valoarea -100. | ||
- | * **-a** schimbă doar data și ora de acces | ||
- | * **-c, --no-create** nu creează fișierul dacă acesta nu există | ||
- | * **-m** schimbă doar data și ora de modificare | ||
- | **Exemplu:** | ||
- | <code bash> | ||
- | python busybox.py touch my_file | ||
- | python busybox.py touch -a --no-create my_file | ||
- | </code> | ||
- | |||
- | * **chmod permisiuni fișier/director** - Schimbă biții de permisiuni (rwx) ai unui fișier/director (https://linux.die.net/man/1/chmod). In caz de eroare intoarce valoarea -25. | ||
- | Permisiunile pot fi specificate în două moduri: | ||
- | * Numeric - un număr alcătuit din 3 cifre, fiecare reprezentand o valoare pe 3 biți; ex: 650 | ||
- | * Adăugare/ștergere de permisiuni specifice - pentru fiecare dintre cele 3 categorii (user, group, others) se pot adaugă sau șterge permisiuni. Categoriile sunt: u - user, g- group, o-others, a-all. Formatul generic: **u/g/o/a +/- r/w/x** | ||
- | |||
- | **Exemplu:** | ||
- | <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> | ||
- | |||
- | Pentru mai multe detalii despre cum modul de funcționare al fiecărei comenzi, puteți consulta manualul specific terminalului de Linux: **man comanda**. Comanda poate fi rulată în orice terminal de pe un sistem Linux sau în link-ul atașat comenzii, mai sus. | ||
- | |||
- | |||
- | ===== Reguli de implementare ===== | ||
- | |||
- | * În implementarea temei se va folosi mediul de programare Python3. | ||
- | * Fișierul principal trebuie să aibă numele **busybox.py**, acesta este fișierul pe care sistemul de testare îl va lua în considerare. | ||
- | * Pentru implementarea comenzilor suportate, toate operațiile vor fi efectuate folosind doar funcții POSIX din biblioteca **os** specifică Python (https://docs.python.org/3/library/os.html). | ||
- | * Programul realizat trebuie să aibă un comportament generic. Dacă observăm că tema este rezolvată doar pentru a trece anumite teste specifice, punctele corespondente acelor teste vor fi anulate din punctajul total. | ||
- | |||
- | <note warning> | ||
- | Folosiți doar biblioteca Python **os**, nu biblioteca Python posix. | ||
- | </note> | ||
- | |||
- | |||
- | ===== Trimiterea temei ===== | ||
- | |||
- | Tema se va încărca pe vmchecker. Logați-vă pe site cu folosind utilizatorul de pe moodle, selectați cursul Systemes d'Explotation (FILS) și încărcați arhiva temei. | ||
- | |||
- | ==== Readme ==== | ||
- | |||
- | Fișierul readme are următorul format: | ||
- | |||
- | Numele vostru întreg | ||
- | |||
- | Grupa | ||
- | |||
- | Descrierea rezolvării temei, de ce ați ales anumite soluții, etc. | ||
- | |||
- | ==== Arhiva temei ==== | ||
- | |||
- | Pentru a încărca tema, urmăriți pașii: | ||
- | - Creați o arhivă zip (nu rar, ace, 7zip sau alt format) care să conțină: | ||
- | * Fișierul Python busybox.py | ||
- | * Alte fișiere python adiacente de care aveti nevoie (daca e cazul) | ||
- | * fișierul Readme | ||
- | - Logați-vă pe vmchecker | ||
- | - Selectați cursul Systemes d'Explotation(FILS) | ||
- | - Selectați 2. Mini-BusyBox | ||
- | - Incărcați arhiva | ||
- | |||
- | Arhiva trebuie să conțină toate fișierele (principale) în rădăcina, nu în subdirectoare. NU arhivați directorul temei, arhivați DIRECT fișierele. | ||
- | După ce încărcați arhiva, vmchecker va rula: | ||
- | <code bash> | ||
- | unzip archive.zip homework | ||
- | cd homework | ||
- | python3 busybox.py comanda parametrii | ||
- | </code> | ||
- | |||