From 5610ad32e875418a0b7302989efe963f551d7a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Drago=C8=99-Iulian=20ARGINT?= <dragos.argint@stud.acs.upb.ro> Date: Sun, 30 Apr 2023 22:51:05 +0300 Subject: [PATCH] Update checker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: DragoČ-Iulian ARGINT <dragos.argint@stud.acs.upb.ro> --- checker/checker.sh | 68 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/checker/checker.sh b/checker/checker.sh index de53830..5bf75b4 100755 --- a/checker/checker.sh +++ b/checker/checker.sh @@ -5,12 +5,14 @@ SO2_WORKSPACE=/linux/tools/labs ASSIGNMENT0_MOD=list.ko ASSIGNMENT0_DIR=${SO2_WORKSPACE}/skels/assignments/0-list +ASSIGNMENT0_CHECKER_LOCAL_DIR=checker/0-list-checker ASSIGNMENT0_CHECKER_DIR=${SO2_WORKSPACE}/skels/assignments/0-list-checker ASSIGNMENT0_OUTPUT=${SO2_WORKSPACE}/skels/0-list-output ASSIGNMENT0_FINISHED=${SO2_WORKSPACE}/skels/0-list-finished ASSIGNMENT1_MOD=tracer.ko ASSIGNMENT1_DIR=${SO2_WORKSPACE}/skels/assignments/1-tracer +ASSIGNMENT1_CHECKER_LOCAL_DIR=checker/1-tracer-checker ASSIGNMENT1_CHECKER_DIR=${SO2_WORKSPACE}/skels/assignments/1-tracer-checker ASSIGNMENT1_OUTPUT=${SO2_WORKSPACE}/skels/1-tracer-output ASSIGNMENT1_FINISHED=${SO2_WORKSPACE}/skels/1-tracer-finished @@ -19,6 +21,7 @@ ASSIGNMENT1_CHECKER_AUX_LIST="${ASSIGNMENT1_CHECKER_DIR}/_helper/tracer_helper.k ASSIGNMENT2_MOD=uart16550.ko ASSIGNMENT2_DIR=${SO2_WORKSPACE}/skels/assignments/2-uart +ASSIGNMENT2_CHECKER_LOCAL_DIR=checker/2-uart-checker ASSIGNMENT2_CHECKER_DIR=${SO2_WORKSPACE}/skels/assignments/2-uart-checker ASSIGNMENT2_OUTPUT=${SO2_WORKSPACE}/skels/2-uart-output ASSIGNMENT2_FINISHED=${SO2_WORKSPACE}/skels/2-uart-finished @@ -27,6 +30,7 @@ ASSIGNMENT2_CHECKER_AUX_LIST="${ASSIGNMENT2_CHECKER_DIR}/_test/solution.ko" ASSIGNMENT3_MOD=ssr.ko ASSIGNMENT3_DIR=${SO2_WORKSPACE}/skels/assignments/3-raid +ASSIGNMENT2_CHECKER_LOCAL_DIR=checker/3-raid-checker ASSIGNMENT3_CHECKER_DIR=${SO2_WORKSPACE}/skels/assignments/3-raid-checker ASSIGNMENT3_OUTPUT=${SO2_WORKSPACE}/skels/3-raid-output ASSIGNMENT3_FINISHED=${SO2_WORKSPACE}/skels/3-raid-finished @@ -40,12 +44,38 @@ usage() exit 1 } + + +recover_grade_from_timeout() +{ + local output=$1 + if [ ! -f $output ]; then + echo "$output not available" + else + points_total=$(echo $(cat $output | grep "....passed" | egrep -o "/.*[0-9]+\.*[0-9]*.*\]" | egrep -o "[0-9]+\.*[0-9]*" | head -n 1)) + list=$(echo $(cat $output | grep "....passed" | egrep -o "\[.*[0-9]+\.*[0-9]*.*\/" | egrep -o "[0-9]+\.*[0-9]*") | sed -e 's/\s\+/,/g') + recovered_points=$(python3 -c "print(sum([$list]))") + echo "Recovered from timeout => Total: [$recovered_points/$points_total]" + echo "Please note that this is not a DIRECT checker output! Other penalties may be applied!" + echo "Please contact a teaching assistant" + python3 -c "print('Total: ' + str(int ($recovered_points * 100 / $points_total)) + '/' + '100')" + fi +} + timeout_exceeded() { - echo TIMEOUT EXCEEDED !!! killing the process - echo "<VMCK_NEXT_END>" + local output=$1 pkill -SIGKILL qemu - exit 1 + echo "" + echo "TIMEOUT EXCEEDED !!! killing the process" + if [[ $RECOVER_GRADE_TIMEOUT == 0 ]]; then + echo "The Recover Grade Timeout option is not set! Please contact a teaching assistant!" + else + recover_grade_from_timeout $output + fi + echo "<VMCK_NEXT_END>" + # exit successfully for vmchecker-next to process output + exit 0 # TODO: fixme } compute_total() @@ -84,18 +114,22 @@ run_checker() { local assignment_mod=$1 local assignment_dir=$2 - local checker_dir=$3 - local output=$4 - local finished=$5 - local assignment=$6 - local header_overwrite=$7 - local aux_modules=$8 + local local_checker_dir=$3 + local checker_dir=$4 + local output=$5 + local finished=$6 + local assignment=$7 + local header_overwrite=$8 + local aux_modules=$9 local module_path="${assignment_dir}/${assignment_mod}" echo "Copying the contents of src/ into $assignment_dir" cp src/* $assignment_dir + echo "Copying the contents of $local_checker_dir into $checker_dir" + cp -r $local_checker_dir/* $checker_dir + echo "Checking if $assignment_mod exists before build" if [ -f $module_path ]; then echo "$assignment_mod shouldn't exists. Removing ${module_path}" @@ -134,7 +168,7 @@ run_checker() if [ ! -f $module_path ]; then error_message $assignment_mod # exit successfully for vmchecker-next to process output - exit 0 # TODO: changeme + exit 0 # TODO: fixme fi # copy *.ko in checker @@ -161,7 +195,7 @@ run_checker() dump_output $output compute_total $output fi - timeout_exceeded + timeout_exceeded $output fi sleep 2 (( timeout += 2 )) @@ -175,16 +209,20 @@ run_checker() case $1 in 0-list) - run_checker $ASSIGNMENT0_MOD $ASSIGNMENT0_DIR $ASSIGNMENT0_CHECKER_DIR $ASSIGNMENT0_OUTPUT $ASSIGNMENT0_FINISHED $1 + RECOVER_GRADE_TIMEOUT=0 # If set to 1, in case of a timeout, will calculate the total grade based on the output directory + run_checker $ASSIGNMENT0_MOD $ASSIGNMENT0_DIR $ASSIGNMENT0_CHECKER_LOCAL_DIR $ASSIGNMENT0_CHECKER_DIR $ASSIGNMENT0_OUTPUT $ASSIGNMENT0_FINISHED $1 ;; 1-tracer) - run_checker $ASSIGNMENT1_MOD $ASSIGNMENT1_DIR $ASSIGNMENT1_CHECKER_DIR $ASSIGNMENT1_OUTPUT $ASSIGNMENT1_FINISHED $1 $ASSIGNMENT1_HEADER_OVERWRITE $ASSIGNMENT1_CHECKER_AUX_LIST + RECOVER_GRADE_TIMEOUT=0 # If set to 1, in case of a timeout, will calculate the total grade based on the output directory + run_checker $ASSIGNMENT1_MOD $ASSIGNMENT1_DIR $ASSIGNMENT1_CHECKER_LOCAL_DIR $ASSIGNMENT1_CHECKER_DIR $ASSIGNMENT1_OUTPUT $ASSIGNMENT1_FINISHED $1 $ASSIGNMENT1_HEADER_OVERWRITE $ASSIGNMENT1_CHECKER_AUX_LIST ;; 2-uart) - run_checker $ASSIGNMENT2_MOD $ASSIGNMENT2_DIR $ASSIGNMENT2_CHECKER_DIR $ASSIGNMENT2_OUTPUT $ASSIGNMENT2_FINISHED $1 $ASSIGNMENT2_HEADER_OVERWRITE $ASSIGNMENT2_CHECKER_AUX_LIST + RECOVER_GRADE_TIMEOUT=1 # If set to 1, in case of a timeout, will calculate the total grade based on the output directory + run_checker $ASSIGNMENT2_MOD $ASSIGNMENT2_DIR $ASSIGNMENT2_CHECKER_LOCAL_DIR $ASSIGNMENT2_CHECKER_DIR $ASSIGNMENT2_OUTPUT $ASSIGNMENT2_FINISHED $1 $ASSIGNMENT2_HEADER_OVERWRITE $ASSIGNMENT2_CHECKER_AUX_LIST ;; 3-raid) - run_checker $ASSIGNMENT3_MOD $ASSIGNMENT3_DIR $ASSIGNMENT3_CHECKER_DIR $ASSIGNMENT3_OUTPUT $ASSIGNMENT3_FINISHED $1 $ASSIGNMENT3_HEADER_OVERWRITE $ASSIGNMENT3_CHECKER_AUX_LIST + RECOVER_GRADE_TIMEOUT=0 # If set to 1, in case of a timeout, will calculate the total grade based on the output directory + run_checker $ASSIGNMENT3_MOD $ASSIGNMENT3_DIR $ASSIGNMENT3_CHECKER_LOCAL_DIR $ASSIGNMENT3_CHECKER_DIR $ASSIGNMENT3_OUTPUT $ASSIGNMENT3_FINISHED $1 $ASSIGNMENT3_HEADER_OVERWRITE $ASSIGNMENT3_CHECKER_AUX_LIST ;; *) usage -- GitLab