Descriere
Pentru a rula vmchecker aveți nevoie de trei mașini:
- uploader - mașina care prinește temele de la studenți
- tester - mașina care se execută VMware
- mașina virtuală - mașina virtuală VMware pe care se execută testele.
Comunicația între uploader și tester se realizează prin ssh, iar cea dintre tester și mașina virtuală printr-un API dedicat VMware. Uploaderul și testerul trebuie să fie mașini de tip UNIX, dar mașina virtuală poate rula orice sistem de operare compatibil VMware.
În continuare vom prezenta care sunt dependințele vmchecker pe fiecare mașină și cum se pot configura acestea.
Uploader
Uploaderul este mașina care preia o arhivă zip ce conține o temă, creează un fișier de configurare atașat temei și îl trimite testerului spre testare.
Instalare
Dependințe
- un sistem de operare de tip UNIX
- python 2.5 (minimum) cu modul de sqlite3
- openssh-server - folosit pentru a comunica cu testerul.
Instalare
Se descarcă sursele VMChecker-ului.
svn checkout svn://rosedu.org/vmchecker/trunk ~/vmchecker
Se atribuie variabilei de mediu VMCHECKER_ROOT calea directorului ce conține sursele VMChecker-ului. În continuare vom presupune că directorul curent este cel specificat în $VMCHECKER_ROOT.
export VMCHECKER_ROOT=~/vmchecker
Se modifică calea implicită pentru a putea executa binare specifice vmchecker fără a specifica o cale absolută:
export PATH=$PATH:$VMCHECKER_ROOT/bin
Se rulează scriptul de inițializare.
make uploader-dist
Configurare
Se editează fișierul global de configurare #vmchecker.ini folosind editorul preferat.
ema^H^H^Hvim vmchecker.ini
vmchecker.ini
Fișierul de configurare global. TODO(alexandru) + editare fișierul din svn cu exemplu și documentație clară.
Verificare
Testarea este obligatorie pentru verificarea comunicării corecte intre cele 3 mașini. Acest pas trebuie executat după ce au fost configurate și celelalte două mașini.
Se testează trimițând o temă.
bin/check_config.py 'Alexandru Moșoi' Tema2Lin /tmp/file.zip
Tester
Testerul este mașina pe care va rula mașina virtuală pentru a testa fiecare temă.
Instalare
Dependințe
- sistem de operare de tip UNIX
- VMware SDK VIX API http://www.vmware.com/support/developer/vix-api/,
- python 2.5 minimum.
- openssh-server
Instalare
Se descarcă sursele VMChecker-ului.
svn checkout svn://rosedu.org/vmchecker/trunk ~/vmchecker
Se atribuie variabilei de mediu VMCHECKER_ROOT calea directorului ce conține sursele VMChecker-ului.
export VMCHECKER_ROOT=$HOME/vmchecker
În continuare vom presupune că directorul curent este cel specificat în $VMCHECKER_ROOT.
cd $VMCHECKER_ROOT
Se rulează scriptul de inițializare:
make tester-dist
Configurare
Se editează fișierul global de configurare al mașinilor virtuale #vm_config.ini folosind editorul preferat.
ema^H^H^Hvim vm_config.ini
Testare și Execuție
Se pornește managerul cozii în care așteaptă temele ce trebuie testate (parametrul este un identificator unic pentru curs ce nu poate conține spații). Pentru a vedea outputul managerului cozii în consolă (util când testați dacă mașina a fost corect configurată) rulați:
bin/queue_manager.sh POO
Pentru a-l rula în fundal și pentru a putea închide consola fără a forța închiderea managerului cozii rulați:
nohup bin/queue_manager.sh POO &
Acesta este modul indicat de rulare a managerului cozii de așteptare.
Pentru a vedea outputul acestuia vizualizați fișierul nohup.out:
tail -f nohup.out
Mașina virtuală
În mașina virtuală poate fi rulat orice sistem de operare compatibil cu VMware. Pașii creării unei mașini virtuale noi:
- creați mașinia virtuală cu VMware server sau VMware Workstation. Asigurați-vă că versiunea VIX API instalată pe tester este compatibilă cu versiunea de hardware virtualizat pe care ați creat-o
- instalați și configurați sistemul de operare
- instalați toate programele de care aveți nevoie pentru a
- instalați VMware Tools
Configurare
02-04-2008 08:16:32 Alexandru Moșoi Tema2Lin.ini
Fișierul de configurare a rezolvării unei teme.
Format (documentație + exemplu):
[DEFAULT] # Deadline - deadline-ul temei Deadline=10-10-08 23:59:00 # Job - numele temei care trebuie corectată Job=Tema2Lin # KernelMsg - activare mesaje kernel (folosit de temele PSO) KernelMsg=0 # PenaltyScript - scriptul invocat pentru calculul penalizării PenaltyScript=./penalty.sh # Tester - tipul de tester folosit: # vm - mașină virtuală (testarea se realizeaza într-o mașină virtuală) # jail - test jail (testarea se realizează pe mașina Tester) Tester=vm # UploadTime - data la care s-a încărcat pe site tema în formatul 'DD-MM-YY HH:MM:SS' UploadTime=15-09-08 12:15:27 # UploaderIp - adresa IP folosită de sistemul de upload (necesară pentru # comunicarea între sistemul de test și sistemul de upload) UploaderIp=78.97.118.165 # UploaderUsername - numele utilizatorului folosit pentru autentficarea # pe sistemul de upload UploaderUsername=vmchecker # UserId - numele studentului UserId=Alexandru Moșoi # VMCheckerRoot - directorul în care se află sursele VMChecker-ului # pe mașina de upload VMCheckerRoot=/home/POO/vmchecker # VMName - numele mașinii virtuale folosite pentru evaluarea temei VMName=lin
vmchecker.db
Fișier ce reprezintă o bază de date SQLite3, în care sunt stocate informații despre teme, studenți și notele obținute.
Este creat în scriptul bin/initialise_course.py, unde se poate observa și structura exactă a tabelelor:
CREATE TABLE studenti (id INTEGER PRIMARY KEY, nume TEXT); CREATE TABLE teme (id INTEGER PRIMARY KEY, nume TEXT, deadline DATE); CREATE TABLE note (id INTEGER PRIMARY KEY, id_student INTEGER, id_tema INTEGER, nota INTEGER, data TIMESTAMP default CURRENT_TIMESTAMP);
Poate fi deschis cu un client de SQLite3 în felul urmator:
sqlite3 vmchecker.db
vm_config.ini
Fișierul de configurare a mașinilor virtuale aflate pe Tester.
Format (documentaţie + exemplu)
[Global] # LocalAddress - adresa IP a Tester-ului LocalAddress=10.38.249.255 # [id] - identificatorul mașinii virtuale pe care urmează să fie # evaluată o temă, precum și pentru determinarea locației scripturilor # ce urmează a fi copiate pe mașina virtuală (numele scripturilor # fiind obținute prin concatenarea acestui identificator cu sufixele # "_build.sh" și "_run.sh") [win] # VMDescription - descriere a mașinii virtuale VMDescription=Windows - General purpose # VMPath - calea spre fișierul de configurare a mașinii virtuale (.vmx) VMPath=/home/student/VirtualMachines/Windows XP Professional/Windows XP Professional.vmx # GuestUser - numele utilizatorului folosit pentru autentificare pe mașina virtuală GuestUser=user # GuestPassword - parola folosita pentru autentificare pe mașina virtuală GuestPassword=user # GuestBasePath - calea spre directorul de lucru al mașinii virtuale # (aici vor fi adaugate arhivele și scripturile necesare XXX) GuestBasePath=c:\cygwin\home\user\ # GuestShellPath - calea spre shell-ul mașinii virtuale GuestShellPath=c:\cygwin\bin\bash.exe # GuestHomeInBash - calea spre directorul de lucru, privit din bash (folosit # de scripturile puse pe mașina virtuală - executa "cd" la aceasta cale) GuestHomeInBash=/home/user/
Structura Directoarelor
Structura directoarelor este relativă la calea specificată prin variabila de mediu $VMCHECKER_ROOT.
mașina Uploader
| bin/ | diverse utilitare, executabile |
| unchecked/ | o coada locală ce conține fișiere de configurare pentru temele uploadate |
| checked/ | conține temele corectate |
| checked/Tema2Lin | conține toate temele corectate pentru Tema2Lin |
| checked/Tema2Lin/Alexandru Moșoi/ | conține rezultatele ultimei corectări a temei Tema2Lin aparținând lui Alexandru Moșoi |
| checked/Tema2Lin/Alexandru Moșoi/archive | conține sursele temei ultimei corectări a temei Tema2Lin aparținând lui Alexandru Moșoi |
| back/ | conține sursele pentru toate temele uploadate |
| back/Tema2Lin/ | conține sursele pentru Tema2Lin pentru toţi studenţii |
| back/Tema2Lin/Alexandru Moșoi/ | conține sursele încărcate de studentul Alexandru Moșoi pentru Tema2Lin |
| back/Tema2Lin/Alexandru Moșoi/10-09-2008 08:16:32/file.zip | conține sursa temei Tema2Lin a studentului Alexandru Moșoi, incarcata la ora 08:16:32 în data de 10-09-2008 |
| vmchecker.ini | fișier de configurare global |
| vmchecker.db | baza de date SQLite3 cu notele studenţilor |
mașina Tester
| bin/ | diverse utilitare, executabile |
| queue/ | directoru cu funcţie de coadă pentru command manager (XXX când se crează acest director) |
| Commander/ | sursele modulului Commander |
| VMExecutor/ | sursele modulului VMExecutor |
| executor_jobs/ | director folosit în comunicarea Commander - VMExecutor (locul unde Commander-ul va copia arhivele de pe Uploader şi de unde vor preluate de VMExecutor) |
| executor_script/ | director ce conține scripturile ce vor fi rulate pe mașina virtuală (câte unul pentru fiecare id de mașina virtuală din vm_config.ini) |
| vm_config.ini | fișierul de configurare a mașinilor virtuale |
Formatul fișierelor de configuraţie
Fișierele de configuraţie au un format .ini standard.
- Comentariile se pun pe o linie separată ce începe cu #
- numele secțiunilor pot conține doar caractere aflanumerice
- formatul datei este 'ZZ-LL-YY HH:MM:SS'
DA:
# network interface Interface=eth0
NU:
Interface=eth0 ; network interface
Evaluare
Evaluarea unei teme se face cu ajutorul utilitarului #bin/check_config.py.
Formatul temei
TODO
Utilitare
bin/initialise_course.py
Scriptul creează structura de directoare necesară pentru funcționarea sistemului de upload:
- unchecked
- checked
- back
- tests,
și baza de date folosită de aplicație.
Mod de utilizare:
bin/initialise_course.py
bin/check_config.py
bin/check_config.py primește trei argumente (numele studentului, numele temei
și calea catre arhiva temei) și creează un fișier de configurare a temei
respective folosind informații din fișierul global de configurare.
Fișierul de configurare a temei se gasește în directorul unchecked/ și va fi
transmis ca parametru pentru scriptul bin/remote_check.py. De asemenea fişierul
de configurare a unei teme este copiat şi în directorul corespunzător din back/.
Mod de utilizare:
bin/check_config.py (nume student) (nume tema) (cale catre arhiva temei)
Exemplu de invocare:
bin/check_config.py 'Alexandru Moșoi' Tema2Lin /tmp/file.zip
bin/remote_check.py
bin/remote_check.py primeşte ca argument un fişier de configurare pentru rezolvarea unei teme şi inştiințează coada de pe mașina Tester că o noua sursă trebuie verificată. Scriptul poate fi invocat pentru recorectarea unei teme pasându-i ca argument fișierul de configurare original salvat în locația specifică în back/.
bin/semctl
TODO(lucian)
bin/commander.sh
Scriptul invocă comanderul și momentan este folosit doar pentru depanare.
Exemplu utilizare:
bin/commander.sh 02-04-2008\ 08:16:32\ Alexandru\ Moșoi\ Tema2Lin.ini
Commander
Program ce comanda Executorul, în funcţie de informaţiile obţinute din fișierele de configurare:
- 02-04-2008\ 08:16:32\ Alexandru\ Moșoi\ Tema2Lin.ini
- vm_config.ini
Exemplu utilizare:
Commander/commander 02-04-2008\ 08:16:32\ Alexandru\ Moșoi\ Tema2Lin.ini
VMExecutor
Program ce efectuează testarea efectivă a temelor.
Mod de utilizare:
VMExecutor/vm_executor \ (vm_name) (kernel_messages_enabled) (calea spre fișierul de configurare mașină virtuală) \ (adresa ip a Tester-ului) (username de autentificare pe mașina virtuală) \ (parola de autentificare pe mașina virtuală) (adresa directorului de lucru de pe mașina virtuală) \ (calea directorului de lucru vazută din shell) (VMCHECKER_ROOT local) (job_id)
Exemplu de invocare:
VMExecutor/vm_executor \ lin 0 '/home/student/VirtualMachines/Ubuntu/Ubuntu.vmx' \ 10.38.249.255 user \ user /home/user/ \ /bin/bash /home/user /home/student/curs1 Tema1Lin
Menţiuni:
-
- fiecare curs trebuie să aibă, pentru fiecare temă, o arhiva (ZIP) de teste
- fiecare curs trebuie să aibă propriile scripturi de build și run (pentru fiecare mașina virtuală folosită).
- numele acestor scripturi va fi obţinut prin concatenarea numelui mașinii virtuale cu _build.sh, respectiv _run.sh (De exemplu: lin_build.sh, lin_run.sh) (există template pentru cele două scripturi)
- scripturile vor fi salvate în directorul VMCHECKER_ROOT/executor_scripts/
- scripturile vor fi rulate pe mașina virtuală, primind ca argumente (în ordine):
- guest_home_in_bash -> la începutul fiecarui script trebuie să existe lina "cd $1"
- local_ip - ip-ul Tester-ului -> în cazul temelor ce necesită doua sisteme comunicante
- job_id - dacă există anumite comenzi în plus sau în minus pentru anumite teme
-
- în cazul temelor care necesita două sisteme comunicante este necesară existenţa unui script, în arhiva de teste
- scriptul trebuie să se numeasca local.sh
- scriptul va fi rulat local, pe Tester, după dezarhivarea arhivei de teste și va primi ca argumente:
- local_ip -> ip-ul Testerului
- guest_ip -> ip-ul mașinii virtuale
- [deocamdată funcţia este implementată în vm_executor.cpp, dar încă nu am stabilit primirea argumentului de activare a instalarii locale TODO]
-
- în cazul temelor care necesită captarea mesajelor de kernel, acest lucru trebuie specificat prin argumentul 2, km_enable
- [este ceva scris, dar strict pe windows/linux, se poate face ceva de genul: km_enable == 1 - netconsole; km_enable == 2 - dbgview; funcţia nu este încă testată TODO]
-
- O temă va putea fi compliată şi rulată prin intermediul scripturilor propuse pentru fiecare maşină virtuală utilizată de cursul respectiv. Scripturile vor fi salvate în folderul $VMCHECKER_ROOT/executor_scripts cu denumirea $(vm)_build.sh şi $(vm)_run.sh, unde $(vm) este identificatorul maşinii virtuale, regăsit în fişierul de configurare al testerului.
- Pentru exemplificare, au fost depuse în folderul executor_scripts scripturile utilizate la materia "Sisteme de Operare", pentru maşinile virtuale "lin" şi "win".
- Scriptul de compilare *_build.sh compilează testele şi tema după următoarele reguli:
- pentru compilarea testelor trebuie să existe un fişier de makefile, numit Makefile.checker, care trebuie să conțină regulile "build-pre" şi "build-post" (prima regulă va fi executată înaintea compilării temei iar a două regulă va fi executată după compilarea temei)
- pentru compilarea temei studentul trebuie să furnizeze un fişier de makefile, numit Makefile, care trebuie să conțină regula "build"
- Scriptul de rulare *_run.sh rulează testele după următoarele reguli:
- trebuie să existe un fişier de makefile, numit Makefile.checker (acelaşi fişier utilizat pentru compilare), care trebuie să conțină o regulă suplimentară care poate avea orice nume, dar să fie prima regulă din fişier (pentru rulare se va apela doar make Makefile.checker, nu o regulă anume)
- Scriptul de compilare *_build.sh compilează testele şi tema după următoarele reguli:
- Obs. Regulile de mai sus pot fi schimbate prin propunerea altor scripturi de compilare şi rulare
bin/update_db.py
Script ce actualizează baza de date cu notele studenților, după editarea fişierelor ce conțin nota.
- Se rulează pe maşina uploader în directorul $VMCHECKER_ROOT/checked/ sau în subdirectoare ale acestuia.
- Nu sunt modificate decat notele ce au fost modificate după ultima rulare a scriptului pe subdirectorul respectiv.
- Daca o anumită intrare (temă, student, notă) nu există în baza de date, ea va fi inserată.
- Se presupune că datele din sistemul de fişiere sunt consistente; de fapt, sistemul de fişiere conține toata informația, baza de date fiind doar o altă imagine a ei, pentru a fi vizualizată mai uşor şi mai rapid.
Mod de utilizare:
user@server:/vmchecker/checked$ update_db.py
actualizează pentru toate temele, şi pentru toți studenții de la fiecare temă.
user@server:/vmchecker/checked/Tema1Lin$ update_db.py
actualizează pentru toti studenții ce au trimis tema cu numele Tema1Lin.
user@server:/vmchecker/checked/Tema1Lin/Claudiu Gheorghe$ update_db.py
actualizează doar nota pentru tema cu numele Tema1Lin trimisă de studentul cu numele Claudiu Gheorghe.
Mențiuni referitoare la exemplele de mai sus:
- se consideră că variabila de mediu $VMCHECKER_ROOT=/vmchecker/
- se consideră că scriptul bin/update_db.py este in path; altfel, se apelează scriptul explicit prin calea lui în sistemul de fişiere
bin/view_grades.py
Script ce generează un tabel HTML în care este prezentat borderoul complet de rezultate, folosind numai informații din baza de date vmchecker.db. Conținutul este afișat la STDOUT.
Scriptul a fost gândit pentru a fi apelat dintr-un script de pe serverul web.
Pentru a controla nivelul de prezentare al conținutului se definesc atribute CSS pentru urmatoarele elemente:
<style type="text/css">
table#hw-results-table {} /* tot tabelul */
table#hw-results-table td.hw-h {} /* celula cu numele temei */
table#hw-results-table td.st-h {} /* celula cu numele studentului */
table#hw-results-table td.grade {} /* celula cu nota */
</style>
bin/penalty.py
Script ce calculează penalizarea pentru o temă în cazul în care se
depășește deadline-ul specificat. Argumentele primite sunt: timpul de upload
și deadline-ul acesteia. Output-ul este de forma: "-x: y zile întârziere"
(x = numărul de puncte scăzute, y = numărul de zile întârziere)
Calculul penalizării se poate personaliza prin modificarea acestui script
(detaliile de implementare se găsesc în sursă). De asemenea se poate folosi
și alt script complet independent de implementarea curentă, numele acestuia
fiind specificat în fișierul global de configurare.
Mod de utilizare:
bin/penalty.py (timp de upload) (deadline)
Exemplu de invocare:
bin/penalty.py '12-10-08 12:04:00' '10-10-08 15:00:00'
FAQ
Dacă nu este altfel specificat se presupune că directorul curent este dat de variabila de mediu VMCHECKER_ROOT. Notă: toate utilitarele și scripturile trebuie să funcționeze corect indiferent de directorul curent.
- Cum pornesc queue managerul?
Pe mașina Tester se ruleaza:bin/queue_manager.sh numele_cursului
bin/queue_manager.sh PSO
- Cum corectez o temă?
bin/check_config.py Alexandru\ Moșoi Tema2Lin /tmp/alexandru.mosoi.zip
- Cum recorectez o tema?
bin/remote_check.py back/Tema2Lin/Alexandru\ Moșoi/02-04-2008\ 08:16:32/02-04-2008\ 08:16:32\ Alexandru\ Moșoi\ Tema2Lin.ini
XXX momentan nu merge, trebuie reparat
- Queue managerul crapă cu o eroare legată de smctl.
Trebuie creat semaforul pentru cursul respectiv. TODO(ana/lucian): creaza semaforul. - Cum refac baza de date cu notele?
Se rulează bin/initialise_course.py și apoi bin/update_db.py în directorul checked/. - Cum fac update la o singură notă?
user@server:/vmchecker/checked/Tema1Lin/Claudiu Gheorghe$ update_db.py
- Ce tipuri de arhive sunt suportate?
Numai fişiere zip. - Uploaderul și Testerul pot fi aceeaşi mașină?
Da. Doar că tot prin ssh vor comunica.
