Skip to content

RainboyOnlineJudge/rjudge

Repository files navigation

rJudge

快速安装

暂缺

设定

vim run.sh

安装:

基本过程如下:

  1. clone这个代码,安装docker,可以使用aliyun的docker加速器
  2. 修改rsync,token的相关参数,建立data文件夹
  • 修改run.sh下的rsync的用户和密码
  • 修改run.sh下的token的密码
  1. 输入命令:docker build -t rjudge .,创建images
  2. sudo docker run --net=host -it -v {你的data地址}:/judge_server/data -p 4999:4999 -p 873:873 -d rjudge

具体安装方法看下面

特性

  • 使用rsync来同步测试数据
  • 使用token
  • 定时删除不用的测试文件
  • 使用qdoj的测评机为后台
  • 使用celery作为评测队列

安装与使用

1.修改Token:

在run.sh里修改token

#修改mytoken为你自己的token
echo "mytoken" > /var/www/rjudge/token.txt

2.修改rsync的密码

run.sh里修改rsync的用户与密码

# rsync 的密码,
echo "server:5978" >/etc/rsyncd.secrets

上传数据:

使用rsync来上传数据

修改run.sh里的rsync用户和密码

# rsync 的密码,
echo "server:5978" >/etc/rsyncd.secrets

同步数据的方法1:使用rsync

#建立一个密码文件
sudo echo 5978 > /etc/rsyncd.secret
sudo chmod 600 /etc/rsyncd.secret
sudo chown root:root /etc/rsyncd.secret
sudo rsync --port 8080 --password-file=/etc/rsyncd.secret -av /databack/ server@<ip>::data

同步数据的方法2:使用lsync

使用lsync可以自动同步

ubuntu 下安装lsyncd

sudo apt-get install lsyncd
#建立一个密码文件
sudo echo 5978 > /etc/rsyncd.secret
# 密码文件可以不在这个路径
sudo chmod 600 /etc/rsyncd.secret
sudo chown root:root /etc/rsyncd.secret

配置文件/etc/lsyncd.conf

settings {
    logfile      ="/var/log/lsyncd.log",
    statusFile   ="/tmp/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 10,
    statusInterval = 1
}

sync {
    default.rsync,
    source    = "/home/server1/test/data/",
    target    = "server@localhost::data",
    delay     = 15,
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true,
        password_file = "/etc/rsyncd.secret"
    }
}

启动:sudo lsyncd /etc/lsyncd.conf

根据你的实际情况修改参数

参数的含义请看:https://axkibe.github.io/lsyncd/manual/config/layer4/

请求测试的方法

先同步评测数据,然后使用http的post方法请求评测

**注意:**所有的请求头都要带有一个token头,

使用nodejsrequests模块

headers = {
  token:"your_token"
}
requests.post(url, json=data, headers).json()

请求地址:http://your_judge_server_ip/judge

请求的json数据

{
  "lang": "cpp",//c cpp 不支持pascal
  "code": "int main() { return 0; }",
  "max_time": 1000,
  "max_memory": 256,//mb
  "problem_id": "1000",
  "r_url":",",//要返回数据的地址
  "judge": "fcmp",
  "revert":{//返回数据的时候把这个部分同样返回
    "id":"your_id"
  }
}

请求数据的含义

  • lang:请求评测代码的类型,可以是:
    • c:c语言
    • cpp:c++语言
    • pas:pascal语言
  • code:请求评测的代码内容
  • max_time:最大时间限制,单位ms
  • max_memroy:最大内存限制,单位mb
  • problem_id:测试数据的id,默认的数据文件夹:/judge_server/data/,如果problem_id:1000,为会就会去找/judge_server/data/1000/下面的测试数据

测试数据命名规范

输入文件:<name><num>.in, 输出文件:<name><num>.out

其中<num>可以从01开始,文件的格式:unix,编码:utf-8 无bom

比如下面的命名是正确的

aplusb1.in aplusb1.out
aplusb2.in aplusb2.out
aplusb3.in aplusb3.out

高级:具体分析数据文件名的代码在:core/utils.py里的import_data函数

返回数据

首先你要有一个http服务器来接收评测机发送的数据,http服务器的地址,就是上面的r_url参数

如果测试成功,返回的数据

{
    "data":[],
    "verdict":0,
    "revert":"revert"
}

否则数据如下:

{
  "data": "... In function 'int main()':\n/ju...",
  "verdict": 6,
  "revert":"revert"
}

一个简单的node http 服务器如下


"verdict"数据的含义如下:
```python
WRONG_ANSWER = -1
ACCEPTED = 0
CPU_TIME_LIMIT_EXCEEDED = 1
REAL_TIME_LIMIT_EXCEEDED = 2
MEMORY_LIMIT_EXCEEDED = 3
RUNTIME_ERROR = 4
SYSTEM_ERROR = 5
COMPILE_ERROR = 6
IDLENESS_LIMIT_EXCEEDED = 7
SUM_TIME_LIMIT_EXCEEDED = 8

result 的结果如下

[
    {result:,memory,time,count}
]

count 代表是第几个评测 memory kb

Okay, that pretty much nails it! Good luck!

评测机运行流程图

http请求过程

1

测评过程

其中roundsetting主要是产生各种参数,产生的参数如下

  • revert
  • r_url
  • judge_indicator
  • code
  • max_time
  • max_memory
  • problem_id
  • round_id:一个随机的字符串,Handler类初始化时传递过来
  • data_dir:和problem_id行成的评测数据路径
  • round_dir:和round_id行成的临时测评路径
  • language_settings:languages.py里对应的语言设定
  • src_name
  • exe_name
  • src_path
  • exe_path
  • compile_out_path
  • compile_log_path
  • compile_cmd
  • seccomp_rule_name

如果没有找到data_dir对应的路径,会出错

2