從代碼上HUSTOJ分爲兩大部分,core和web,分別對應判題和數據管理兩大功能。php
二者之間數據交換有兩種方式:一、經過數據庫,輪詢。二、經過w3m實現的http請求。css
兩種方式的選擇在判題端的配置文件/home/judge/etc/judge.conf中,HTTP_JUDGE=1則啓用後者,默認爲前者。前端
core分3部分,judged、judge_client、simjava
其中judged爲服務進程,d即daemon。負責輪詢數據庫或web端,提取判題隊列。node
當發現新任務時產生judge_client進程。python
judge_client進程爲實際判題程序,負責準備運行環境、數據,運行並監控目標程序的系統調用,採集運行指標,判斷運行結果。mysql
當配置爲啓用抄襲檢查時,judge_client將調用sim,判斷類似性結果,並寫回數據庫或web端。linux
sim爲第三方應用程序,可進行語法分析判斷文本類似度,經過檢驗的程序將由judge_client複製進題目數據的ac目錄,成爲新的參考樣本。git
w3m是linux下一個開源web文本瀏覽器,提供了基於命令行的http交互功能,這裏用作http客戶端,用curl-lib應該也能夠實現,本人熟悉w3m不熟悉curl,所以偷懶。github
web分兩大部分,前端和admin目錄下的管理程序。
前端無非是數據庫的CRUD操做,關鍵功能是將用戶提交的程序源碼加入數據庫的任務隊列(solution表、souce_code表)。
管理程序提供具備administrator等高級權限的帳號管理試題、帳號等方面的功能。
其中FPS導入導出程序主要爲XML格式的數據處理。
特別的,judged能夠多重啓動,經過增長基準目錄參數指定啓動位置(默認/home/judge),從而肯定judge.conf的位置,並肯定其餘參數。
所以不但能夠一個web服務器下掛多個判題服務器,也能夠一臺物理機器上同時啓動任意多個相互獨立的OJ系統。
實際使用中,使用開源的ispcp虛擬主機管理系統搭建多Web環境與hustoj協同工做取得了良好效果。
LiveCD的實現,經過uck工具解壓出ubuntulivecd的chroot環境,並在其中刪除oo、gnome等大型程序釋放空間,而後用apt工具安裝基礎環境,安裝配置lxde和hustoj。再使用uck從新打包造成iso。
升級方式:利用googlecode的svn服務,用svn客戶端分別升級core和web,再編譯core,並經過web提供可能的數據庫升級。
livecd中的升級腳本爲updagte-hustoj,能夠用which命令查找其實際位置
------------------------------------------------------------
0、 準備知識
a) 最新系統源碼能夠用svn取得,或在下述地址直接瀏覽
i. http://code.google.com/p/hustoj/source/browse/ 牆外老版
ii. https://github.com/zhblue/hustoj 無牆新版
b) 系統分爲Web和Core兩個部分
c) 簡化ER圖
d) Web與core的鏈接方式有兩種,實際運行可選其中一種
i. 數據庫鏈接【默認】
1. Web插入Solution表
2. core輪詢solution表,發現新紀錄
3. core更新solution表result等字段
4. Web端輪詢soltuion顯示result等字段。
ii. HTTP方式
1. Web插入Solution表
2. core訪問Web端admin/problem_judge.php,發現新紀錄
3. core向Web端admin/problem_judge.php提交數據,problem_judge.php更新solution表result等字段
4. Web端輪詢soltuion顯示result等字段。
一、 Web部分
a) 閱讀配置文件,弄清各設置含義
i. 參考
static $DB_HOST="localhost"; 數據庫的服務器地址
static $DB_NAME="jol"; 數據庫名
static $DB_USER="root"; 數據庫用戶名
static $DB_PASS="root"; 數據庫密碼
// connect db
static $OJ_NAME="HUSTOJ"; OJ的名字,將取代頁面標題等位置HUSTOJ字樣。
static $OJ_HOME="./"; OJ的首頁地址
static $OJ_ADMIN="root@localhost"; 管理員email
static $OJ_DATA="/home/judge/data"; 測試數據所在目錄,實際位置。
static $OJ_BBS="discuss";//"bbs" 論壇的形式,discuss爲自帶的簡單論壇,bbs爲外掛論壇,參考bbs.php代碼。
static $OJ_ONLINE=false; 是否使用在線監控,須要消耗必定的內存和計算,所以若是併發大建議關閉
static $OJ_LANG="en"; 默認的語言,中文爲cn
static $OJ_SIM=true; 是否顯示類似度檢測的結果。
static $OJ_DICT=true; 是否啓用在線英字典
static $OJ_LANGMASK=1008; //1mC 2mCPP 4mPascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language 用掩碼錶示的OJ接受的提交語言,能夠被比賽設定覆蓋。
static $OJ_EDITE_AREA=true;// 是否啓用高亮語法顯示的提交界面,能夠在線編程,無須IDE。
static $OJ_AUTO_SHARE=false;//true: 自動分享代碼,啓用的話,作出一道題就能夠在該題的Status中看其餘人的答案。
static $OJ_CSS="hoj.css"; 默認的css,能夠選擇dark.css和gcode.css,具備有限的界面制定效果。
static $OJ_SAE=false; //是不是在新浪的雲平臺運行web部分
static $OJ_VCODE=true; 是否啓用圖形登陸、註冊驗證碼。
static $OJ_APPENDCODE=false; 是否啓用自動添加代碼,啓用的話,提交時會參考$OJ_DATA對應目錄裏是否有append.c一類的文件,有的話會把其中代碼附加到對應語言的答案以後,巧妙使用能夠指定main函數而要求學生編寫main部分調用的函數。
static $OJ_MEMCACHE=false;是否使用memcache做爲頁面緩存,若是不啓用則用/cache目錄
static $OJ_MEMSERVER="127.0.0.1"; memcached的服務器地址
static $OJ_MEMPORT=11211; memcached的端口
static $OJ_RANK_LOCK_PERCENT=0; //比賽封榜時間的比率,如5小時比賽設爲0.2則最後1小時封榜。
static $OJ_SHOW_DIFF=false; //顯示WrongAnswer時的對比
b) 制定本身的前臺模板(即改變頁面效果)
i. 複製template/bs3目錄,放置在template目錄中,並改成新模板名。
ii. 在db_info.inc.php中修改$OJ_TEMPLATE變量爲新模板名
iii. 瀏覽前臺,打開要修改的頁面,根據地址欄修改新目錄中對應的php、css、images等文件,保存後刷新頁面看修改效果。
c) 模板制定成功之後應該有足夠的知識開始修改template目錄之外的部分了
d) 論壇
i. 建議集成GPL的phpbb,參考。
ii. 集成Discuz
1. 建議購買商業許可。
2. 參考/web/include/login-discuz.php
e) 比賽根據數據經過率排名,而不僅看AC數量
i. 數據庫solution表pass_rate字段表示改條經過率。
ii. 把contestrank.php中的solved字段變成浮點對待。
iii. 這裏,修改積分方式,按照但願的方式積分。可能須要給TM增長字段$p_wa_best_rate記錄每題最大經過率。
f) 對有志於重寫整個前臺的勇士
i. 但願你選擇一種魔法師編程語言(node.js/ror/python/go)。
ii. 若是作不到前面那條,請作好長時間開發的心理準備。
iii. 理論上任何現存web編程模型均可以,推薦JSP/SSH(前方高能坑……)。
iv. 建議實現admin/problem_judge.php的仿真,方便直接集成原版core。(get/post/ servlet-mapping)
二、 Core部分
a) 閱讀配置文件,弄清各設置含義
i. 參考
judge.conf 不要複製下面的註釋進入實際文件,judged和judge_client不能識別#註釋。
OJ_HOST_NAME=127.0.0.1 #mysql host ip
OJ_USER_NAME=root #mysql host username
OJ_PASSWORD=root #mysql host password
OJ_DB_NAME=jol #mysql DB name
OJ_PORT_NUMBER=3306 #mysql port
OJ_RUNNING=4 #max concurrent threads number of judge_client
OJ_SLEEP_TIME=5 #judged work interval
OJ_TOTAL=1 #Deprecated: total number of judged (hosts/processes)
OJ_MOD=0 #Deprecated: the number of this judged(host)
OJ_JAVA_TIME_BONUS=2 #java's extral time
OJ_JAVA_MEMORY_BONUS=512 #java's extral memory
OJ_SIM_ENABLE=0 #using sim
OJ_HTTP_JUDGE=0 #using http link to database(if enabled,mysql is not used anymore)
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline #http link basedir
OJ_HTTP_USERNAME=admin #account in db that has http_judge privilege
OJ_HTTP_PASSWORD=admin #password of this account
OJ_OI_MODE=0 #using oi (Olympiad in Informatics) mode
OJ_SHM_RUN=0 #using /dev/shm for fast running & low harddisk wear
OJ_USE_MAX_TIME=0 #use the max time of all testcase rather than total time
OJ_LANG_SET=0,1,2,3,4 #selective judge solution of languagesOJ_HOST_NAME=127.0.0.1 若是用mysql鏈接讀取數據庫,數據庫的主機地址
OJ_USER_NAME=root 數據庫賬號
OJ_PASSWORD=root 數據庫密碼
OJ_DB_NAME=jol 數據庫名稱
OJ_PORT_NUMBER=3306 數據庫端口
OJ_RUNNING=4 judged會啓動judge_client判題,這裏規定最多同時運行幾個judge_client
OJ_SLEEP_TIME=5 judged經過輪詢數據庫發現新任務,輪詢間隔的休息時間,單位秒
OJ_TOTAL=1 老式併發處理中總的judged數量
OJ_MOD=0 老式併發處理中,本judged負責處理solution_id按照TOTAL取模後餘數爲幾的任務。
OJ_JAVA_TIME_BONUS=2 Java等虛擬機語言得到的額外運行時間。
OJ_JAVA_MEMORY_BONUS=512 Java等虛擬機語言得到的額外內存。
OJ_SIM_ENABLE=0 是否使用sim進行代碼類似度的檢測
OJ_HTTP_JUDGE=0 是否使用HTTP方式鏈接數據庫,若是啓用,則前面的HOST_NAME等設置忽略。
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline 使用HTTP方式鏈接數據庫的基礎地址,就是OJ的首頁地址。
OJ_HTTP_USERNAME=admin 使用HTTP方式所用的用戶賬號(HTTP_JUDGE權限),該賬號登陸時不能啓用VCODE圖形驗證碼,但能夠登陸成功後啓用。
OJ_HTTP_PASSWORD=admin 密碼
OJ_OI_MODE=0 是否啓用OI模式,即不管是否出錯都繼續判剩餘的數據,在ACM比賽中一旦出錯就中止運行。
OJ_SHM_RUN=0 是否使用/dev/shm的共享內存虛擬磁盤來運行答案,若是啓用能提升判題速度,但須要較多內存。
OJ_USE_MAX_TIME=1 是否使用全部測試數據中最大的運行時間做爲最後運行時間,若是不啓用則以全部測試數據的總時間做爲超時判斷依據。
OJ_LANG_SET=0,1,2,3,4 #判哪些語言的題目
OJ_COMPILE_CHROOT=0 是否在編譯時使用chroot環境,避免某些編譯期攻擊。
OJ_TURBO_MODE=0 是否放棄用戶表和問題表的數據一致性,以在大型比賽中添加更多的判題機來提升判題速度。
ii. 源碼https://github.com/zhblue/hustoj/blob/master/trunk/core/judge_client/
b) 查閱Linux文檔中關於下述關鍵詞的內容
i. Ptrace
ii. Chroot
iii. Setuid
iv. Proc
v. shm
c) 全部API限定在okcalls.h
d) 代碼查重工具sim
i. https://github.com/zhblue/hustoj/tree/master/trunk/core/sim
e) 對於計劃改造Core來適應你本身的OJ前臺的朋友
i. 參考1.c.iv
ii. 在judge_client.cc中搜索關鍵詞wget
f) HUSTOJ的沙箱模型
i. 相對openjudge.net的sandbox libraries而言並不嚴謹
ii. 對於OJ而言,基本知足需求
iii. 容易理解、容易實現、容易修改
f) 莫名其妙的Runtime Error,請點擊RuntimeError打開詳細信息,並作英譯漢。
對於okcalls23/64.h進行修改,請只修改符合你的操做系統架構(32位/64位)的那個,0只能在首位,末尾必須爲0。非0callid請加在中間任意位置。
CSDN網友的源碼註釋
http://blog.csdn.net/legan/article/details/40746829
http://blog.csdn.net/legan/article/details/40789939
result對應狀態
0: "等待"
1: "等待重判"
2: "編譯中"
3: "運行並評判"
4: "正確"
5: "格式錯誤"
6: "答案錯誤"
7: "時間超限"
8: "內存超限"
9: "輸出超限"
10: "運行錯誤"
11: "編譯錯誤"
12: "編譯成功"
13: "運行完成"
文檔
https://github.com/zhblue/hustoj/blob/master/wiki/hustoj%E6%96%87%E6%A1%A3%E5%A4%A7%E5%85%A8.pdf