This is an old revision of the document!
Tema 2 - Mini-busybox
Deadline:
15 Martie, ora 23:55
Punctaj:
1 punct din notă
Încărcarea temei:
vmchecker.cs.pub.ro
Încărcarea cu întârziere:
1 punct / zi (maxim 4 zile)
Cunoștințe evaluate
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
os). Orice alte implementări vor duce la anularea temei
(0 puncte).
Folosiți doar biblioteca Python
os, nu biblioteca Python posix.
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 repository cu titlul de forma [busybox] <titlul întrebări voastre>. Aveți nevoie de un cont de github pentru a scrie întrebări.
NU PUBLICAȚI COD SURSĂ. Acesta va fi considerată copiere și se va penaliza cu 0 puncte pe temă pentru voi.
Dacă doriți să primiți un email când se pun întrebări noi sau cand apar răspunsuri, accesați github 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:
python busybox.py cp file folder
Programul va fi rulat folosind Python 3.
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.
Datorita unor incompatibilitati intre sistemul Linux si alte sisteme, codul de eroare intors afisat de terminalul Linux va fi egal cu 255, nu cu -1. Daca terminalul afiseaza 255 ca si cod de eroare, rezolvarea este corecta.
Acest lucru se va intampla si cu codurile de eroare specificate mai jos, pentru fiecare din ele, terminalul va afisa un numar pozitiv.
Î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.
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.
Comenzile suportate de aplicația mini-busybox sunt:
Exemplu:
$ python busybox.py pwd
/home/pi/my_directories
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 (in terminal se va afisa valoarea 246).
Exemplu:
$ python busybox.py echo a b c
a b c
$ python busybox.py echo -n a b c
a b c$
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 (in terminal se va afisa valoarea 236).
Exemplu:
$ 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
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 (in terminal se va afisa valoarea 226) (
https://linux.die.net/man/1/mkdir)
Exemplu:
python busybox.py mkdir my_drectory
python busybox.py mkdir my_drectory1 my_drectory2 my_drectory3
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 (in terminal se va afisa valoarea 216).
Exemplu:
python busybox.py mv my_file my_directory
python busybox.py mv my_directory1 my_drectory2
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 (in terminal se va afisa valoarea 206).
Exemplu:
python busybox.py ln my_file my_file_link
python busybox.py ln -s my_file my_file_link3
rmdir directoare - Șterge directoarele goale pasate ca parametru (
https://linux.die.net/man/1/rmdir). In caz de eroare intoarce valoarea -60 (in terminal se va afisa valoarea 196).
Exemplu:
python busybox.py rmdir my_empty_directory
python busybox.py rmdir my_empty_directory1 my_empty_directory2
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 (in terminal se va afisa valoarea 186). (
https://linux.die.net/man/1/rm)
-r, -R, --recursive șterge directoarele și tot conținutul acestora
-d, --dir șterge directoarele goale
Exemplu:
python busybox.py rm my_file1 my_file2
python busybox.py rm -R my_directory
python busybox.py rm --dir my_empty_directory
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(in terminal se va afisa valoarea 176). (
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:
$ python busybox.py ls
directory1
Directory2
File1
file2
$ python busybox.py ls -a
.
..
directory1
Directory2
File1
File2
$ python busybox.py ls Directory2
f1
f2
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 (in terminal se va afisa valoarea 166).
Exemplu:
python busybox.py cp my_file my_directory
python busybox.py cp -r my_directory1 my_directory2
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 (in terminal se va afisa valoarea 156).
-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:
python busybox.py touch my_file
python busybox.py touch -a --no-create my_file
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 (in terminal se va afisa valoarea 231).
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:
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
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.
-
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.
Folosiți doar biblioteca Python os, nu biblioteca Python posix.
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ă:
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:
unzip archive.zip homework
cd homework
python3 busybox.py comanda parametrii