sprint/CheckerExecutor/main.py
Egor Matveev 90f5ea525a checkers
2022-02-24 21:58:49 +03:00

85 lines
2.5 KiB
Python

from multiprocessing import Process
from os import getenv, mkdir
from os.path import join, exists
from shutil import rmtree
from tempfile import TemporaryDirectory
from time import sleep
from zipfile import ZipFile
from requests import get
from language import languages
from testers import *
host = "http://dev.sprinthub.ru/"
def process_solution(path, data, language_id, solution_id, timeout, token, host):
with open(join(path, "package.zip"), 'wb') as fs:
fs.write(data)
with ZipFile(join(path, "package.zip"), 'r') as zip_ref:
zip_ref.extractall(path)
language = languages[language_id]
try:
result = eval(language.work_name + "Tester")(path, solution_id, language_id, timeout, token, host).execute()
except Exception as e:
print(str(e))
result = "TE"
return result
def poll(token):
correct_token = True
while correct_token:
code = get(f"{host}checker/status", params={"token": token}).status_code
if code != 200:
correct_token = False
else:
sleep(2)
def main():
request = get(f"{host}checker/get_dynamic", params={"token": getenv("TOKEN")})
if request.status_code != 200:
print("Error happened: " + request.json()['status'])
exit(1)
dynamic_token = request.json()['token']
p = Process(target=poll, args=(dynamic_token,))
p.start()
while True:
data = get(f"{host}checker/available", params={"token": dynamic_token})
if data.status_code == 200:
sleep(2)
continue
elif data.status_code == 201:
tempdir = "/var/tmp/solution/"
try:
mkdir(tempdir)
result = process_solution(
tempdir,
data.content,
int(data.headers['language_id']),
int(data.headers['solution_id']),
int(data.headers['timeout']),
dynamic_token,
host
)
get(f"{host}checker/set_result", params={
"token": dynamic_token,
"solution_id": data.headers['solution_id'],
"result": result
})
finally:
if exists(tempdir):
rmtree(tempdir)
elif data.status_code == 403:
print("token removed")
exit(1)
else:
print("unknown status")
exit(1)
if __name__ == '__main__':
main()