52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import logging
|
|
import signal
|
|
import threading
|
|
from functools import partial
|
|
|
|
from django.conf import settings
|
|
|
|
from judge.bridge.django_handler import DjangoHandler
|
|
from judge.bridge.judge_handler import JudgeHandler
|
|
from judge.bridge.judge_list import JudgeList
|
|
from judge.bridge.server import Server
|
|
from judge.models import Judge, Submission
|
|
|
|
logger = logging.getLogger("judge.bridge")
|
|
|
|
|
|
def reset_judges():
|
|
Judge.objects.update(online=False, ping=None, load=None)
|
|
|
|
|
|
def judge_daemon():
|
|
reset_judges()
|
|
Submission.objects.filter(status__in=Submission.IN_PROGRESS_GRADING_STATUS).update(
|
|
status="IE", result="IE", error=None
|
|
)
|
|
judges = JudgeList()
|
|
|
|
judge_server = Server(
|
|
settings.BRIDGED_JUDGE_ADDRESS, partial(JudgeHandler, judges=judges)
|
|
)
|
|
django_server = Server(
|
|
settings.BRIDGED_DJANGO_ADDRESS, partial(DjangoHandler, judges=judges)
|
|
)
|
|
|
|
threading.Thread(target=django_server.serve_forever).start()
|
|
threading.Thread(target=judge_server.serve_forever).start()
|
|
|
|
stop = threading.Event()
|
|
|
|
def signal_handler(signum, _):
|
|
logger.info("Exiting due to %s", signal.Signals(signum).name)
|
|
stop.set()
|
|
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
signal.signal(signal.SIGQUIT, signal_handler)
|
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
|
|
try:
|
|
stop.wait()
|
|
finally:
|
|
django_server.shutdown()
|
|
judge_server.shutdown()
|