diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index 9bad579..0000000 --- a/config/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# coding=utf-8 diff --git a/config/config.py b/config/config.py deleted file mode 100644 index 89d316b..0000000 --- a/config/config.py +++ /dev/null @@ -1,2 +0,0 @@ -# coding=utf-8 -DB_NAME = "db.sqlite3" diff --git a/judger/client.py b/judger/client.py index d159583..52f6586 100644 --- a/judger/client.py +++ b/judger/client.py @@ -30,7 +30,7 @@ class JudgeClient(object): :param test_case_dir: 测试用例文件夹路径 :return:返回结果list """ - self._language = languages[str(language_code)] + self._language = languages[language_code] self._exe_path = exe_path self._max_cpu_time = max_cpu_time self._max_real_time = max_real_time diff --git a/judger/compiler.py b/judger/compiler.py index d4bca4b..7f40ff1 100644 --- a/judger/compiler.py +++ b/judger/compiler.py @@ -32,5 +32,4 @@ def compile_(language_item, src_path, exe_path): if parse_result["exit_code"] or parse_result["term_sig"] or parse_result["siginaled"] or parse_result["exceed"]: raise CompileError("Compile error") - return exe_path diff --git a/judger/language.py b/judger/language.py index c79b296..a61bd32 100644 --- a/judger/language.py +++ b/judger/language.py @@ -6,14 +6,14 @@ languages = { "name": "c", "src_name": "main.c", "code": 1, - "compile_command": "gcc -DONLINE_JUDGE -O2 -w -std=c99 -pipe {src_path} -lm -o {exe_path}main", + "compile_command": "gcc -DONLINE_JUDGE -O2 -w -std=c99 {src_path} -lm -o {exe_path}main", "execute_command": "{exe_path}main" }, 2: { "name": "cpp", "src_name": "main.cpp", "code": 2, - "compile_command": "g++ -DONLINE_JUDGE -O2 -w -std=c++11 -pipe {src_path} -lm -o {exe_path}main", + "compile_command": "g++ -DONLINE_JUDGE -O2 -w -std=c++11 {src_path} -lm -o {exe_path}main", "execute_command": "{exe_path}main" }, 3: { diff --git a/judger/run.py b/judger/run.py index 70d6db2..1e83bb8 100644 --- a/judger/run.py +++ b/judger/run.py @@ -8,14 +8,8 @@ from client import JudgeClient from language import languages from compiler import compile_ from result import result -from settings import judger_workspace +from settings import judger_workspace, mongodb_config -import sys -import os -sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..')) -print sys.path - -from oj import settings # 简单的解析命令行参数 # 参数有 -solution_id -time_limit -memory_limit -test_case_id @@ -26,16 +20,13 @@ time_limit = args[4] memory_limit = args[6] test_case_id = args[8] - -mongodb_setting = settings.DATABASES["mongodb"] -connection = pymongo.MongoClient(host=mongodb_setting["HOST"], port=mongodb_setting["PORT"]) +connection = pymongo.MongoClient(host=mongodb_config["host"], port=mongodb_config["port"]) collection = connection["oj"]["oj_submission"] submission = collection.find_one({"_id": ObjectId(solution_id)}) if not submission: exit() - # 将代码写入文件 language = languages[submission["language"]] src_path = judger_workspace + "run/" + language["src_name"] @@ -47,18 +38,18 @@ f.close() try: exe_path = compile_(language, src_path, judger_workspace + "run/") except Exception as e: - print e - print [{"result": result["compile_error"]}] + print {"result": result["compile_error"]} exit() - try: - client = JudgeClient(language_code=language, + client = JudgeClient(language_code=submission["language"], exe_path=exe_path, max_cpu_time=int(time_limit), max_real_time=int(time_limit) * 2, max_memory=int(memory_limit), - test_case_dir="/var/judger/test_case/" + str(test_case_id) + "/") + test_case_dir= judger_workspace + "test_case/" + test_case_id + "/") print client.run() except Exception as e: print e + print {"result": result["system_error"]} + diff --git a/judger/settings.py b/judger/settings.py index 8fea94b..b70f454 100644 --- a/judger/settings.py +++ b/judger/settings.py @@ -11,5 +11,12 @@ lrun_uid = 1001 # lrun用户组gid lrun_gid = 1002 -#judger工作目录 +# judger工作目录 judger_workspace = "/var/judger/" + +mongodb_config = { + "host": "192.168.59.3", + "username": "root", + "password": "root", + "port": 27017 +} diff --git a/judger_controller/celery.py b/judger_controller/celery.py index d7e0d47..35ba2ac 100644 --- a/judger_controller/celery.py +++ b/judger_controller/celery.py @@ -1,5 +1,10 @@ # coding=utf-8 from __future__ import absolute_import from celery import Celery +from .settings import redis_config -app = Celery("judge", broker="redis://localhost:6379/0", include=["judger_controller.tasks"]) \ No newline at end of file +app = Celery("judge", broker="redis://" + + redis_config["host"] + ":" + + str(redis_config["port"]) + + "/" + str(redis_config["db"]), + include=["judger_controller.tasks"]) diff --git a/judger_controller/settings.py b/judger_controller/settings.py new file mode 100644 index 0000000..4d492eb --- /dev/null +++ b/judger_controller/settings.py @@ -0,0 +1,6 @@ +# coding=utf-8 +redis_config = { + "host": "127.0.0.1", + "port": 6379, + "db": 0 +} \ No newline at end of file diff --git a/judger_controller/tasks.py b/judger_controller/tasks.py index 9ac6007..054452c 100644 --- a/judger_controller/tasks.py +++ b/judger_controller/tasks.py @@ -8,13 +8,13 @@ import subprocess32 as subprocess def judge(solution_id, time_limit, memory_limit, test_case_id): try: subprocess.call("docker run -t -i --privileged --rm=true " - "-v /var/test_case/:/var/judger/test_case/ " + "-v /Users/virusdefender/Desktop/test_case/:/var/judger/test_case/ " "-v /Users/virusdefender/Desktop/:/var/judger/code/ " - "-p 27017:27017 " "judger " "python judger/run.py " "--solution_id %s --time_limit %s --memory_limit %s --test_case_id %s" % (solution_id, str(time_limit), str(memory_limit), test_case_id), - timeout=(time_limit / 100) * 20, shell=True) + # 如果设置的最长运行时间小于1000毫秒,那么/1000就是0,处理一下这个情况,设置为两秒 + timeout=(time_limit / 1000 * 3) or 2, shell=True) except subprocess.TimeoutExpired: print "docker timeout" diff --git a/oj/local_settings.py b/oj/local_settings.py index 2f38496..eff9818 100644 --- a/oj/local_settings.py +++ b/oj/local_settings.py @@ -7,6 +7,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 下面是需要自己修改的 LOG_PATH = "LOG/" +# 注意这是web 服务器访问的地址,判题度武器访问的地址不一定一样,因为可能不在一台机器上 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', @@ -24,5 +25,6 @@ DATABASES = { DEBUG = True -TEST_CASE_DIR = "/var/test_case/" +# 同理 这是 web 服务器的上传路径 +TEST_CASE_DIR = "/Users/virusdefender/Desktop/test_case/" diff --git a/static/src/js/app/oj/problem/problem.js b/static/src/js/app/oj/problem/problem.js index 5b10211..fd544cf 100644 --- a/static/src/js/app/oj/problem/problem.js +++ b/static/src/js/app/oj/problem/problem.js @@ -1,4 +1,4 @@ -require(["jquery", "code_mirror"], function ($, code_mirror) { +require(["jquery", "code_mirror", "csrf"], function ($, code_mirror, csrfHeader) { var code_editor = code_mirror($("#code-editor")[0], "text/x-csrc"); var language = "1"; @@ -21,7 +21,11 @@ require(["jquery", "code_mirror"], function ($, code_mirror) { $("#submit-code-button").click(function () { show_loading(); $.ajax({ - + beforeSend: csrfHeader, + url: "/api/submission/", + method: "post", + data: JSON.stringify({problem_id: 2, language: language, code: code_editor.getValue()}), + contentType: "application/json" }); setTimeout( function () { diff --git a/submission/views.py b/submission/views.py index 993de50..7d2ef23 100644 --- a/submission/views.py +++ b/submission/views.py @@ -32,6 +32,7 @@ class SubmissionnAPIView(APIView): serializer = CreateSubmissionSerializer(data=request.data) if serializer.is_valid(): data = serializer.data + # data["language"] = int(data["language"]) data["user_id"] = request.user.id data["result"] = result["waiting"] try: