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