This shows you the differences between two versions of the page.
uso-ac:teme:tema-3 [2017/11/23 20:49] dennis.plosceanu |
uso-ac:teme:tema-3 [2017/11/29 17:44] (current) dennis.plosceanu [Informații generale] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | <hidden> | ||
====== Tema 3 ====== | ====== Tema 3 ====== | ||
<note> | <note> | ||
Line 22: | Line 21: | ||
<note important> | <note important> | ||
- | Deadline: **29 Noiembrie, ora 23:55**\\ | + | Deadline: **4 Decembrie, ora 23:55**\\ |
- | Timp de lucru: **6 zile**\\ | + | Timp de lucru: **7 zile**\\ |
Punctaj: **0.8 puncte** din nota finală\\ | Punctaj: **0.8 puncte** din nota finală\\ | ||
Formular pentru trimitere temă: https://goo.gl/forms/vjzVNNczk5A29uLI3\\ | Formular pentru trimitere temă: https://goo.gl/forms/vjzVNNczk5A29uLI3\\ | ||
Line 30: | Line 29: | ||
<note> | <note> | ||
**Actualizări enunț:** | **Actualizări enunț:** | ||
+ | * 28 Noiembrie 2017 - precizare extra la Task04 punctul 2 | ||
+ | * 24 Noiembrie 2017 - Încă un tip la Task01 punctul 3 | ||
+ | * 23 Noiembrie 2017 - Tip în plus la Task01 punctul 3 | ||
+ | </note> | ||
+ | <note> | ||
+ | **Actualizări checker:** | ||
+ | * 26 Noiembrie 2017 V4 | ||
+ | * Task01 - verificare ca parola userului ''smith'' să fie ''smith'' | ||
+ | * Task05 - Ștergere de fișiere create de checker | ||
+ | * 25 Noiembrie 2017 V3 | ||
+ | * Task05 - Match case sensitive pentru verificarea tipurilor de date din tabelă | ||
+ | * 24 Noiembrie 2017 V2 | ||
+ | * Task03 - Adăugat mesaj de eroare în plus pentru un caz netratat (mai multe adrese IP pe o interfață) | ||
+ | * Task04 - Timeout mai mare pentru check-ul dacă script-ul send_to_all.sh cere parolă | ||
</note> | </note> | ||
===== Cunoștințe evaluate ===== | ===== Cunoștințe evaluate ===== | ||
Line 70: | Line 83: | ||
* **[4p]** Creați și porniți un container Docker cu numele ''dimension-c137'' care folosește imaginea descărcată la punctul anterior. Containerul trebuie să rămână pornit. Urmăriți exemplul [[https://docs.docker.com/engine/reference/commandline/run/#/assign-name-and-allocate-pseudo-tty---name--it|de aici]]. | * **[4p]** Creați și porniți un container Docker cu numele ''dimension-c137'' care folosește imaginea descărcată la punctul anterior. Containerul trebuie să rămână pornit. Urmăriți exemplul [[https://docs.docker.com/engine/reference/commandline/run/#/assign-name-and-allocate-pseudo-tty---name--it|de aici]]. | ||
* **[4p]** Instalați pachetele ''inetutils-ping'', ''iproute2'', ''openssh-server'', ''sshpass'' , ''sqlite3'', ''vim'' și ''sudo'' pe containerul ''dimension-c137''. | * **[4p]** Instalați pachetele ''inetutils-ping'', ''iproute2'', ''openssh-server'', ''sshpass'' , ''sqlite3'', ''vim'' și ''sudo'' pe containerul ''dimension-c137''. | ||
+ | <note tip> | ||
+ | Pot apărea probleme dacă încercați să instalați pachetele cu ''docker exec'', atașați-vă la containere cu ''docker attach'' și rulați de acolo. | ||
+ | O să primiți, probabil, în primă instanță ''Unable to locate package ...''. Trebuie să vă prindeți de ce :). | ||
+ | </note> | ||
* **[2p]** Adăugați utilizatorul ''smith'' pe containerul ''dimension-c137'' cu parola ''smith''. Setați directorul home al acestuia la ''/home/smith_residence'' și shellul la ''/bin/bash''. | * **[2p]** Adăugați utilizatorul ''smith'' pe containerul ''dimension-c137'' cu parola ''smith''. Setați directorul home al acestuia la ''/home/smith_residence'' și shellul la ''/bin/bash''. | ||
* **[6p]** Asigurați-vă că puteți realiza o conexiune ''ssh'' între mașina virtuală de USO (''usovm'') și containerul ''dimension-c137'' folosind userul ''smith''. | * **[6p]** Asigurați-vă că puteți realiza o conexiune ''ssh'' între mașina virtuală de USO (''usovm'') și containerul ''dimension-c137'' folosind userul ''smith''. | ||
* **[2p]** Creați o imagine a containerului ''dimension-c137'' cu numele ''dimension-c137/ubuntu''. **Hint**: ''docker commit'' | * **[2p]** Creați o imagine a containerului ''dimension-c137'' cu numele ''dimension-c137/ubuntu''. **Hint**: ''docker commit'' | ||
- | ==== Task 02 (15p) ==== | + | ==== Task 02 (20p) ==== |
Checkerul va genera la prima sa rulare 3 containere care folosesc imaginea creată la Task 1: | Checkerul va genera la prima sa rulare 3 containere care folosesc imaginea creată la Task 1: | ||
Line 84: | Line 101: | ||
Vă puteți atașa la oricare dintre ele folosind comanda ''docker attach CONTAINER_NAME''. În cazul în care ați făcut o configurație greșită și doriți reinițializarea containerelor, ștergeți-le (''docker stop rick morty summer && docker rm rick morty summer'') și rulați din nou checkerul. | Vă puteți atașa la oricare dintre ele folosind comanda ''docker attach CONTAINER_NAME''. În cazul în care ați făcut o configurație greșită și doriți reinițializarea containerelor, ștergeți-le (''docker stop rick morty summer && docker rm rick morty summer'') și rulați din nou checkerul. | ||
- | * **[5p]** Configurați în mod static temporar, pe interfața ''eth1'' a containerului ''rick'', a 11-a adresă asignabilă din rețeaua ''192.168.137.0/24''. | + | * **[7p]** Configurați în mod static temporar, pe interfața ''eth1'' a containerului ''rick'', a 11-a adresă asignabilă din rețeaua ''192.168.137.0/24''. |
- | * **[5p]** Configurați în mod static temporar, pe interfeța ''eth1'' a containerului ''morty'', ultima adresă asignabilă din rețeaua ''192.168.137.0/24''. Testați conectivitatea între cele 2 containere prin intefețele ''eth1'' folosind comanda ''ping''. | + | * **[7p]** Configurați în mod static temporar, pe interfeța ''eth1'' a containerului ''morty'', ultima adresă asignabilă din rețeaua ''192.168.137.0/24''. Testați conectivitatea între cele 2 containere prin intefețele ''eth1'' folosind comanda ''ping''. |
- | * **[5p]** Configurați cele 2 containere astfel încât fiecare să se poată conecta la celălalt prin ''ssh'' cu credențialele de mai sus. Conexiunea va folosi adresa IP asignată intefețelor ''eth1'', nu ''eth0''. | + | * **[6p]** Configurați cele 2 containere astfel încât fiecare să se poată conecta la celălalt prin ''ssh'' cu credențialele de mai sus. Conexiunea va folosi adresa IP asignată intefețelor ''eth1'', nu ''eth0''. |
<note important> | <note important> | ||
Line 95: | Line 112: | ||
==== Task 03 (25p) ==== | ==== Task 03 (25p) ==== | ||
- | * **[2p]** Opriți interfața eth0 de pe containerul ''summer''. | + | * **[3p]** Opriți interfața eth0 de pe containerul ''summer''. |
- | * **[6p]** Configurați în mod static permanent, pe interfața ''eth1'' a containerului ''summer'' o adresă astfel încât să poată da ping cu succes pe adresele setate pe containerele rick si morty (atenție și la adresa setată pe interfața ''usobridge'' de pe host).Un container nu poate fi rebootat, testați faptul că ați făcut configurările corecte folosind comanda ''service networking restart'' în containerul ''summer''. | + | * **[7p]** Configurați în mod static permanent, pe interfața ''eth1'' a containerului ''summer'' o adresă astfel încât să poată da ping cu succes pe adresele setate pe containerele rick si morty (atenție și la adresa setată pe interfața ''usobridge'' de pe host).Un container nu poate fi rebootat, testați faptul că ați făcut configurările corecte folosind comanda ''service networking restart'' în containerul ''summer''. |
- | * **[6p]** Faceți configurările necesare atfel încât containerul ''summer'' să aibă conexiune la internet. Testați folosind comanda ''ping -c 2 8.8.8.8''. Configurarea trebuie să fie permanentă. | + | * **[7p]** Faceți configurările necesare atfel încât containerul ''summer'' să aibă conexiune la internet. Testați folosind comanda ''ping -c 2 8.8.8.8''. Configurarea trebuie să fie permanentă. |
- | * **[6p]** Configurați containerul ''morty'' astfel încât comanda ''ping google.com'' să se execute cu succes. | + | * **[8p]** Configurați containerul ''morty'' astfel încât comanda ''ping google.com'' să se execute cu succes. |
- | * **[5p]** Faceți configurările necesare pe mașina virtuală de USO (''usovm'') astfel încât să fie posibilă conectarea la containerele ''rick'', ''morty'' și ''summer'' folosind numele lor. De exemplu: | + | |
- | <code bash> | + | |
- | student@usovm:~$ ping rick | + | |
- | student@usovm:~$ ping morty | + | |
- | student@usovm:~$ ping summer | + | |
- | </code> | + | |
==== Task 04 (15p) ==== | ==== Task 04 (15p) ==== | ||
- | * **[5p]** Generați o pereche de chei [[https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm|ECDSA]] (id_ecdsa și id_ecdsa.pub) de lungime 384 biți în directorul ''/home/student/tema3/keys'' de pe mașina virtuală de USO (''usovm''). NU setați niciun passphrase pentru ele. | + | * **[7p]** Generați o pereche de chei [[https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm|ECDSA]] (id_ecdsa și id_ecdsa.pub) de lungime 384 biți în directorul ''/home/student/tema3/keys'' de pe mașina virtuală de USO (''usovm''). NU setați niciun passphrase pentru ele. |
- | * **[5p]** Faceți configurările necesare astfel încât userul ''student'' de pe host (''usovm'') să se poată conecta pe userii de pe cele 3 containere (''rick'', ''morty'', ''summer''), fără parolă, folosind cheile generate la subpunctul anterior (va trebui să faceți posibilă conexiunea prin ''ssh'' si pe containerul summer cum ați făcut și la task-ul 2 pentru ''rick'' și ''morty''). | + | * **[8p]** Faceți configurările necesare astfel încât userul ''student'' de pe host (''usovm'') să se poată conecta pe userii de pe cele 3 containere (''rick'', ''morty'', ''summer''), fără parolă, folosind cheile generate la subpunctul anterior (va trebui să faceți posibilă conexiunea prin ''ssh'' si pe containerul summer cum ați făcut și la task-ul 2 pentru ''rick'' și ''morty''). |
- | * **[5p]** Scrieți un script ''~/tema3/task4/send_to_all.sh'' (în home-ul userului ''student'' de pe mașina virtuală) care primește o cale către un fișier ca argument și trimite prin ssh (Hint: ''man scp'') fișierul primit ca argument în directoarele home ale utilizatorilor ''rick'', ''morty'' și ''summer'' de pe containerele asociate fără a cere parolă. Puteți să presupuneți că argumentul primit de script este tot timpul valid. | + | |
- | ==== Task 05 (25p) ==== | + | <note important> |
+ | Atenție! Cheile nu trebuie copiate/mutate în alt director. | ||
+ | </note> | ||
+ | |||
+ | ==== Task 05 (20p) ==== | ||
În urma primei rulări a checkerului pe acest task, pe cele 3 containere (''rick'', ''morty'', ''summer'') se va popula câte o bază de date folosind ''sqlite3''. | În urma primei rulări a checkerului pe acest task, pe cele 3 containere (''rick'', ''morty'', ''summer'') se va popula câte o bază de date folosind ''sqlite3''. | ||
- | * **[5p]** Creați în mașina virtuala folosind ''sqlite3'' (o sa trebuiască instalat pachetul) o bază de date numită ''rickandmorty.db'' (în ''/home/student/tema3/task5'') și în ea o tabelă nouă numită ''characters'' cu 3 coloane: | + | * **[8p]** Creați în mașina virtuala folosind ''sqlite3'' (o sa trebuiască instalat pachetul) o bază de date numită ''rickandmorty.db'' (în ''/home/student/tema3/task5'') și în ea o tabelă nouă numită ''characters'' cu 3 coloane: |
- | * name - string de maxim 50 de caractere, nu poate fi null | + | * name - varchar de maxim 50 de caractere, nu poate fi null |
* age - număr întreg | * age - număr întreg | ||
- | * episode - string de maxim 100 de caractere, nu poate fi null | + | * episode - varchar de maxim 100 de caractere, nu poate fi null |
- | * **[7p]** Scrieți un script ''select.sh'' în ''/home/student/tema3/task5'' de pe mașina virtuală care primește 2 argumente: | + | * **[12p]** Scrieți un script ''select.sh'' în ''/home/student/tema3/task5'' de pe mașina virtuală care primește 2 argumente: |
* numele unei baze de date (path către un fișier ''*.db'') | * numele unei baze de date (path către un fișier ''*.db'') | ||
* numele unei tabele din baza de date | * numele unei tabele din baza de date | ||
Line 126: | Line 140: | ||
Pentru testare va trebui să aveți o tabelă în care să inserați date (preferabil creați o altă tabelă cu aceleași coloane ca și ''characters'' pentru că checker-ul va șterge la rulare toate datele din aceasta). | Pentru testare va trebui să aveți o tabelă în care să inserați date (preferabil creați o altă tabelă cu aceleași coloane ca și ''characters'' pentru că checker-ul va șterge la rulare toate datele din aceasta). | ||
- | |||
- | * **[7p]** Copiați scriptul ''select.sh'' pe toate cele 3 containerele în home-urile userilor asociați (scriptul trebuie să se numească tot ''select.sh''). | ||
- | Scrieți un script nou numit ''wabalubadubdub.sh'' în ''/home/student/tema3/task5'' care primește ca argumente: | ||
- | * numele unui user de pe un container | ||
- | * ip-ul unui container | ||
- | * numele unei baze de date (path către un fișier ''*.db'') | ||
- | * numele unei table in baza de date | ||
- | Scriptul va trebui să ruleze **prin ssh** scriptul ''select.sh'' pe userul și ip-ul primite ca argument. | ||
- | Scriptului ''select.sh'' i se vor da argumentele 3 și 4 (numele bazei de date si al tabelei). | ||
- | |||
- | Apoi scriptul va trebui să copieze **prin ssh** (Hint: ''man scp'') fișierul rezultat în urma comenzii rulate (fișierul ''query.csv'') în **directorul curent** și cu numele ''query_remote.csv''. | ||
- | |||
- | <note important> | ||
- | Atenție! Trebuie **neapărat** să rulați comanda **prin ssh**. Dacă rulați comanda folosind altceva (cum ar fi ''docker exec'') rezolvarea nu se va puncta (chair dacă checkerul vă dă punctajul). | ||
- | </note> | ||
- | |||
- | * **[6p]** Extindeți scriptul să insereze datele din fișierul copiat în tabela creată de voi la primul punct al exercițiului. | ||
- | |||
- | <note tip> | ||
- | Hints: | ||
- | * http://www.sqlitetutorial.net/sqlite-import-csv/ | ||
- | * http://tldp.org/LDP/abs/html/here-docs.html | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | Nu trebuie să tratați cazurile cu input invalid. | ||
- | </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> | ||
- |