This shows you the differences between two versions of the page.
uso-ac:teme:tema-3 [2016/12/14 19:29] giorgiana.vlasceanu [Informații generale] |
uso-ac:teme:tema-3 [2017/11/29 17:44] (current) dennis.plosceanu [Informații generale] |
||
---|---|---|---|
Line 21: | Line 21: | ||
<note important> | <note important> | ||
- | Deadline: **18 Decembrie, ora 23:55**\\ | + | Deadline: **4 Decembrie, ora 23:55**\\ |
- | Timp de lucru: **9 zile**\\ | + | Timp de lucru: **7 zile**\\ |
- | Punctaj: **0.5 puncte** din nota finală\\ | + | Punctaj: **0.8 puncte** din nota finală\\ |
- | Formular pentru trimitere temă: https://goo.gl/39NdTB\\ | + | Formular pentru trimitere temă: https://goo.gl/forms/vjzVNNczk5A29uLI3\\ |
</note> | </note> | ||
<note> | <note> | ||
**Actualizări enunț:** | **Actualizări enunț:** | ||
- | * Nu există | + | * 28 Noiembrie 2017 - precizare extra la Task04 punctul 2 |
- | **Actualizări utilitar ''uso'': <color red>versiunea v16 - "Gold Blackbird"</color>** | + | * 24 Noiembrie 2017 - Încă un tip la Task01 punctul 3 |
- | * Nu există | + | * 23 Noiembrie 2017 - Tip în plus la Task01 punctul 3 |
- | **Actualizări checker: <color red>versiunea 1</color>** | + | |
- | * Nu există | + | |
- | **Actualizări checker: <color red>versiunea 1</color>** | + | |
- | * Nu există | + | |
</note> | </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> | ||
===== Cunoștințe evaluate ===== | ===== Cunoștințe evaluate ===== | ||
Line 46: | Line 52: | ||
* folosirea utilitarelor de lucru cu mașini aflate la distanță; | * folosirea utilitarelor de lucru cu mașini aflate la distanță; | ||
* noțiuni simple de shell scripting; | * noțiuni simple de shell scripting; | ||
- | * înlănțuiri de comenzi și comunicare eficientă interproces. | + | * stocarea și prelucrarea datelor |
===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ===== Testarea temei. Finalizarea temei. Mașină virtuală. ===== | ||
Line 70: | Line 76: | ||
* pentru a șterge o imagine folosiți comanda ''docker rmi''. | * pentru a șterge o imagine folosiți comanda ''docker rmi''. | ||
- | ==== Task 01 (25p) ==== | + | ==== Task 01 (20p) ==== |
<note important> | <note important> | ||
**Toate** celelalte taskuri următoare sunt dependende de rezolvarea corectă și completă a Taskului 1. În cazul în care opriți sau dați reboot mașinii virtuale de USO containerele vor fi și ele oprite. Va trebui să refaceți o parte din configurări, în acest caz. Pentru comoditate, folosiți **Save the machine state** în loc de **Power off**. | **Toate** celelalte taskuri următoare sunt dependende de rezolvarea corectă și completă a Taskului 1. În cazul în care opriți sau dați reboot mașinii virtuale de USO containerele vor fi și ele oprite. Va trebui să refaceți o parte din configurări, în acest caz. Pentru comoditate, folosiți **Save the machine state** în loc de **Power off**. | ||
</note> | </note> | ||
* **[2p]** Descărcați imaginea ''i386/ubuntu:latest'' folosind comanda ''docker pull''. | * **[2p]** Descărcați imaginea ''i386/ubuntu:latest'' folosind comanda ''docker pull''. | ||
- | * **[5p]** Creați și porniți un container Docker cu numele ''uso-base'' 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]]. |
- | * **[5p]** Instalați pachetele ''inetutils-ping'', ''iproute2'', ''openssh-server'', ''sshpass'' , ''vim'' și ''sudo'' pe containerul ''uso-base''. | + | * **[4p]** Instalați pachetele ''inetutils-ping'', ''iproute2'', ''openssh-server'', ''sshpass'' , ''sqlite3'', ''vim'' și ''sudo'' pe containerul ''dimension-c137''. |
- | * **[3p]** Adăugați utilizatorul ''student'' pe containerul ''uso-base'' cu parola ''student''. Setați directorul home al acestuia la ''/home/student'' și shellul la ''/bin/bash''. | + | <note tip> |
- | * **[7p]** Asigurați-vă că puteți realiza o conexiune ''ssh'' între mașina virtuală de USO (''usovm'') și containerul ''uso-base'' folosind userul ''student''. | + | 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. |
- | * **[3p]** Creați o imagine a containerului ''uso-base'' cu numele ''uso/ubuntu''. **Hint**: ''docker commit'' | + | 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''. | ||
+ | * **[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'' | ||
- | ==== Task 02 (30p) ==== | + | ==== Task 02 (20p) ==== |
- | Checkerul va genera la prima sa rulare 3 containere ''uso1'', ''uso2'' și ''uso3'' care folosesc imaginea creată la Task 1. 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 uso1 uso2 uso3 && docker rm uso1 uso2 uso3'') și rulați din nou checkerul. | + | Checkerul va genera la prima sa rulare 3 containere care folosesc imaginea creată la Task 1: |
- | * **[6p]** Configurați în mod static temporar, pe interfața ''eth1'' a containerului ''uso1'', a 11-a adresă asignabilă din rețeaua ''192.168.42.0/24''. | + | |
- | * **[6p]** Configurați în mod static temporar, pe interfeța ''eth1'' a containerului ''uso2'', a 12-a adresă asignabilă din rețeaua ''192.168.42.0/24''. Testați conectivitatea între cele 2 containere prin intefețele ''eth1'' folosind comanda ''ping''. | + | * ''rick'' - cu userul ''rick'' și parola ''rick'' |
- | * **[6p]** Configurați cele 2 containere astfel încât fiecare să se poată conecta la celălalt prin ''ssh'' cu credențialele ''student:student'' de pe userul 'student'. Conexiunea va folosi adresa IP asignată intefețelor ''eth1'', nu ''eth0''. | + | * ''morty'' - cu user ''morty'' si parola ''morty'' |
- | * **[4p]** Faceți configurările necesare astfel încât mașina virtuală de USO (host-ul) să se poată conecta prin ''ssh'', de pe userul ''student'', fără parolă, la cele 2 containere ''uso1'' și ''uso2'' pe IP-urile configurate pe intefețele ''eth1''. Conexiunea trebuie să se poată realiza pentru userul ''student'' de pe containere. | + | * ''summer'' - cu userul ''summer'' și parola ''summer'' |
- | * **[8p]** Faceți configurările necesare astfel încât mașina virtuală de USO (host-ul) să se poată conecta prin ''ssh'', de pe userul ''student'', fără parolă, la containerul ''uso2'' pe IP-ul configurat pe intefeța ''eth1''. Conexiunea trebuie să se poată realiza pentru userul ''root'' de pe container. | + | |
+ | 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. | ||
+ | |||
+ | * **[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''. | ||
+ | * **[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''. | ||
+ | * **[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> | ||
- | Containerele ''uso1'' și ''uso2'' trebuie să fie pornite la finalul acestui task. Interfețele ''eth1'' ale celor două containere trebuie să aibă configurată câte o singură adresă IP. | + | Containerele ''rick'' și ''morty'' trebuie să fie pornite la finalul acestui task. Interfețele ''eth1'' ale celor două containere trebuie să aibă configurată câte o singură adresă IP. |
</note> | </note> | ||
+ | |||
==== Task 03 (25p) ==== | ==== Task 03 (25p) ==== | ||
- | * **[4p]** Opriți interfața ''eth0'' de pe containerul ''uso3''. | ||
- | * **[7p]** Configurați în mod static permanent, pe interfața ''eth1'' a containerului ''uso3'' o adresă liberă, la alegere, din rețeaua ''192.168.42.0/24''. **Hint**: Adresa ''192.168.42.1'' este asignată intefeței ''usobridge'' de pe host (''usovm''). Un container nu poate fi rebootat, testați faptul că ați făcut configurările corecte folosind comanda ''service networking restart'' în containerul ''uso3''. | ||
- | * **[7p]** Faceți configurările necesare atfel încât containerul ''uso3'' să aibă conexiune la internet. Testați folosind comanda ''ping -c 2 8.8.8.8''. Configurarea trebuie să fie permanentă. | ||
- | * **[7p]** Configurați containerul ''uso2'' altfel încât comanda ''ping google.com'' să se execute cu succes. | ||
- | ==== Task 04 (20p) ==== | + | * **[3p]** Opriți interfața eth0 de pe containerul ''summer''. |
- | * **[15p]** Scrieți un script aflat în directorul ''/home/student/tema3/'' de pe mașina virtuală de USO (''usovm''), cu numele ''iface-info.sh'' care afișează informații despre o interfață de rețea primită ca parametru. Rezultatul trebuie să respecte următorul format (exact 3 linii): | + | * **[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''. |
- | <code bash> | + | * **[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ă. |
- | student@usovm:~$ /home/student/tema3/iface-info.sh enp0s8 | + | * **[8p]** Configurați containerul ''morty'' astfel încât comanda ''ping google.com'' să se execute cu succes. |
- | MAC: 08:00:27:0E:C4:CA | + | |
- | IP: 172.28.128.4 | + | |
- | Netmask: 255.255.255.0 | + | |
- | </code> | + | |
- | Restricții și precizări: | + | |
- | * scriptul trebuie să scrie rezultatul la ''stdout''; | + | |
- | * în caz că nu primește niciun argument trebuie să afișeze mesajul ''Gimme more args'' la ''stderr''; | + | |
- | * în cazul în care primește un singur argument, îl va trata ca pe o interfață de pe host (mașina virtuală de USO); | + | |
- | * în cazul în care interafața oferită prin primul argument nu există, scriptul va afișa la ''stderr'' mesajul ''No such interface''; | + | |
- | * dacă intefața nu are IP/Netmask se va afișa 'N/A' în locul valorilor respective. | + | |
- | * în caz de eroare (nu primește niciun argument sau interfața nu există), scriptul va ieși cu valoarea de retur ''1''; | + | |
- | * în caz de succes, scriptul va ieși cu valoarea de retur ''0''; | + | |
- | * dacă interfața are mai multe adrese IP se va afișa doar prima (în ordinea dată de comanda ''ip address show''); | + | |
- | * adresa MAC trebuie afișată cu upper case, de exemplu ''08:00:27:0E:C4:CA'', nu ''08:00:27:0e:c4:ca''; | + | |
- | * în cazul în care interfața primită ca parametru este ''lo'' se va afișa MAC-ul acesteia ca fiind ''00:00:00:00:00:00'' (așa cum raportează ''ip address show''). | + | |
- | * **[5p]** Extindeți scriptul ''iface-info.sh'' pentru a putea primi două argumente. Primul argument este numele unei interfețe, iar al doilea este numele unui container pornit. **Hint**: ''docker exec'' | + | ==== Task 04 (15p) ==== |
- | Restricții și precizări suplimentare față de primul subpunct: | + | * **[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. |
- | * în cazul în care scriptul primește două argumente, primul argument este numele unei interfețe, iar al doilea este numele unui container pornit. Scriptul va afișa informații despre interfața dată, aceasta fiind o interfață din container; | + | * **[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''). |
- | * în cazul în care containerul dat ca argument nu există sau nu este pornit, scriptul va afișa la ''stderr'' mesajul ''No such container''; | + | |
- | * dacă nici interfața, nici containerul nu există (sau nu rulează), prioritate are mesajul de eroare pentru container, afișându-se la ieșierea de eroare ''No such container''; | + | <note important> |
- | * dacă se primesc mai mult de două argumente, începând cu al treilea acestea vor fi ignorate. | + | 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''. | ||
+ | * **[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 - varchar de maxim 50 de caractere, nu poate fi null | ||
+ | * age - număr întreg | ||
+ | * episode - varchar de maxim 100 de caractere, nu poate fi null | ||
+ | * **[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 tabele din baza de date | ||
+ | Scriptul va trebui: | ||
+ | * să selecteze din tabelă intrările care corespund utilizatorului curent (coloana name din tabelă conține numele utilizatorului care rulează scriptul) | ||
+ | * să scrie rezultatul selecției în format ''csv'' într-un fișier numit ''query.csv'' în directorul home al utilizatorului curent | ||
+ | |||
+ | 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). | ||
===== 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). | ||
- |