sprint/CheckerExecutor/main.py
2022-02-16 17:40:46 +03:00

68 lines
2.1 KiB
Python

from multiprocessing import Process
from os import getenv
from os.path import join
from tempfile import TemporaryDirectory
from time import sleep
from zipfile import ZipFile
from requests import get
from language import languages
from testers import *
def process_solution(path, data, language_id, solution_id, timeout):
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).execute()
except Exception as e:
print(str(e))
result = "TE"
return result
def poll(token):
while True:
print(get("http://127.0.0.1:8000/checker/status", params={"token": token}).json())
sleep(2)
def main():
request = get("http://127.0.0.1:8000/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("http://127.0.0.1:8000/checker/available", params={"token": dynamic_token})
if data.status_code == 200:
sleep(2)
continue
elif data.status_code == 201:
with TemporaryDirectory() as tempdir:
result = process_solution(
tempdir,
data.content,
int(data.headers['language_id']),
int(data.headers['solution_id']),
int(data.headers['timeout']),
)
get("http://127.0.0.1:8000/checker/set_result", params={
"token": dynamic_token,
"solution_id": data.headers['solution_id'],
"result": result
})
else:
print("unknown status")
if __name__ == '__main__':
main()