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

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)
    • 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.

  1. Cum pornesc queue managerul?
    Pe mașina Tester se ruleaza:
    bin/queue_manager.sh numele_cursului
    
    bin/queue_manager.sh PSO
    
  2. Cum corectez o temă?
    bin/check_config.py Alexandru\ Moșoi Tema2Lin /tmp/alexandru.mosoi.zip
    
  3. 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

  1. Queue managerul crapă cu o eroare legată de smctl.
    Trebuie creat semaforul pentru cursul respectiv. TODO(ana/lucian): creaza semaforul.
  2. Cum refac baza de date cu notele?
    Se rulează bin/initialise_course.py și apoi bin/update_db.py în directorul checked/.
  3. Cum fac update la o singură notă?
    user@server:/vmchecker/checked/Tema1Lin/Claudiu Gheorghe$ update_db.py
    
  4. Ce tipuri de arhive sunt suportate?
    Numai fişiere zip.
  5. Uploaderul și Testerul pot fi aceeaşi mașină?
    Da. Doar că tot prin ssh vor comunica.

Echipa