在pi中折腾HUSTOJ

发表于 2018-07-11   |   分类于 未分类  |  访问: 190 次

最近HUSTOJ出了一个RPI分支

手头上的树莓派正巧闲着无事,就试图拿来搭一个试试水
下载解压后大致如下:
QQ截图20180711105905.png
看起来和原版一模一样,不过原版曾今试图搭建过,在编译judge_client时弄了半天,发现缺少好几个库文件,最后只能弃坑。而这回的judge_client.cc的头部可以看到
QQ截图20180711110144.png
不过我已经在pi上装了nginx,我并不想用httpd和apache,所以还是手动的一句句输入安装
打开一下install/install.sh,大致看一下里面的东西(以下操作均默认已是root用户
首先是安装一些依赖

apt-get install make flex g++ clang libmysql++-dev php5-mysql php5-gd mono-gmcs subversion

关于php和mysql也可以自己单独安装,这里我已经都装过了就不再安装,输入这个语句后,安装过的会自动忽略,因此也就没什么好怕的。
接着创建一个judge用户:

/usr/sbin/useradd -m -u 1536 judge

打开core/make.sh看看,都是一些编译命令和复制粘贴,应该没什么关系,于是就直接在core文件夹里输入

make

到此,core部分的judge_client和judge都算是编译安装完成了
这时候返回一级,把整个web直接复制到自己的网站文件夹底下,例如

cp -R web /usr/local/nginx/html

不过这里出现了一些问题,这个hustoj是pi版的,web里面的文件似乎不是很齐全(比如include里面没有pdo.php,但是却在调用),会导致打开网页时出现500报错,所以我删掉了这个web文件夹,再下载了一个master版的,把里面的web文件夹拷到上面,修改web/include/db_info.inc.php第11、12行的mysql账号和密码,之后再用浏览器打开,显示正常。
因为我是从网页端直接上传的,所以不存在添加权限和附属用户、组的问题,不过nginx的访问用户可以从conf文件里看得到,权限等级官方文件给的是771,如果需要也可以去了解一下。
接着再次进入install把jol这个数据库导入到mysql里:

mysql -h localhost -u自己mysql的用户名 -p自己mysql的密码 <db.sql

如果没有报错的话,不出意外打开mysql就可以看得到jol这个数据库了
接着又是一大串复制粘贴,添加附属组用户之类的:

mkdir /home/judge
mkdir /home/judge/etc
mkdir /home/judge/data
mkdir /home/judge/log
mkdir /home/judge/run0
mkdir /home/judge/run1
mkdir /home/judge/run2
mkdir /home/judge/run3
cp java0.policy  judge.conf /home/judge/etc
chown -R judge /home/judge
chgrp -R nginx的访问用户(通常是什么nobody,www-data之类的) /home/judge/data
chgrp -R root /home/judge/etc /home/judge/run?
chmod 775 /home/judge /home/judge/data /home/judge/etc /home/judge/run?

还有个事情就是需要把judged服务添加到init.d文件夹里
进入到core/judged中,如果你已经编译完成就会看到一个judged文件

cp judged /etc/init.d/judged
chmod +x  /etc/init.d/judged
ln -s /etc/init.d/judged /etc/rc3.d/S93judged
ln -s /etc/init.d/judged /etc/rc2.d/S93judged

到此就算告一段落了,此时要做的是:
启动nginx服务
启动php服务
启动mysql服务
启动judged服务
注册一个admin账号,在后台数据库里手动输入sql命令

insert into privilege(user_id,rightstr) values('admin','administrator');

这样网站就有了第一个管理员

后续

我简单地在后台添加了一题helloworld
尝试写c++代码进行提交,但是却死活都是等待中
QQ截图20180711140127.png
这个问题非常令人头大,查阅官方资料,说是只要配置好/home/judge/etc/judge.conf文件和web/include/db_info.inc.php,然后重启judged就行了,不过我修改完judge.conf的数据库的相关配置后却并没有什么卵用,无奈之下,向开源界很出名的METO大佬请求援助,METO大佬看了一眼,发来了五个字符:debug。
于是我迅速的输入

judge_client 1001 0 /home/judge debug

官方的命令解释如图
QQ截图20180711140831.png
之后一切一目了然,在LANG-CV的数组里在前后两个0之间加入给定的CALLID即可,然后重新编译judge_client

cd judge_client
make
chmod +x judge_client
cp judge_client /usr/bin

再次debug后网页端输出
QQ截图20180711141330.png
不过事情还没结束,我又开启后台重判了一遍,这回仍然是永久等待,于是我又陷入了沉思
翻来覆去看代码,但还是看不出什么猫腻,配置文件也看了好几遍,就差把整个提交流程剖析一遍了
不过,最后我还是在网上说的一些资料和自己的分析中看出了一点端倪
之前查阅资料时有看到c语言的编号为0,c++是1,后面还有各个语言都有一个编号
又在judge.conf中看到一个变量叫做OJ_LANG_SET,而它的值只有0
抱着侥幸的心理我把它改成了

OJ_LANG_SET=0,1,2,3,4,5

然后重启judged

pkill -9 judged
judged

于是世界又开始运转了起来,一切又变得如此的美妙
好的,总结就是,只要改了judge_client,就得重新编译,重新把它拷贝过去,并且重启judged服务
如果是无限等待,无限编译都可以debug,然后查看run里面log里的error.out就能分析出原因
以上


后续:2018-08-03
翻看了core里judge_client的代码两天,前前后后看了也将近2k行吧,就为了修它不能评测python的事情,可能python过于高级会使服务器宕机,所以没有支持python的操作,不过把注释去掉以后,python还是没法支持,调试了很久以后,最终也只能在debug下勉强偶尔可以正确执行,网页端提交的话就只能不断RE,并且添加完callid仍然RE报同一个callid,所以就还是不要折腾python的支持吧。

发表新评论

© 2017 Powered by Typecho & Theme Quark