You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.4 KiB
Python

from flask import Flask, request
import random
import os
import subprocess
import time
import traceback
app = Flask(__name__)
USER_NAME = "ubuntu"
TIMEOUT_S = 10
CGROUP_PATH = "/sys/fs/cgroup/rocker"
ROCKER_PATH = f"/home/{USER_NAME}/rocker/target/debug/rocker"
HANDLER_FILE = "handler.py"
HANDLER_CODE = ""
with open(f"./{HANDLER_FILE}") as f:
HANDLER_CODE = f.read()
@app.route("/", methods=["POST"])
def main():
code = request.json.get("code", "")
language = request.json.get("language", "")
_id = str(random.randint(8000_0000, 9000_0000))
resp = {"msg": "", "code": code, "id": _id, "rt": 0.0}
if len(code) > 1_0000:
resp["msg"] = "代码过长"
return resp
user_path = f"/tmp/{_id}"
os.mkdir(user_path)
with open(f"{user_path}/code", "w") as f:
f.write(code)
with open(f"{user_path}/{HANDLER_FILE}", "w") as f:
f.write(HANDLER_CODE)
starat = time.time()
try:
_ = subprocess.run(["sudo", ROCKER_PATH,
"--id", _id,
"--image", "base_ubuntu_image",
"--run", f"python3 -u /tmp/handler.py {language} {TIMEOUT_S}",
"--env", f"/home/{USER_NAME}/rocker/quant.env",
"--volume", f"{user_path}:/tmp",
"--log"])
except Exception as e:
resp["msg"] += f"{traceback.format_exc()}\n"
print(e)
# 20s 超时
procs_path = f"{CGROUP_PATH}/{_id}/cgroup.procs"
for _ in range(int(TIMEOUT_S * 2 / 0.01)): # *2 留出冗余
time.sleep(0.01)
try:
with open(procs_path) as f:
procs = [proc for proc in f.read().split("\n") if proc != ""]
if len(procs) == 0:
break
except Exception as e:
break
resp["rt"] = time.time() - starat
# 读取文件
log_path = f"/home/rocker/containers/{_id}/upper/logs/log"
try:
with open(log_path) as f:
log_str = f"{f.read()}\n"
resp["msg"] += log_str
except Exception as e:
resp["msg"] += f"{traceback.format_exc()}\n"
resp["msg"] = resp["msg"][:10000].rstrip()
subprocess.run(["sudo", ROCKER_PATH,
"--rm", _id])
subprocess.run(["sudo", "rm", "-rf", user_path])
return resp
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8011, threaded=True)