Table of Contents

Tema 3

Ce trebuie să știu? Studiați secțiunea de Cunoștințe evaluate și suportul agregat necesar temei. Nu contactaţi responsabilii de temă pe mail privat decât dacă aceştia vă cer explicit (e.g. pentru debugging local, vizualizarea unor comenzi din rezolvare) Pentru orice fel de întrebare vă rugăm folositi forumul!

Thread nou? Nu. Pentru o ușoară parcurgere a mesajelor, folosiți thread-urile de discuții existente în cadrul forumului, fără a crea altele. În consecință, thread-urile (subiectele de discuții) nou create vor fi șterse.

Căutare. Căutați pe forum informația pe care doriți să o obțineți, înainte să puneți o întrebare. De cele mai multe ori, cineva a mai întrebat același lucru. În fiecare thread al forumului aveți informații despre cum puteți căuta în forum.

Printscreen/poză? Nu. În cazul în care doriți să publicați un printscreen pe forum, recomandăm folosirea site-urilor pentru partajarea gratuită a imaginilor, precum imgur sau alternativele sale, publicând pe forum doar link către printscreen. Pozele inserate în răspunsuri, vor fi șterse. NU SE ACCEPTA POZE FACUTE CU TELEFONUL (se poate recurge la depunctări, sunt imposibil de urmărit).

Actualizări. Urmăriți în special forumul, în topic-urile dedicate taskurilor respective. Urmăriţi ş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 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 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 întrebări frecvente întâlnite în cadrul temelor. Să țineți cont, va rugăm, și de 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. Studenţii cu o atitudine pozitivă, activă şi care îşi ajută colegii pot fi răsplătiţi cu puncte karma sau un PIN USO.

Informații generale

Deadline: 19 Decembrie, ora 23:59
Timp de lucru: 17 zile
Punctaj: 0.5 puncte din nota temelor (se pot acoperi punctaje pierdute de la alte teme)

Actualizări enunț: versiunea 1.1 (4.12)

  • s-a actualizat enunțul pentru task 4

Actualizări checker: versiunea 1.1 (3.12)

  • s-a actualizat testul pentru task 4

Suportul necesar pentru realizarea temei

Testarea temei. Finalizarea temei. Mașină virtuală.

În rezolvarea temei va trebui să instalați un fișier cu parole. Să aveți grijă să îl ștergeți înainte să trimiteți tema.

Este interzisă publicarea pe forum a comenzilor sau pozelor care fac parte din rezolvarea parțială sau integrală a temei ori a unui task. Dacă e necesar acest lucru vă rog să contactaţi în privat responsabilii de temă, la specificarea explicită a acestora pe forum!

Aveţi voie, însă, să sugerați diferite abordări pe care mergeţi sau să dați idei generale (dar nu comenzi sau fişiere shell script) celorlalți chiar direct pe forum. Încurajăm clarificarea lucrurilor între studenţi atât timp cât nu sunt rezolvate cerinţele în mod direct.

Urmăriți 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.

Este interzis studenților să modifice parametrii de rulare ai mașinii virtuale. Orice tentativă malițioasă de modificare a fișierelor și executabilelor care fac mașina virtuală sa ruleze in parametrii optimi (fișierele si folderele ce nu țin de enunțul temei curente), ne conferă dreptul de a oferi 0 puncte pe temele respectivului student.

Cerințele temei

Task 00 - Pornirea temei (0p)

Pentru a putea începe tema, nu uitați să rulați comanda:

student@uso-teme:~$ sudo uso start 3

Pentru realizarea temei recomandăm folosirea SSH pentru terminal și pentru editorul de cod.

Tema trebuie realizată folosind doar scripturi bash, și nimic altceva (nu este permis să se apeleze dintr-un script bash un program scris în alt limbaj).

Tema poate să conțină doar scripturi bash și fișiere text.

Task 01 - Script User (15p)

Pentru acest task se va lucra exclusiv în directorul /home/student/tema3-task1

Înainte de a vă apuca, intrați in directorul acesta.

Scrieți un script bash script_user.sh care automatizează procesul de creare a unui utilizator nou în sistem, incluzând configurarea directorului home și logging-ul datelor.

Apelul scriptului trebuie să arate în felul următor:

sudo ./script_user.sh username password cale_director_copiat

a) Validarea argumentelor (3p)

Scriptul trebuie să verifice dacă argumentele primite sunt corecte. Scriptul trebuie să primescă 3 argumente la linia de comandă, parola trebuie să aiba minim 8 caractere, iar folderul specificat în argumentul 3 trebuie să fie existent.

Mesajele de eroare standard pentru neîntâlnirea uneia dintre cele 3 condiții:

1. “Eroare: Numar incorect de argumente”

2. “Eroare: Parola trebuie sa aiba minim 8 caractere”

3. “Eroare: Folderul <cale> nu exista”

b) Crearea utilizatorului (5p)

Scriptul trebuie să se ocupe de crearea utilizatorului (cu home directory și shell) și cu setarea parolei utilizatorului.

c) Copierea folderului în home (2p)

Scriptul trebuie să copieze corect în /home/username/ directorul dat ca al treilea argument.

d) Logging (5p)

Scriptul trebuie să extragă informații despre user din /etc/passwd și să pună datele pe câte o linie în fișierul user_info.log din /home/username

Scriptul trebuie rulat cu privilegii de root/sudo

Shell-ul implicit pentru utilizatorul nou trebuie să fie /bin/bash

Fișierul de log: /home/username/user_info.log

Formatul log-ului trebuie să conțină pe câte o linie: username, UID, GID, home directory, shell

Scriptul trebuie să gestioneze corect erorile și să se oprească imediat dacă o verificare eșuează

Task 02 - Animație (15p)

Pentru acest task se va lucra exclusiv în directorul /home/student/tema3-task2

Înainte de a vă apuca, intrați in directorul acesta.

Scrieți un script bash animatie.sh care ne arată cât timp s-a scurs din taskul pe care îl rulăm, în cazul nostru o să fie procese sleep.

Apelul scriptului trebuie să arate în felul următor:

./animatie.sh timp_total interval1 interval2 ...

a) Validarea argumentelor (3p)

Scriptul trebuie să verifice dacă argumentele primite sunt corecte. Scriptul trebuie să primescă măcar două argumente. Primul argument este timpul total al taskului, iar următoarele sunt durata intervalelor.

Mesajele de eroare standard pentru neîntâlnirea condiției:

1. “Numar gresit de argumente”, când sunt mai puțin de 2 argumente.

2. “Intervalele sunt prea mari”, când suma intervalelor este mai mare decât durata totală.

b) Rularea unui task întreg (7p)

Scriptul trebuie să citească intervalele, și să afișeze la finalul fiecăruia bara de progres actualizată. Durata intervalului este dată în secunde. Progresul este notat cu ”=”, iar timpul rămas este notat cu ”-”. Un exemplu de rulare a scriptului este următorul:

$ ./animatie.sh 5 2 1 2
[-----]
[==---]
[===--]
[=====]

c) Rularea unui task parțial (3p)

Scriptul trebuie să verifice dacă taskul s-a finalizat cu succes, sau dacă a dat crash. Dacă totalul intervalelor este mai mic decât timpul total atunci taskul nu a ajuns la final, și se afișează un mesaj. Un exemplu de rulare a scriptului în care procesul nu ajunge la final este următorul:

$ ./animatie.sh 5 2 1 1
[-----]
[==---]
[===--]
[====-]
Taskul a dat crash

d) Adaugarea codurilor de întoarcere (2p)

Scriptul trebuie să întoarcă un cod potrivit pentru execuția lui. Codurile de întoarcere sunt următoarele:

- Dacă taskul a fost rulat cu succes până la final, codul de întoarcere este 0.

- Dacă task a fost rulat cu succes, dar nu și-a terminat execuția, codul de întoarcere este numărul de secunde rămase.

- Dacă scriptul a primit un număr greșit de argumente, atunci codul de întoarcere este 1.

- Dacă suma intervalelor este mai mare decât timpul total, atunci codul de întoarcere este 2.

Task 03 - My Menu (15p)

Pentru acest task se va lucra exclusiv în directorul /home/student/tema3-task3

Înainte de a vă apuca, intrați in directorul acesta.

Task 04 - URLs (25p)

Pentru acest task se va lucra exclusiv în directorul /home/student/tema3-task4

Înainte de a vă apuca, intrați in directorul acesta.

Pentru acest task trebuie să descărcați fișierul urls.txt https://raw.githubusercontent.com/Raduta-Alexandru/uso-tema3-files/refs/heads/main/urls.txt

La taskul 4 trebuie să scrieți 2 scripturi. Primul script, numit extract_url.sh, ne filtrează URLuri, iar al doilea script, numit generate_mails.sh, ne generează mailuri pe baza rezultatului primului script.

Apelul scripturilor trebuie să arate în felul următor:

./extract_url.sh urls.txt
./generate_mails.sh correct_urls.txt

a) Extragerea URLurilor valide (12p)

Fișierul “urls.txt” conține multe URLuri pe care trebuie să le extrageți folosind scriptul extract_url.sh. Sunt 3 tipuri de URLuri care ne interesează:

URLuri Web (http://, https://)

URLuri de transfer (ftp://)

Adrese de mail formatate ca link (mailto:)

Scriptul trebuie să extragă din fișierul primit ca argument toate URLurile valide. Vom considera că un URL este valid dacă:

- Este compus din Protocol + Separator + Domeniu + Cale(Opțională)

- Protocoalele acceptate sunt cele precizate mai sus, unde le sunt precizate și separatoarele, mai exact ”//” pentru http, https și ftp, și ”:” pentru mailto.

- Domeniul poate să conțină litere mici sau mari, cifre, puncte și cratime. Domeniul trebuie să se termine cu un top level domain de minim 2 litere (ex: .ro, .com).

- Conține caracterul ”@” dacă e mail, și nu îl conține dacă nu e mail.

- Opțional poate să aibă și o cale. Calea este la final, după un /. Calea poate să conțină cifre, litere și caractere uzuale pentru cai (., _, ?, =, &, %, -). URLul poate să aibă o cale de maxim un nivel adâncime. În cazul în care are mai mult decât un nivel adâncime, se returnează URLul doar cu primul nivel ( exemplu: https://www.exemplu.ro/files/curs1.pdf devine https://www.exemplu.ro/files ).

Rezultatul scriptului trebuie salvat în fișierul /home/student/tema3-task4/correct_urls.txt.

Rezultatul scriptului trebuie sortat alfabetic și trebuie să nu existe dubluri

b) Extragerea mailurilor valide (13p)

În urma rularii scriptului precedent am obținut o lista de URLuri, dintre care și mailuri.

Scriptul generate_mails.sh extrage toate mailurile pentru @pub și generează echivalentul său pentru @studenti.upb.

De exemplu, mailto:uso-team@pub.ro devine uso-team@studenti.upb.ro.

Rezultatul scriptului trebuie salval în fișierul /home/student/tema3-task4/mails.txt.

Rezultatul scriptului trebuie sortat alfabetic și trebuie să nu existe dubluri

Task 05 - Parole Gaming (30p)

Pentru acest task se va lucra exclusiv în directorul /home/student/tema3-task5

Înainte de a vă apuca, intrați in directorul acesta.

Apelul scriptului trebuie să arate în felul următor:

./parole_gaming.sh common_words.txt passwords.txt

Scrieți un script care primește ca argumente două fișiere. Primul este un dicționar de parole cunoscute, iar al doilea este plin cu potențiale parole.

Scriptul parole_gaming.sh verifică fiecare parolă din cele potențiale, și scrie în fișierul cleaned_passwords.txt toate parolele valide, adică cele care trec toate cele 8 criterii de validitate:

- Conține cel puțin o literă mare.

- Conține cel puțin o literă mică.

- Conține cel puțin o cifră.

- Conține cel puțin un semn de punctuație din setul: ”!@#$%^&*?-_=+”.

- Nu conține spații.

- Are lungimea între 8 și 128 de caractere.

- Nu are mai mult de 3 caractere identice consecutive (Ex: “aabaa” îndeplinește acest criteriu, dar “aaaab” nu îl întâlnește).

- Nu conține niciun cuvânt din dicționar (Ex: “aA!1test” nu îndeplinește acest criteriu, deoarece “test” este un cuvânt din dicționar).

Rezultatul scriptului trebuie salvat în fișierul /home/student/tema3-task5/cleaned_passwords.txt

Task obligatoriu pentru toate temele (0p)

Finalizați tema si asigurați-vă că ați submis tema cu sudo uso submit.