This shows you the differences between two versions of the page.
uso-ac:teme:tema-2 [2016/11/18 00:00] tiberiu.barbu [Cunoștințe evaluate] |
uso-ac:teme:tema-2 [2017/11/05 16:03] (current) maria.mihailescu [Task 05 (15p)] |
||
---|---|---|---|
Line 12: | Line 12: | ||
**Actualizări.** Urmăriți atât forumul cât și modificările aduse enunțului/checker-ului, modificări ce sunt publicate și explicate în paragrafele de mai jos. | **Actualizări.** Urmăriți atât forumul cât și modificările aduse enunțului/checker-ului, modificări ce sunt publicate și explicate în paragrafele de mai jos. | ||
- | **Regulament.** Înainte și în timpul realizării temei, vă rugăm să parcurgeți [[uso-ac:regulament#realizarea_temelor|indicațiile legate de realizarea temelor]], încluzând ce înseamnă o temă copiată și cum penalizăm temele copiate. Folosiți cu încredere forumurile de pe [[http://cs.curs.pub.ro/|cs.curs.pub.ro]] pentru întrebări și neclarități legate de teme. | + | **Regulament.** Înainte și în timpul realizării temei, vă rugăm să parcurgeți [[uso:regulament#realizarea_temelor|indicațiile legate de realizarea temelor]], încluzând ce înseamnă o temă copiată și cum penalizăm temele copiate. Folosiți cu încredere forumurile de pe [[http://cs.curs.pub.ro/|cs.curs.pub.ro]] pentru întrebări și neclarități legate de teme. |
- | **Întrebări frecvente.** În timpul realizării temei, când vă loviți de probleme și aveți nevoie de suportul echipei de USO, parcurgeți și lista de [[uso-ac:teme:intrebari-frecvente|întrebări frecvente întâlnite în cadrul temelor]]. Să țineți cont, va rugăm, și de [[uso-ac:regulament#recomandari_de_comunicare_electronica|recomandările de comunicare electronică]]. | + | **Întrebări frecvente.** În timpul realizării temei, când vă loviți de probleme și aveți nevoie de suportul echipei de USO, parcurgeți și lista de [[uso:teme:intrebari-frecvente|întrebări frecvente întâlnite în cadrul temelor]]. Să țineți cont, va rugăm, și de [[uso:regulament#recomandari_de_comunicare_electronica|recomandările de comunicare electronică]]. |
**Ajutor reciproc.** Vă încurajăm ca atunci când găsiți soluția la o problemă pe care ați postat-o anterior pe forum să postați și soluția găsită. De asemenea dacă știți răspunsul la întrebările colegilor sunteți încurajați să le răspundeți. | **Ajutor reciproc.** Vă încurajăm ca atunci când găsiți soluția la o problemă pe care ați postat-o anterior pe forum să postați și soluția găsită. De asemenea dacă știți răspunsul la întrebările colegilor sunteți încurajați să le răspundeți. | ||
Line 22: | Line 22: | ||
<note important> | <note important> | ||
- | Deadline: **24 Noiembrie, ora 23:55**\\ | + | Deadline: **9 Noiembrie 2017, ora 23:55**\\ |
Timp de lucru: **7 zile**\\ | Timp de lucru: **7 zile**\\ | ||
- | Punctaj: **0.6 puncte** din nota finală\\ | + | Punctaj: **0.8 puncte** din nota finală\\ |
- | Formular pentru trimitere temă: https://goo.gl/sQTKUl\\ | + | Formular pentru trimitere temă: [[ https://docs.google.com/forms/d/1comyo1UridI_FG-HqVlgJRq3q5VKHvNlzEh11iV0GvI | Formular submitere ]] |
</note> | </note> | ||
<note> | <note> | ||
**Actualizări enunț:** | **Actualizări enunț:** | ||
- | * Nu există | + | * 3 Noiembrie 2017: Am adăugat clarificări în enunț legate de structura de directoare cerute. |
**Actualizări utilitar ''uso'': <color red>versiunea v16 - "Gold Blackbird"</color>** | **Actualizări utilitar ''uso'': <color red>versiunea v16 - "Gold Blackbird"</color>** | ||
* Nu există | * Nu există | ||
- | **Actualizări checker: <color red>versiunea 13</color>** | + | **Actualizări checker: <color red>versiunea 3</color>** |
- | * Nu există | + | * 4 Noiembrie 2017: versiunea 2: Task 2: Am corectat mesajul de eroare în cazul în care directorul koffing nu are owner-ul cerut. |
+ | * 5 Noiembrie 2017: versiunea 3: Am actualizat checker-ul pentru task05. Se primeau puncte și pentru anumite rezolvări greșite. | ||
</note> | </note> | ||
+ | |||
===== Cunoștințe evaluate ===== | ===== Cunoștințe evaluate ===== | ||
Line 43: | Line 45: | ||
* folosirea corectă a redirectării | * folosirea corectă a redirectării | ||
* înlănțuiri de comenzi și comunicare eficientă interprocese | * înlănțuiri de comenzi și comunicare eficientă interprocese | ||
- | * noțiuni simple de scripturi Bash | + | * noțiuni <del>simple</del> de scripturi Bash (în urma feedback-ului, nu sunt simple) |
* suport agregat: | * suport agregat: | ||
* [[http://books.google.ro/books?id=_JFGzyRxQGcC|cartea de USO]], capitolele: 3, 4, 5, 10.2, 10.3 (paragraful sudo), 12.1, 12.2, 12.6, 12.7 | * [[http://books.google.ro/books?id=_JFGzyRxQGcC|cartea de USO]], capitolele: 3, 4, 5, 10.2, 10.3 (paragraful sudo), 12.1, 12.2, 12.6, 12.7 | ||
* cursurile și laboratoarele: 4, 5, 6 | * cursurile și laboratoarele: 4, 5, 6 | ||
- | * cheatsheet [[uso-ac:resurse:bashcheatsheet|bash]], [[uso-ac:resurse:cheatsheet|laborator]] și [[uso-ac:resurse:folosire-vim|vim]] | + | * cheatsheet [[uso:resurse:bashcheatsheet|bash]], [[uso:resurse:cheatsheet|laborator]] și [[uso:resurse:folosire-vim|vim]] |
- | * [[instructiuni-checker|Instrucțiuni checker]] și [[uso-ac:resurse:mv|Mașină virtuală]] | + | * [[instructiuni-checker|Instrucțiuni checker]] și [[uso:resurse:mv|Mașină virtuală]] |
* [[https://www.google.ro/|Google, your best friend when things stick in the mud]] | * [[https://www.google.ro/|Google, your best friend when things stick in the mud]] | ||
- | * se recomandă citirea cu atenție a întregului enunț înainte de rezolvarea task-urilor | + | * se recomandă citirea cu atenție a întregului enunț înainte de rezolvarea task-urilor |
===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ||
Line 56: | Line 58: | ||
{{section>uso:teme:testare&noheader&nofooter}} | {{section>uso:teme:testare&noheader&nofooter}} | ||
- | <note warning>Este interzisă publicarea pe forum a comenzilor sau pozelor care fac parte din rezolvarea parțială sau integrală a temei ori a unui task. Puteți să sugerați diferite abordări sau să dați idei generale (dar nu comenzi) celorlalți. Urmăriți [[uso-ac:regulament#realizarea_temelor|indicațiile legate de realizarea temelor]]. La prima abatere studentul primește un avertisment, iar punctajul obținut pe temă îi este redus cu valoarea punctajului pe task-ul respectiv. Începând cu a doua abatere, se va anula întregul punctaj pe tema curentă. Temele anterioare sau cele viitoare nu vor fi afectate. Abaterile se păstrează pe parcursul semestrului. Ori de câte ori se încalcă această regulă, se va ține cont de istoricul abaterilor. Abaterile vor fi actualizate în catalog.</note> | + | <note warning>Este interzisă publicarea pe forum a comenzilor sau pozelor care fac parte din rezolvarea parțială sau integrală a temei ori a unui task. Puteți să sugerați diferite abordări sau să dați idei generale (dar nu comenzi) celorlalți. Urmăriți [[uso:regulament#realizarea_temelor|indicațiile legate de realizarea temelor]]. La prima abatere studentul primește un avertisment, iar punctajul obținut pe temă îi este redus cu valoarea punctajului pe task-ul respectiv. Începând cu a doua abatere, se va anula întregul punctaj pe tema curentă. Temele anterioare sau cele viitoare nu vor fi afectate. Abaterile se păstrează pe parcursul semestrului. Ori de câte ori se încalcă această regulă, se va ține cont de istoricul abaterilor. Abaterile vor fi actualizate în catalog.</note> |
- | <hidden> | + | <note important> |
+ | Pentru fiecare task pentru care se cere ca rezolvarea să se realizeze într-o anumită cale, dacă acea cale nu există, atunci aceasta trebuie creată. | ||
+ | |||
+ | Checker-ul nu generează structurile de directoare cerute. | ||
+ | </note> | ||
+ | ==== Task 01 (15p) ==== | ||
+ | |||
+ | Vă aflați în folderul ''/home/student/tema02/task01''. | ||
+ | |||
+ | Creați un script numit ''task01.sh''. Scriptul primește două argumente: | ||
+ | * argumentul 1 reprezintă numele unui script ce va fi creat din interiorul scriptului ''task01.sh'' | ||
+ | * argumentul 2 reprezintă calea către directorul în care va fi creat noul script. | ||
+ | |||
+ | Setați două variabile locale: ''MY_FILE'' și ''MY_PATH'' care să reprezinte primul și, respectiv, al doilea parametru al scriptului ''task01.sh''. | ||
+ | |||
+ | Din interiorul scriptului ''task01.sh'' trebuie scris un nou script cu numele indicat de ''MY_FILE'' și care să se afle în locația ''MY_PATH''. Se garantează faptul că MY_PATH este o cale validă existentă în sistemul de fișiere. | ||
+ | |||
+ | Scriptul ''MY_FILE'' trebuie să primească ca parametru un nume de utilizator și să afișeze procesele utilizatorului respectiv după următorul format: | ||
+ | ''process_name pid ppid username user_id group_id'' | ||
+ | |||
+ | Exemplu de folosire a scriptului ''task01.sh'': | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task01.sh file.sh . | ||
+ | [student@uso]$ sh file.sh student | ||
+ | CMD1 PID PPID USER UID GID | ||
+ | sshd 35911 35871 student 42596 9007 | ||
+ | bash 35912 35911 student 42596 9007 | ||
+ | sh 39465 35912 student 42596 9007 | ||
+ | ps 39466 39465 student 42596 9007 | ||
+ | </code> | ||
+ | |||
+ | <note tip> | ||
+ | Hint!\\ | ||
+ | * man bash, //builtin//\\ | ||
+ | * suport agregat în secțiunea [[#cunostinte_evaluate|Cunoștințe evaluate]] | ||
+ | * man ps | ||
+ | </note> | ||
==== Task 02 (25p) ==== | ==== Task 02 (25p) ==== | ||
Line 64: | Line 102: | ||
<note important> | <note important> | ||
Pentru acest task, nu există niciun utilizator sau grup deja existent în sistem. Acestea trebuie create acolo unde este cazul. | Pentru acest task, nu există niciun utilizator sau grup deja existent în sistem. Acestea trebuie create acolo unde este cazul. | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Următoarele subpuncte trebuie realizate în ordine pentru a primi punctajul pentru acest task. | ||
</note> | </note> | ||
Faceți următoarele modificări în sistem astfel încât să respectați cerințele de mai jos: | Faceți următoarele modificări în sistem astfel încât să respectați cerințele de mai jos: | ||
+ | |||
+ | * **[5p]** Să se adauge în sistem următorii utilizatori: | ||
+ | * ''ash'' | ||
+ | * ''misty'' | ||
+ | * ''brock'' | ||
+ | Utilizatorul ''ash'' trebuie să aibă parola ''gotta_catch_them_all''. Utilizatorul misty trebuie să aibă parola ''staryu'', iar utilizatorul brock trebuie să aibă parola ''onix''. | ||
+ | Utilizatorii ''misty'' și ''brock'' trebuie adăugați în grupul ''gym_leaders''. | ||
+ | Utilizatorul ''ash'' trebuie să aibă home-ul în ''/home/ash_very_best''. | ||
+ | * **[5p]** Să se adauge în sistem următorii utilizatori: | ||
+ | * ''jessie'' cu parola ''PrepareForTrouble'' | ||
+ | * ''james'' cu parola ''MakeItDouble'' | ||
+ | * ''meowth'' cu parola ''ThatsRight'' | ||
+ | Adăugați cei trei utilizatori (jessie, james și meowth) în grupul ''team_rocket'' | ||
+ | * **[5p]** Vă aflați în folder-ul ''/home/student/tema02/task02''. | ||
+ | * Creați următoarele fișiere goale: | ||
+ | * ''bulbasaur'' | ||
+ | * ''pikachu'' | ||
+ | * ''snorlax'' | ||
+ | * ''vulpix'' | ||
+ | * ''eevee'' | ||
+ | * Creți următoarele foldere goale: | ||
+ | * ''ekans'' | ||
+ | * ''koffing'' | ||
<note important> | <note important> | ||
+ | Atenție! Fișierele de mai sus trebuie create de către utilizatorul ''student''. | ||
+ | </note> | ||
+ | * **[5p]** Realizați următoarele modificări: | ||
+ | * fișierele ''bulbasaur'', ''pikachu'' și ''snorlax'' vor avea: | ||
+ | * ca proprietar utilizatorul ''ash'' care are toate drepturile asupra celor 3 fișiere | ||
+ | * ca grup proprietar grupul ''gym_leaders'' care poate doar citi și scrie în și din aceste fișiere | ||
+ | * restul utilizatorilor vor putea doar să citească | ||
+ | * fișierele ''vulpix'' și ''eevee'' vor avea: | ||
+ | * ca proprietar utilizatorul ''root'' care are drepturi de citire și de scriere asupra celor două fișiere | ||
+ | * ca grup proprietar grupul ''specials'' care are drepturi de citire | ||
+ | * restul utilizatorilor vor putea doar să citească cele două fișiere | ||
+ | * folderul ''ekans'' aparține utilizatorului ''jessie'' și grupului ''team_rocket'' | ||
+ | * folderul ''koffing'' aparține utilizatorului ''james'' și grupului ''team_rocket'' | ||
+ | * Cele două foldere: ''ekans'' și ''koffing'' pot fi modificate doar de către utilizatorii proprietari sau de către utilizatorii din grupul ''team_rocket''. Toți utilizatorii pot să le citească și să le parcurgă conținutul. | ||
- | Grupul ''ceo'' nu trebuie să existe în sistem la sfârșitul acestui task. | + | <note important> |
+ | Atenție! Grupul “specials” trebuie adăugat în sistem. | ||
</note> | </note> | ||
- | * **[4p]** Adăugați utilizatorul ''student'' la grupul suplimentar ''qa''. | ||
- | * **[5p]** Adăugați în sistem utilizatorul ''ceo'' aparținând grupurilor ''board'' (grup primar) și ''finance'' astfel încât directorul home să fie ''/home/company/''. | ||
- | * **[4p]** Modificați grupul deținător al directorului ''/home/company/'' în ''board'' (directorul trebuie să existe în prealabil). | ||
- | * **[4p]** Creați directorul ''/home/company/etaj2/'' astfel încât utilizatorul deținător al acestuia va fi ''vp'' iar grupul deținător va fi ''board''. | ||
- | * **[4p]** Modificați permisiunile directorului ''/home/company/'' astfel încât toți utilizatorii sistemului să poată citi, scrie și executa. | ||
- | * **[4p]** Creați fișierul ''/home/company/etaj3'' astfel încât: | ||
- | * utilizatorul ''employee'' să nu aibă niciun drept asupra fișierului | ||
- | * utilizatorii ''ceo'' și ''vp'' pot lansa în execuție fișierul | ||
- | * toți ceilalți utilizatori ai sistemului pot doar să citească și să scrie fișierul | ||
+ | ==== Task 03 (15p) ==== | ||
<note important> | <note important> | ||
- | În directorul ''/home/company/'' nu trebuie să existe alte fișiere sau directoare în afară de cele menționate în enunț. | + | Atenție! Pentru a putea rezolva acest exercițiu, trebuie să rezolvați în prealabil Exercițiul 2, subpunctele a și b. |
</note> | </note> | ||
- | ==== Task 03 (20p) ==== | ||
- | Faceți următoarele modificări în sistem astfel încât: | + | Realizați următoarele modificări asupra sistemului: |
- | * **[0p]** Utilizatorul ''manager'' să existe în sistem iar parola acestui utilizator trebuie să fie ''M@n4g3r''. | + | * **[5p]** Utilizatorul ''ash'' are drepturi depline asupra sistemului, însă poate executa ca utilizator privilegiat fără să i se ceară parola doar comenzile ''rev'' și ''tac''. |
- | * **[10p]** Utilizatorul ''manager'' să poată executa cu drept de ''sudo'' comenzile: ''ls'' și ''cat'', fără să îi fie cerută parola de la tastatură. | + | * **[5p]** Utilizatorul ''meowth'' să poată executa ca utilizator privilegiat comanda ''cat'' fără să i se ceară parola. |
- | * **[10p]** Pentru orice altă comandă în afară ce cele menționate la punctul anterior, utilizatorul ''manager'' nu va avea drept de ''sudo''. | + | * **[5p]** Utilizatorul ''james'' să poată să execute ca utilizator privilegiat comanda ''ls'' fără să i se ceară parola. |
==== Task 04 (20p) ==== | ==== Task 04 (20p) ==== | ||
- | Lucrați într-o companie de succes și aveți o funcție de analist financiar. Unul din task-urile voastre este să găsiți angajatul cu cel mai mic salariu care are cele mai bune rezultate profesionale, pe baza unor date deja existente. În același timp trebuie să vă asigurați că datele existente sunt valide și provin din surse sigure. În cazul în care datele sau sursele nu sunt corecte va trebui să comunicați acest lucru superiorului vostru prin-un mesaj. La final, șeful vostru vă va comunica rezultatul muncii printr-o promovare la funcția de analist programator dacă ați rezolvat cu succes acest task. Multă baftă! | + | Task 04 nu este obligatoriu pentru USO-AC. Pentru nota maxima este de ajuns sa se obtine 80/100 puncte pe checker. |
- | Din fericire, sunteți un bun utilizator al sistemului de operare Linux datorită studiului intens depus în facultate și doriți să vă ușurați această muncă. Pentru aceasta trebuie să creați scriptul ''/home/student/task4.sh'' care: | + | Din motive de infrastructura nu vom avea un checker diferit, se va ignora acest task. |
- | - Primește 2 argumente: | + | <hidden> |
- | - **[3p]** Scriptul trebuie să verifice că s-au primit exact 2 argumente. În caz contrar scriptul trebuie să iasă cu valoarea de retur ''4'' | + | Vă aflați în directorul ''/home/student/tema02/task04/''. |
- | - Primul argument reprezintă o cale către un director. În acel director se găsește un fișier ce conține date despre angajați, ''angajati.txt'' | + | <note important> |
- | - **[3p]** Dacă directorul nu există, atunci scriptul trebuie să iasă cu valoarea de retur ''5'' | + | Pentru realizarea și verificarea acestui task este nevoie de următorul fișier ISO: |
- | - **[5p]** Scriptul trebuie să verifice că primul argument primit este o cale absolută ce nu se află în afara directorului ''/home/student/task4/''. În caz contrar scriptul trebuie să iasă cu valoare de retur ''6'' | + | <code bash> |
- | - **[3p]** Dacă fișierul nu există, atunci scriptul trebuie să iasă cu valoarea de retur ''7'' | + | [student@uso]$ wget https://github.com/systems-cs-pub-ro/uso/raw/master/tema2/task04_uso.iso |
- | - Al doilea argument reprezintă numele unui angajat din compania vostră | + | </code> |
- | - **[0p]** Caută în fișier, atât în lista primilor 10 de angajați cât și în lista ultimilor 10 angajați, toți angajații care au numele de familie identic cu numele primit ca al doilea argument | + | |
- | - **[0p]** Dintre acești angajați îl alege pe acela care are salariul cel mai mic | + | |
- | - **[0p]** Daca sunt mai mulți angajați care au același nume de familie și salarii egale atunci va trebui să îl găsiți pe acela care are cel mai mare scor de performanță | + | |
- | - **[5p]** După ce acest angajat a fost găsit, va trebui să afișați la ieșirea de eroare standard ID-ul acestui angajat. | + | |
- | - **[1p]** La final, scriptul trebuie să iasă cu valoarea de retur ''8'' | + | |
- | + | ||
- | <note warning>Toate sub-punctele sunt dependente de sub-punctele anterioare. În concluzie, nu se acordă punctaj pentru subpunctul ''1.b.I'' dacă sub-punctul ''1.a'' nu este funcțional, ș.a.m.d. Această regulă este valabilă pentru orice sub-punct al acestui exercițiu. | + | |
</note> | </note> | ||
+ | Să se realizeze un script numit ''task04.sh'' care primește ca argument adresa unui fișier ISO și o cale către un director și realizează următoarele verificări: | ||
+ | * a) **[2p]** Dacă scriptul nu are fix două argumente, atunci se afișează următorul mesaj și se iese cu codul de eroare 1. | ||
+ | Exemplul 1: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh | ||
+ | Usage: sh task04.sh <path_to_iso_file> <path_to_dir> | ||
+ | </code> | ||
+ | |||
+ | Exemplul 2: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh ../file.iso ../iso_folder student | ||
+ | Usage: sh task04.sh <path_to_iso_file> <path_to_dir> | ||
+ | </code> | ||
+ | |||
+ | Exemplul 3: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh ../task04/task04.sh ../file.iso ../iso_folder student | ||
+ | Usage: sh task04.sh <path_to_iso_file> <path_to_dir> | ||
+ | </code> | ||
+ | |||
+ | * b) **[2p]** Scriptul verifică dacă fișierul dat ca argument este de tipul ISO. Dacă nu, atunci se afișează următorul mesaj și se întoarce codul de eroare 2. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | file1.iso is not an ISO file | ||
+ | </code> | ||
+ | * c) **[2p]** Se verifică dacă există folderul dat ca argument scriptului. Dacă folderul există și este de tip directory, se afișează următorul mesaj și întoarce codul de eroare 3. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | iso_dir already exists | ||
+ | </code> | ||
+ | * d) **[2p]** Dacă folderul există și este de tip regular file, se afișează următorul mesaj și se întoarce codul de eroare 4. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | iso_dir is not a directory; it’s a regular file | ||
+ | </code> | ||
+ | * e) **[1p]** Dacă folderul există și este de tip char device, se afișează următorul mesaj și se întoarce codul de eroare 5. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | iso_dir is not a directory; it’s a char device | ||
+ | </code> | ||
+ | * f) **[1p]** Dacă folderul există și este de tip block device, se afișează următorul mesaj și se întoarce codul de eroare 6. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | iso_dir is not a directory; it’s a block device | ||
+ | </code> | ||
+ | * g) **[1p]** Dacă folderul există și este de tip symbolic link, se afișează următorul mesaj și se întoarce codul de eroare 7. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | iso_dir is not a directory; it’s a symlink | ||
+ | </code> | ||
+ | * h) **[1p]** Se crează folderul indicat de al doilea argument. Dacă operația nu se realizează cu succes, se afișează mesajul următor și se întoarce codul de eroare 8. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso /iso_dir | ||
+ | Cannot create /iso_dir. | ||
+ | </code> | ||
+ | * i) **[2p]** Se montează fișierul ISO primit ca prim argument în folderul dat ca al doilea argument. Dacă procesul eșuează, atunci se afișează următorul mesaj și se întoarce codul de eroare 9. | ||
+ | Exemplu: | ||
+ | <code bash> | ||
+ | [student@uso]$ sh task04.sh file.iso iso_dir | ||
+ | Cannot mount file.iso in iso_dir | ||
+ | </code> | ||
+ | * j) **[2p]** Se caută toate fișierele de configurare (.conf) din folderul în care a fost montat fișierul .iso. Căile către aceste fișiere, [căile absolute] se scriu în fișierul ''/home/student/tema02/task04/iso_conf_files.txt'', câte unul pe linie. | ||
<note important> | <note important> | ||
- | Formatul fișierului ce conține date despre angajați este urmatorul: | + | Atenție! Nu se vor trece în fișierul |
- | <code>ID_ANGAJAT\NUME\PRENUME\SALARIU_ANGAJAT\SCOR_PERFORMANȚĂ</code> | + | /home/student/tema02/task04/iso_conf_files.txt fișierele goale (cu dimensiune 0). |
+ | </note> | ||
+ | * k) **[2p]** Se caută fișierele module kernel .ko (kernel objects) cu dimensiunea mai mare decât 16 bytes din directorul în care s-a făcut mount la ISO. Rezultatele se trec în fișierul ''/home/student/tema02/task04/iso_ko_files.txt'', câte unul pe linie. | ||
+ | La începutul fișierului se adaugă o linie care conține numărul de module kernel găsite care respectă constrângerile de mai sus urmată de o linie goală. | ||
- | Un exemplu de fișier găsiți la adresa:\\ | + | Exemplu de fişier: |
- | https://elf.cs.pub.ro/~uso/res/teme/tema2_task4_sample.txt | + | <code bash> |
- | </note> | + | [student@uso]$ cat iso_conf_files.txt |
+ | 4 | ||
+ | |||
+ | ./resolv.ko | ||
+ | ./boot/kernel.ko | ||
+ | </code> | ||
+ | * l) **[2p]** La sfârșit, scriptul trebuie să iasă cu codul de eroare 42. | ||
+ | |||
+ | <note warning>Toate sub-punctele sunt dependente de sub-punctele anterioare. În concluzie, nu se acordă punctaj pentru subpunctul ''1.b.I'' dacă sub-punctul ''1.a'' nu este funcțional, ș.a.m.d. Această regulă este valabilă pentru orice sub-punct al acestui exercițiu. | ||
+ | </note> | ||
<note> | <note> | ||
Codurile de retur pe care trebuie să le returneze scriptul vostru: | Codurile de retur pe care trebuie să le returneze scriptul vostru: | ||
- | * 4 - dacă scriptul nu primește 2 argumente | + | * 1 - dacă scriptul nu primește 2 argumente |
- | * 5 - dacă directorul primit ca prim argument nu există | + | * 2 - dacă fișierul dat ca prim argument nu este de tip ISO |
- | * 6 - dacă directorul primit ca prim argument nu este o cale absolută ce se află în directorului ''/home/student/task4/'' | + | * 3 - dacă folderul dat ca al doilea argument există și este de tip directory |
- | * 7 - dacă fișierul ''angajati.txt'' nu se găsește în directorul primit ca al doilea argument | + | * 4 - dacă fișierul dat ca al doilea argument există și este de tip regular file |
- | * 8 - dacă nu a avut loc nicio eroare | + | * 5 - dacă fișierul dat ca al doilea argument există și este de tip char device |
+ | * 6 - dacă fișierul dat ca al doilea argument există și este de tip block device | ||
+ | * 7 - dacă fișierul dat ca al doilea argument există și este de tip soft link | ||
+ | * 8 - dacă operația de creare a folderului indicat de către al doilea argument al scriptului a eșuat | ||
+ | * 9 - dacă operația de mount a fișierului iso eșuează | ||
+ | * 42 - dacă scriptul se termină cu succes | ||
</note> | </note> | ||
- | ==== Task 05 (20p) ==== | + | <note warning> |
+ | Atenție! Scriptul trebuie să funcționeze pentru orice structură de fișiere. Scripturile cu valori hardcodate **NU** vor fi punctate. | ||
+ | </note> | ||
<note important> | <note important> | ||
- | Pentru rezolvarea acestui task aveți nevoie de arhiva următoare: | + | Atenție: Se garantează că al doilea argument nu va fi un socket unix sau named pipe |
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Hint: | ||
+ | * man test | ||
+ | * man find (căutaţi după size) | ||
- | https://elf.cs.pub.ro/~uso/res/teme/tema2_task5_partition.tgz | ||
</note> | </note> | ||
+ | </hidden> | ||
+ | ==== Task 05 (15p) ==== | ||
- | Dezarhivați arhiva ''partition.tar.gz''. În urma dezarhivării va rezulta un fișier cu numele ''partition'' având dimensiunea de 10MB. Vrem să folosim fișierul ''partition'' ca suport pentru un sistem de fișiere pe care îl vom monta ulterior ca dispozitiv ce simuleaza o partiție a sistemului de operare. În cazul nostru, partiția rezultată va avea alocat un spațiu de 10MB. | + | <note tip> |
+ | Pentru început rulați comenzile în terminal și spargeți task-ul pe bucăți. Apoi încercați să puneți cap la cap comenzile utile care rezolvă task-ul. | ||
+ | </note> | ||
- | <note> | + | <note important> |
- | Este util să folosim fișiere ca suport pentru un sistem de fișiere atunci când nu avem la dispoziție dispozitive fizice și dorim experimentarea de noi sisteme de fișiere, fără să fie nevoie să repatiționăm discul pe care este instalat sistemul nostru de operare. | + | Pentru realizarea și verificarea acestui task este nevoie de următoarea arhivă: |
+ | <code bash> | ||
+ | [student@uso]$ wget https://github.com/systems-cs-pub-ro/uso/raw/master/tema2/task05_files.tar | ||
+ | </code> | ||
</note> | </note> | ||
- | * Fișierul ''partition'' trebuie să se găsească în directorul ''/home/student/tema2/'' | + | Vă aflați în directorul ''/home/student/tema02/task05/''. |
- | * **[6p]** Creați un sistem de fișiere de tip ''ext3'' pe fișierul ''partition'' | + | |
- | * **[7p]** Montați partiția ''partition'' în directorul ''/home/student/tema2/mnt/'' (acest director trebuie să existe mai întâi), apoi creați pe această partiție un fișier gol ce va avea numele ''homework.txt'' | + | |
- | * Atenție! Partiția nu se găsește pe un dispozitiv fizic ci într-un fișier. Pentru acest lucru aveți nevoie de un parametru special pe care îl transmiteți comenzii ce va fi folosită pentru montarea partiției. | + | |
- | * De asemnea, pentru a putea crea fișierul ''homework.txt'', partiția trebuie să fie montată cu drepturi de scriere. | + | |
- | * După ce ați creat fișierul, demontați partiția pentru a salva modificările efectuate. | + | |
- | * **[7p]** Montați din nou partiția ''partition'' în directorul ''/home/student/tema2/mnt/'', dar de data aceasta fără drepturi de scriere. Partiția trebuie sa poată fi doar citită | + | |
- | ==== Task 06 (15p) ==== | + | Dezarhivați arhiva ''task05_files.tar.gz''. |
- | <note tip> | + | <note important> |
- | Pentru început rulați comenzile în terminal și spargeți task-ul pe bucăți. Apoi încercați să puneți cap la cap comenzile utile care rezolvă task-ul. | + | Atenție! Fiecare fișier aflat în folder conține câte un cuvânt pe linie. |
</note> | </note> | ||
- | Scrieți one-liner-ul la calea ''/home/student/tema2/oneliner.sh'', care realizează următoarele acțiuni: | + | Fiind dată ierarhia de fișiere din folderul ''/home/student/tema02/task05/task05_files'' obținut în urma dezarhivării, să se realizeze un script oneliner numit ''oneliner.sh'' care afișează cuvintele unice și sortate descrescător (invers alfabetic) din fișierele care conțin în denumirea lor grupul ''.gr'' urmat de o cifră mai mare sau egală cu 6 și de către caracterele ''b.'' între liniile 5 și %%$EOF%% (end of file) din fiecare fișier și din fișierele care conțin în denumirea lor grupul ''.gr8b.'' în primele 3 linii ale fiecărui fișier. |
- | * verifică dacă fișierul ''oneliner.txt'' există în directorul părinte al directorului în care se află scriptul ''oneliner.sh'' (rețineți faptul că scriptul ''oneliner.sh'' poate fi rulat și din alt director din sistem, folosind o cale atât relativă cât și absolută pentru rularea sa) | + | Atenție! Printre cuvinte obținute nu trebuie să se afle următoarele cuvinte: ''password'', ''123456'', ''abcd'', ''passw0rd'', ''qwerty''. |
- | * dacă fișierul ''oneliner.txt'' există la calea specificată, atunci scriptul (one-liner) va adăuga la sfârșitul acestuia numărul total al descriptorilor de fișier cu indicele ''2'', al tuturor proceselor care ruleaza în sistem la momentul execuției | + | |
- | * dacă fișierul ''oneliner.txt'' nu există la calea specificată, scriptul (one-liner) va trebui să-l creeze și să adauge în fișier __doar 2 linii__: | + | Cuvintele trebuie să se afle câte unul pe linie și să fie scrise în fișierul ''/home/student/tema02/task05/uniques.txt''. |
- | * pe prima linie șirul de caractere ''errors:'' | + | |
- | * pe a doua linie șirul de caractere ''file not found'' | + | Atenție! Scriptul nu va fi rulat doar din ''/home/student/tema02/task05/''. |
- | * **Hint!** ''man echo'' | + | |
+ | <note important> | ||
+ | Prin cuvinte unice nu se înțelege cuvinte care apar o singură dată într-un singur fișier, ci se dorește ca în fișierul final să nu existe duplicate. | ||
+ | </note> | ||
+ | |||
+ | <note warning> | ||
+ | Atenție! Scriptul trebuie să funcționeze pentru orice număr de fișiere. Scripturile cu valori hardcodate **NU** vor fi punctate. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | Hint: | ||
+ | * tail cu mai multe fișiere ca argument | ||
+ | * redirectare | ||
+ | </note> | ||
<note warning> | <note warning> | ||
Scriptul nu trebuie să conțină instrucțiuni de decizie, interne Bash, precum ''test'' sau ''if'' și nici instrucțiuni repetitive precum ''for'' sau ''while'', ultimele trei nefiind studiate până la acest moment. De asemenea, comenzile unui oneliner nu sunt separate de caracterul '';'' (punct și virgulă). Altfel, acestea pot fi la fel de bine scrise una sub alta, lucru care degradeaza noțiunea de ''oneliner''. | Scriptul nu trebuie să conțină instrucțiuni de decizie, interne Bash, precum ''test'' sau ''if'' și nici instrucțiuni repetitive precum ''for'' sau ''while'', ultimele trei nefiind studiate până la acest moment. De asemenea, comenzile unui oneliner nu sunt separate de caracterul '';'' (punct și virgulă). Altfel, acestea pot fi la fel de bine scrise una sub alta, lucru care degradeaza noțiunea de ''oneliner''. | ||
</note> | </note> | ||
+ | |||
+ | <note> | ||
+ | Constrângerile impuse pentru acest task: | ||
+ | - ''oneliner.sh'' să fie un script de tip oneliner | ||
+ | - ''uniques.txt'' trebuie: | ||
+ | - să conțină câte un cuvânt pe linie | ||
+ | - să conțină cuvintele unice sortate descrescător din: | ||
+ | - fișierele care conțin grupul ''.gr'' urmat de o cifră mai mare sau egal ca 6 și de grupul ''b.''. Pentru aceste fișiere se vor ignora primele 4 linii. | ||
+ | - fișierele care conțin grupul ''.gr8b.''. Pentru aceste fișiere se vor considera doar primele 3 linii ale acestora. | ||
+ | - să nu conțină cuvintele: ''password'', ''123456'', ''abcd'', ''passw0rd'', ''qwerty''. | ||
+ | - să fie generat de către script | ||
+ | - ''oneliner.sh'' să nu conțină: '';'', instrucțiuni ''for'', ''while'', ''test'' sau ''if''. | ||
+ | - ''oneliner.sh'' să funcționeze pentru orice număr de fișiere. Scripturile cu valori hardcodate **NU** vor fi punctate. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | ==== Task 06 (10p) ==== | ||
+ | Vă aflați în directorul ''/home/student/tema02/task06''. | ||
+ | * **[1p]** Creați un fișier numit ''filesys.bin'' cu dimensiunea de 10MB | ||
+ | * **[1p]** Modificați fișierul astfel încât acesta să conțină un sistem de fișiere de tip ''ext2''. | ||
+ | * **[8p]** Creați un director numit ''mymnt'' în care faceți mount sistemului de fișere creat la subpunctul anterior. În sistemul de fișiere adăugați următoarea structură de fișiere: | ||
+ | * în rădăcina sistemului de fișiere de tip ''ext2'' adăugați directoarele ''dir0'' și ''dir1''. | ||
+ | * în directorul ''dir0'' adăugați un fișier numit ''file0'' | ||
+ | * în directorul ''dir1'' adăugați un link simbolic către fișierul ''file0'' creat anterior, iar link-ul simbolic să se numească ''file1'' (''file1'' trebuie să fie link simbolic relativ la ''file0'' - folosiți căi relative). | ||
+ | * Demontați sistemul de fișiere ''filesys.bin''. | ||
+ | |||
+ | <note> | ||
+ | Este util să folosim fișiere ca suport pentru un sistem de fișiere atunci când nu avem la dispoziție dispozitive fizice și dorim experimentarea de noi sisteme de fișiere, fără să fie nevoie să repartiționăm discul pe care este instalat sistemul nostru de operare. | ||
+ | </note> | ||
+ | |||
===== Task obligatoriu pentru toate temele (0p) ===== | ===== Task obligatoriu pentru toate temele (0p) ===== | ||
Asigurați-vă că ați submis tema și ați încărcat codul aferent submisiei în formularul din secțiunea de [[#informatii_generale|Informații generale]]. Acest lucru este necesar ori de câte ori modificați tema și o submiteți din nou (detalii [[uso:teme:instructiuni-checker#pasi|aici]]), până la termenul limită. În caz contrar, punctajul aferent temei va fi nul (0 puncte). | Asigurați-vă că ați submis tema și ați încărcat codul aferent submisiei în formularul din secțiunea de [[#informatii_generale|Informații generale]]. Acest lucru este necesar ori de câte ori modificați tema și o submiteți din nou (detalii [[uso:teme:instructiuni-checker#pasi|aici]]), până la termenul limită. În caz contrar, punctajul aferent temei va fi nul (0 puncte). | ||
- | </hidden> |