#!/usr/bin/env python3 # -*- coding: utf-8 -*- # program/match-regex # Standardized types do not require authors to specify any control script as # it can be generated on import. However when provided it will overwrite the # default behaivior. import sys import subprocess import re import time def build(ctx): # Add filenames allArgs = ['/usr/bin/make'] # start subprocess in with work_path as cwd p = subprocess.Popen(allArgs, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=ctx.work_path) msgs,errs = p.communicate() retval = p.wait() errs = errs.decode("utf-8") msgs = msgs.decode("utf-8") return retval, errs, msgs def execute(ctx): # if build failed, return early if ctx.build_result[0] != 0: return allArgs = ("/usr/bin/docker run -h oer-worker --user 1001:65534 --rm -v /data/run/jobs/%s/:/data/ --network none kunkel/oer-worker /data/program" % ctx.id).split(" ") print(" ".join(allArgs), file=sys.stderr) p = subprocess.Popen(allArgs, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=ctx.work_path) timeout = 3 poll_period = 0.1 p.poll() while p.returncode is None and timeout > 0: time.sleep(poll_period) timeout -= poll_period p.poll() if timeout <= 0: p.kill() # timed out msgs,errs = p.communicate() retval = p.wait() errs = errs.decode("utf-8") msgs = msgs.decode("utf-8") if timeout <= 0: errs += "\nKilled after timeout!\n" return retval, errs, msgs def grade(ctx): """A function that governs the grading process when different from default. Expected is return value that indicates if the task passed or failed.""" # if build failed, return early and set grade to FAIL if ctx.build_result[0] != 0: return 'FAIL' ctx.execute_result = execute(ctx) #print(ctx.data['data']['regex'], file=sys.stderr) #print(ctx.execute_result, file=sys.stderr) if re.match(ctx.data['data']['regex'], ctx.execute_result[2]) != None: return 'PASS' else: return 'FAIL' def response(ctx): if ctx.build_result[0] != 0: output = ctx.build_result[1] else: output = ctx.execute_result[2] + "\n" + ctx.execute_result[1] grade = ctx.grade_result msg = "" return {'output': output, 'grade': grade, 'msg': msg, 'data': None}