Tema 2 - Mini-busybox

Informații generale

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

  • Folosirea limbajului Python
  • Modul de funcționare a liniei de comandă

Reguli

  1. Tema trebuie să conțină un fișier Readme în care să explicați cum ații făcut tema (-0.1p).
  2. 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).
    • -n nu adaugă o linie nouă la final

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).
    • -s, --symbolic creează un link simbolic în locul unui link hard

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).
    • -R, -r, --recursive copiază recursiv; se folosește pentru copierea directoarelor și copiază directorul cu tot conținutul acestuia

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.
  • 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.

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:

  1. 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
  2. Logați-vă pe vmchecker
  3. Selectați cursul Systemes d'Explotation(FILS)
  4. Selectați 2. Mini-BusyBox
  5. 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
sde/teme/tema_ro_2_busybox.txt · Last modified: 2020/03/14 13:53 by ioana_maria.culic
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0