85 lines
2.5 KiB
Python
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()
|