Validační server - automatická kontrola semestrálních prací

Konfigurace validačního serveru

Zpět na hlavní stránku

Hlavní konfigurační soubor serveru je uložen v hlavním adresáři serveru (viz Adresářová struktura), jmenuje se server.xml, je načítán vždy po spuštění serveru. Jedná se o soubor ve formátu pro Java-Properties (viz DTD). Následuje seznam a popis jednotlivých nastavení:

Poznámka: znak D před názvem položky znamená, že tato položka nemá globální platnost, ale lze ji předefinovat pro konkrétní doménu v konfiguračním souboru domény. Respektive je-li nadefinována v nastavení domény i serveru zároveň, bere se nastavení domény.

 Název položkyPopis
Hlavní nastavení serveru
Dcore.debug0/1. Určuje, zda je zapnut (=1) DEBUG režim, tj. zda se vypisují veškeré informace (ladící informace, Stack Trace, detailní pozice výskytu chyby) i do výstupů validace - tj. především do výstupních HTML souborů. Používat pouze při ladění. Default 0.
Dcore.do_cleanup0/1. Určuje, zda se budou po provedení validace mazat pracovní adresáře (podadresáře pod data\workdir). Default 0.
 core.data_dirUdává název "data" adresáře, relativně k pracovnímu adresáři validačního serveru (tedy adresáře, ze kterého je server spuštěn - platí, že je to aktuální adresář systému v okamžiku spuštění validačního serveru). Doporučuje se nechat název "data".
 core.domains_dirUdává název adresáře "domains" relativně vůči adresáři data. Doporučuje se nechat "domains".
 core.work_dirUdává název adresáře "workdir" relativně vůči adresáři data. Doporučuje se nechat "workdir".
 core.store_dirUdává název adresáře "store" relativně vůči adresáři data. Doporučuje se nechat "store".
 core.resource_bundleUdává název tzv. ResourceBundle, tj. souboru s lokalizačními texty serveru. Doporučuje se nechat "cz.zcu.validationserver.nl.ValidationServer".
Dcore.default_languageUdává výchozí jazyk serveru. Ten bude použit v případě, že klient validačního serveru neuvede svůj požadovaný jazyk. Příklad: "cs" či "en". (V současné době je k dispozici pouze čeština).
Dcore.default.charsetZnaková sada, která se použije při jakékoliv práci v serveru/doméně, kde je potřeba na znakovou sadu dbát. Tedy například v doménách při načítání libovolných souborů atd. Snaží se to tedy přebít použití Charset.defaultCharset() kdekoliv to je možné. Zároveň ovlivňuje i spouštění Java programů tak, že spouštěné programy obdrží default charset své Javy nastaven podle tohoto nastavení (-Dfile.encoding). Není-li uvedeno, použije se výchozí Charset Java JVM, což se nedoporučuje (může se měnit na různých instalacích/systémech).
Dcore.output_charsetZnaková sada, která se použije při generování jakýchkoliv výstupů (HTML, XML, ...). Doporučuje se UTF-8. Není-li uvedeno, použije se výchozí Charset Java JVM, což se nedoporučuje (může se měnit na různých instalacích/systémech).
Dcore.concurrency_disabledUrčuje, zda je zakázáno paralelní zpracovávání více úloh (tj. zda může na serveru v jednu chvíli probíhat více validací). Je-li 0, není zakázáno (a to je default). Je-li 1, pak jsou úlohy zpracovávány vždy po sobě. Toto nastavení lze uvádět i u jednotlivých domén, platí však tyto pravidla:
  • Je-li zde u serveru nastaveno 1, pak se nastavení domén ignoruje (tj. toto je jakési "záchranné" - pokud dojde k případným problémům způsobených paralelním zpracováním, může se zde okamžitě zakázat pro celý server).
  • Je-li zde 0, a u domény 1, pak se zakazuje paralelismus pouze u této konkrétní domény, tedy úlohy této domény budou zpracovávány sériově, může se však stát, že bude paralelně validovat jiná doména.
Dcore.invoke_userPod jakým uživatelem se budou spouštět zaslané (a přeložené) soubory - je-li uveden uživatel a je specifikován i parametr "core.sudo_path", pak jsou testované soubory vždy spouštěny pod touto identitou. Více viz kapitola o bezpečnosti.
Dcore.sudo_pathCesta na příkaz "sudo". Tedy např. "/usr/bin/sudo"
Dcore.max_parallel_secured_invocationsUdává maximální počet zároveň běžících spuštění programů pod "invoke user" - tj. těch zabezpečených. Tj. slouží jako limit, kolik procesů může valiadční server spustit pod jiným (zabezpečeným) uživatelem. Je-li 0, není omezeno.

Hodí se v případě, kdy je v linuxu (či jiném OS) tento uživatel nějak systémově omezen, například na maxmální množství procesů. Tímto lze zařídit, aby valiadční server například nikdy nespustil více než je nutno. Tj. aby pak nebyla kolize s daným nastavením.

Je-li více domén a každá používá jiného "invoke_user", pak je toto omezení pro každého takového uživatele zvlášť, tj. per-user.

Dcore.process_kill_commandCesta na externí script, který má za úkol killovat procesy, které mohly zůstat v dané doméně (či celém serveru, záleží na nastavení sudo) běžet.

Tento soubor může obsahovat scrip, který killnutí příslušných procesů zařídí. Server garantuje, že tento process killování bude spuštěn pouze v případě, kdy právě neběží žádná validace a dokud tento killovací script běží, budou všechny příchozí validace pozdrženy.

Server spouští tento script v případě, že validace v dané doméně skončila TIMEOUTem.

Problém v tom, že v případě použití sudo pro spouštění programů pod jiným uživatelem již není možné je normálně killnout (Javovskými mtodami - přenositelnými mezi platformami). Proto je potřeba speciálních scriptů. Ukázka scriptu, který killne všechny procesy uživatele 'vs-nobody' (tj. toho, pod kým se validované programy spouštějí) kromě procesů bash:

sudo -u vs-nobody sh -c "ps xfuwwh | grep -v bash | grep -v xfuwwh | awk {'print \$2'} | xargs kill -9"
Dcore.c_references_scriptCesta na externí script, který má za úkol zjistit seznam funkcí, které používá C zdroják. Server předává tomuto scriptu jeden parametr - plnou cestu na tento zdroják. Script musí vrátit seznam funkcí tak, že na každé řádce výstupu je na začátku řádky uveden název jedné funkce. Za ní (a tedy za aspoň jedním bílým znakem) může být libovolný text, který je validačním serverem ignorován.

Příklad pro linux:

gcc -c $1 -o $1.o &>/dev/null
nm -u -C -f posix $1.o | awk {'print $1'}
Dcore.c_denied_functionsCesta na soubor, který obsahuje seznam nepovolených funkcí pro jazyk C. Formát souboru je jednoduchý - na každé řádce název jedné funkce.
Dcore.c_allowed_functionsCesta na soubor, který obsahuje seznam povolených funkcí pro jazyk C. Formát souboru je jednoduchý - na každé řádce název jedné funkce.

Poznámka:

Zde se pouze deklarují seznamy funkcí, ať povolených či nepovolených. To, jaká bude zvolena politika při konrole odevzdaných souborů (tj. zda se povolí všechny kromě zakázených či naopak povolí pouze povolené) záleží na validačním scriptu a tom, jaké použije funkce z API validačního serveru.
Dcore.java_pathCesta na příkaz "java", který se bude používat pro spouštění přeložených Java souborů. Například "/usr/lib/jdk/jre/bin/java" či ve Windows "c:\program files\java\jre1.6.0_01\bin\java.exe".
Djava.optionsPřípadné další parametry pro spouštění Javy (např. "-Xmx128m" atd).
 core.admin_passwordObsahuje libovolný řetězec, který se považuje za heslo pro vzdálené provádění admin operací - například pro příkaz na reload domény atd.
Cache
 cache.maintain_intervalUrčuje minimální čas v sekundách, po jakém se spouští vyprázdnění neplatných položek v cache.
Překladače
Dcompiler.pascalCesta na překladač Free Pascalu. Na Windows například "C:\FPC\2.0.4\bin\i386-win32\ppc386.exe" (pozor, nepoužívat fpc386.exe, zlobí přenos dat rourou).
Dcompiler.cCesta na překladač GCC. Na Windows například "C:\cygwin\bin\gcc.exe", na Linuxu "/usr/bin/gcc".
Domény
 domain.properties_fileNázev souboru v adresáři domén s jejich nastavením. Doporučuje se nechat "domain.xml".
 domain.process_fileNázev souboru v adresáři domén s definicí procesu validace. Doporučuje se nechat "process.xml".
 domain.enabledPOZOR, změna, toto nastavení je zrušeno!

Dříve zde byl uveden seznam domén, které jsou aktivní. Bylo změněno tak, že nyní server při startu prochází všechny podadresáře v adresáři domén a aktivuje ty domény, v jejichž konfiguraci je uvedeno nastavení domain.enabled = 1.

Výstupy validovaných programů
Doutput.results_starterŘetězec, kterým ve výstupech programů začíná část, která se porovnává. Defaultně je to "---Vysledky---"
Doutput.multiple_delimiterŘetězec, který v souborech se vzorovými výstupy odděluje více možných vzorových výstupů. Tento řetězec musí být na začátku řádky a tato řádka se poté celá ignoruje (tj. i to, co je za ním se ještě nebere, až další řádka -> těch "rovnítek" může být i víc než pět). Default: "=====".
Doutput.double_cmp_precisionPřesnost při porovnávání desetinných hodnot ve výstupu. Default "0.01"
RMI rozhraní
 rmi.portPort RMI. Doporučuje se nechat defaultní 1099.
 rmi.service_nameNázev RMI služby. Doporučuje se nechat "VS2".
 rmi.server_urlCelá RMI adresa serveru, v ní musí být použit zadaný port a název služby (toto bude časem přepracováno, je to zbytečná duplicita). Například: "rmi://vs.kiv.zcu.cz:1099/VS2".
WebConnector rozhraní - spojení pro studentské soutěže (SSP)
 web.connector.enabled0/1, zda je WebConnector aktivní (aktivní = 1). Default 0.
 web.db.server_nameNázev či IP serveru s MySQL.
 web.db.databaseNázev databáze.
 web.db.user_nameUživatel pro přihlášení do databáze.
 web.db.passwordHeslo

Pro ilustraci je k dispozici ukázkový soubor server.xml.

Zpět na hlavní stránku

autor: Lukáš Valenta, září 2007 (lukas.valenta at seznam.cz)