mirror of https://github.com/EasyCTF/librectf
84 lines
2.1 KiB
Python
84 lines
2.1 KiB
Python
import logging
|
|
import os
|
|
import shutil
|
|
import signal
|
|
import sys
|
|
import time
|
|
import tempfile
|
|
import traceback
|
|
|
|
import executor
|
|
from api import API
|
|
from models import Job
|
|
|
|
logger = logging.getLogger(__name__)
|
|
logger.setLevel(logging.INFO)
|
|
logging.info("Starting up")
|
|
|
|
|
|
api = None
|
|
judge_url = None
|
|
current_job = None # type: Job
|
|
|
|
|
|
def loop():
|
|
global current_job
|
|
job = api.claim()
|
|
current_job = job
|
|
if not job:
|
|
logger.debug("No jobs available.")
|
|
return False
|
|
logger.info("Got job %d.", job.id)
|
|
|
|
tempdir = tempfile.mkdtemp(prefix="jury-")
|
|
try:
|
|
for execution_result in executor.run_job(job, tempdir):
|
|
# execution_result is partial here
|
|
|
|
logger.info(
|
|
"Job %d partially judged; case: %d, time: %.2f, memory: %d",
|
|
job.id,
|
|
execution_result.last_ran_case,
|
|
execution_result.execution_time,
|
|
execution_result.execution_memory,
|
|
)
|
|
|
|
if execution_result.verdict:
|
|
# This should be the last value returned by run_job
|
|
logger.info(
|
|
"Job %d finished with verdict %s."
|
|
% (job.id, execution_result.verdict.value)
|
|
)
|
|
|
|
if api.submit(execution_result):
|
|
logger.info("Job %d successfully partially submitted." % job.id)
|
|
else:
|
|
logger.info("Job %d failed to partially submit." % job.id)
|
|
except:
|
|
traceback.print_exc(file=sys.stderr)
|
|
shutil.rmtree(tempdir, ignore_errors=True)
|
|
finally:
|
|
shutil.rmtree(tempdir, ignore_errors=True)
|
|
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
api_key = os.getenv("API_KEY")
|
|
if not api_key:
|
|
print("no api key", file=sys.stderr)
|
|
sys.exit(1)
|
|
judge_url = os.getenv("JUDGE_URL")
|
|
if not judge_url:
|
|
print("no judge url", file=sys.stderr)
|
|
sys.exit(1)
|
|
api = API(api_key, judge_url)
|
|
while True:
|
|
try:
|
|
if not loop():
|
|
time.sleep(3)
|
|
except KeyboardInterrupt:
|
|
sys.exit(0)
|
|
except:
|
|
traceback.print_exc(file=sys.stderr)
|