diff --git a/test/bin_ls.bash b/test/bin_ls.bash deleted file mode 100755 index 6acc2ea..0000000 --- a/test/bin_ls.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/bin_ls_3_times.bash b/test/bin_ls_3_times.bash deleted file mode 100755 index 29a9b51..0000000 --- a/test/bin_ls_3_times.bash +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 3 times - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -/bin/ls -/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/bin_ls_spaces.bash b/test/bin_ls_spaces.bash deleted file mode 100755 index b01723c..0000000 --- a/test/bin_ls_spaces.bash +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 4 times (surrounded by spaces) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls - /bin/ls -/bin/ls - /bin/ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/checker.bash b/test/checker.bash deleted file mode 100755 index f081be7..0000000 --- a/test/checker.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/checker1.bash b/test/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/checker2.bash b/test/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/checker3.bash b/test/checker3.bash deleted file mode 100755 index f081be7..0000000 --- a/test/checker3.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/checker4.bash b/test/checker4.bash deleted file mode 100755 index f081be7..0000000 --- a/test/checker4.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/empty_input_large.bash b/test/empty_input_large.bash deleted file mode 100755 index ae39ec5..0000000 --- a/test/empty_input_large.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Spaces only (large) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/empty_input_medium.bash b/test/empty_input_medium.bash deleted file mode 100755 index fa1feda..0000000 --- a/test/empty_input_medium.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Spaces only (medium) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/ls_in_current_dir.bash b/test/ls_in_current_dir.bash deleted file mode 100755 index f0bd244..0000000 --- a/test/ls_in_current_dir.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the current directory) and execute `./hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="./hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/hbtn_ls" - - return $status -} diff --git a/test/task1/checker1.bash b/test/task1/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker2.bash b/test/task1/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker3.bash b/test/task1/checker3.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker3.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker4.bash b/test/task1/checker4.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker4.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker5.bash b/test/task1/checker5.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker5.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker6.bash b/test/task1/checker6.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker6.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker7.bash b/test/task1/checker7.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker7.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/checker8.bash b/test/task1/checker8.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task1/checker8.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task1/eight.bash b/test/task1/eight.bash deleted file mode 100755 index fa1feda..0000000 --- a/test/task1/eight.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Spaces only (medium) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/five.bash b/test/task1/five.bash deleted file mode 100755 index f0bd244..0000000 --- a/test/task1/five.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the current directory) and execute `./hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="./hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/hbtn_ls" - - return $status -} diff --git a/test/task1/four.bash b/test/task1/four.bash deleted file mode 100755 index b01723c..0000000 --- a/test/task1/four.bash +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 4 times (surrounded by spaces) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls - /bin/ls -/bin/ls - /bin/ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/one.bash b/test/task1/one.bash deleted file mode 100755 index 6acc2ea..0000000 --- a/test/task1/one.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/seven.bash b/test/task1/seven.bash deleted file mode 100755 index ae39ec5..0000000 --- a/test/task1/seven.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Spaces only (large) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/six.bash b/test/task1/six.bash deleted file mode 100755 index 9f1584c..0000000 --- a/test/task1/six.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Spaces only (small) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/three.bash b/test/task1/three.bash deleted file mode 100755 index 29a9b51..0000000 --- a/test/task1/three.bash +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 3 times - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -/bin/ls -/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task1/two.bash b/test/task1/two.bash deleted file mode 100755 index 6acc2ea..0000000 --- a/test/task1/two.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task2/checker1.bash b/test/task2/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task2/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task2/checker2.bash b/test/task2/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task2/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task2/checker3.bash b/test/task2/checker3.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task2/checker3.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task2/checker4.bash b/test/task2/checker4.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task2/checker4.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task2/four.bash b/test/task2/four.bash deleted file mode 100755 index 76a6ab4..0000000 --- a/test/task2/four.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Echo the string `Holberton` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/echo Holberton" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task2/one.bash b/test/task2/one.bash deleted file mode 100755 index 0193cc2..0000000 --- a/test/task2/one.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls -l` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -l" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task2/three.bash b/test/task2/three.bash deleted file mode 100755 index bbd00b9..0000000 --- a/test/task2/three.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task2/two.bash b/test/task2/two.bash deleted file mode 100755 index 0193cc2..0000000 --- a/test/task2/two.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls -l` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -l" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/checker1.bash b/test/task3/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker10.bash b/test/task3/checker10.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker10.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker11.bash b/test/task3/checker11.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker11.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker12.bash b/test/task3/checker12.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker12.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker13.bash b/test/task3/checker13.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker13.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker14.bash b/test/task3/checker14.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker14.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker15.bash b/test/task3/checker15.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker15.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker16.bash b/test/task3/checker16.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker16.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker17.bash b/test/task3/checker17.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker17.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker18.bash b/test/task3/checker18.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker18.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker19.bash b/test/task3/checker19.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker19.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker2.bash b/test/task3/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker20.bash b/test/task3/checker20.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker20.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker21.bash b/test/task3/checker21.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker21.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker22.bash b/test/task3/checker22.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker22.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker23.bash b/test/task3/checker23.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker23.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker24.bash b/test/task3/checker24.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker24.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker25.bash b/test/task3/checker25.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker25.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker26.bash b/test/task3/checker26.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker26.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker27.bash b/test/task3/checker27.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker27.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker28.bash b/test/task3/checker28.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker28.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker29.bash b/test/task3/checker29.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker29.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker3.bash b/test/task3/checker3.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker3.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker30.bash b/test/task3/checker30.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker30.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker31.bash b/test/task3/checker31.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker31.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker4.bash b/test/task3/checker4.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker4.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker5.bash b/test/task3/checker5.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker5.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker6.bash b/test/task3/checker6.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker6.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker7.bash b/test/task3/checker7.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker7.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker8.bash b/test/task3/checker8.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker8.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/checker9.bash b/test/task3/checker9.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task3/checker9.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task3/eight.bash b/test/task3/eight.bash deleted file mode 100755 index d4f677c..0000000 --- a/test/task3/eight.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the parent's parent directory) and execute `./.././../////././hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="./.././../////././hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/../../hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/../../hbtn_ls" - - return $status -} diff --git a/test/task3/eighteen.bash b/test/task3/eighteen.bash deleted file mode 100755 index f0bd244..0000000 --- a/test/task3/eighteen.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the current directory) and execute `./hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="./hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/hbtn_ls" - - return $status -} diff --git a/test/task3/eleven.bash b/test/task3/eleven.bash deleted file mode 100755 index 41ed424..0000000 --- a/test/task3/eleven.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` (surrounded by spaces) (large) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" /bin/ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/fifteen.bash b/test/task3/fifteen.bash deleted file mode 100755 index ec38ae8..0000000 --- a/test/task3/fifteen.bash +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `ls` 4 times (with leading and trailing spaces) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls - ls -ls - ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/five.bash b/test/task3/five.bash deleted file mode 100755 index bbd00b9..0000000 --- a/test/task3/five.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/four.bash b/test/task3/four.bash deleted file mode 100755 index fd6cad3..0000000 --- a/test/task3/four.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `ls -l` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls -l" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/fourteen.bash b/test/task3/fourteen.bash deleted file mode 100755 index ffc8d79..0000000 --- a/test/task3/fourteen.bash +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute both `/bin/ls` and `ls` several times with empty lines and leading and trailing spaces - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls - - - /bin/ls - - - ls -ls - ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/nine.bash b/test/task3/nine.bash deleted file mode 100755 index 6acc2ea..0000000 --- a/test/task3/nine.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/nineteen.bash b/test/task3/nineteen.bash deleted file mode 100755 index 71b425c..0000000 --- a/test/task3/nineteen.bash +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy file /bin/ls to .hbtn_ls (in the current directory), change PATH to point to PWD and execute `.hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=".hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/.hbtn_ls" - OLDPATH="$PATH" - export PATH="$PWD" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - $RM -f "$PWD/.hbtn_ls" - - return $status -} diff --git a/test/task3/one.bash b/test/task3/one.bash deleted file mode 100755 index b55f46e..0000000 --- a/test/task3/one.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/seven.bash b/test/task3/seven.bash deleted file mode 100755 index 95f4472..0000000 --- a/test/task3/seven.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the parent's parent directory) and execute `../../hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="../../hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/../../hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/../../hbtn_ls" - - return $status -} diff --git a/test/task3/seventeen.bash b/test/task3/seventeen.bash deleted file mode 100755 index b01723c..0000000 --- a/test/task3/seventeen.bash +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 4 times (surrounded by spaces) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls - /bin/ls -/bin/ls - /bin/ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/six.bash b/test/task3/six.bash deleted file mode 100755 index 2c028b5..0000000 --- a/test/task3/six.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the parent directory) and execute `../hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="../hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/../hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/../hbtn_ls" - - return $status -} diff --git a/test/task3/sixteen.bash b/test/task3/sixteen.bash deleted file mode 100755 index 0ee74c9..0000000 --- a/test/task3/sixteen.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Set PATH to be an empty string and execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - export PATH="" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/ten.bash b/test/task3/ten.bash deleted file mode 100755 index 185ae85..0000000 --- a/test/task3/ten.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# '/bin' is the last element of PATH, execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games:/usr/local/games:/bin" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/thirteen.bash b/test/task3/thirteen.bash deleted file mode 100755 index 0193cc2..0000000 --- a/test/task3/thirteen.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls -l` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -l" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/thirty.bash b/test/task3/thirty.bash deleted file mode 100755 index c2df943..0000000 --- a/test/task3/thirty.bash +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file `/bin/ls` to `hbtn_ls` (in the current directory), set the PATH to PWD, and execute `hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/hbtn_ls" - OLDPATH="$PATH" - export PATH="$PWD" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - $RM -f "$PWD/hbtn_ls" - - return $status -} diff --git a/test/task3/thirtyone.bash b/test/task3/thirtyone.bash deleted file mode 100755 index 413c77f..0000000 --- a/test/task3/thirtyone.bash +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# `fork` should not be called when a command does not exist - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="hbtn" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - LTRACE_ALLOWED_FUNCTIONS_FILE_TMP="${LTRACE_ALLOWED_FUNCTIONS_FILE}_dup" - $CP $LTRACE_ALLOWED_FUNCTIONS_FILE $LTRACE_ALLOWED_FUNCTIONS_FILE_TMP - - $CAT $LTRACE_ALLOWED_FUNCTIONS_FILE_TMP | $GREP -vw "fork" > $LTRACE_ALLOWED_FUNCTIONS_FILE - - $RM -f $LTRACE_ALLOWED_FUNCTIONS_FILE_TMP - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/three.bash b/test/task3/three.bash deleted file mode 100755 index 6a67ca4..0000000 --- a/test/task3/three.bash +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Copy the file /bin/ls to `hbtn_ls` (in the parent's parent directory) and execute `./.././../hbtn_ls /var` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="./.././../hbtn_ls /var" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - $CP "/bin/ls" "$PWD/../../hbtn_ls" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - $RM -f "$PWD/../../hbtn_ls" - - return $status -} diff --git a/test/task3/twelve.bash b/test/task3/twelve.bash deleted file mode 100755 index 8eae1df..0000000 --- a/test/task3/twelve.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove the `$PATH` environment variable and execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - unset PATH - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/twenty.bash b/test/task3/twenty.bash deleted file mode 100755 index 72a6c7c..0000000 --- a/test/task3/twenty.bash +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove all environment variables and execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(/usr/bin/env) - for i in `/usr/bin/env | /usr/bin/cut -d'=' -f1` - do - unset $i - done - - # Important: Disable valgrind when running without an environment - let valgrind_error=0 - let valgrind_leak=0 - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - let status=0 - - $ECHO -n "" > $EXPECTED_OUTPUTFILE - $ECHO "./hsh: 1: ls: not found" > $EXPECTED_ERROR_OUTPUTFILE - $ECHO -n "127" > $EXPECTED_STATUS - - check_diff - - return $status -} diff --git a/test/task3/twentyeight.bash b/test/task3/twentyeight.bash deleted file mode 100755 index 0694c9e..0000000 --- a/test/task3/twentyeight.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Set PATH to be an empty string and execute a command that does not exist - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="hbtn_cmd" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - export PATH="" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/twentyfive.bash b/test/task3/twentyfive.bash deleted file mode 100755 index b5d713d..0000000 --- a/test/task3/twentyfive.bash +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` and `ls` several times - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls -ls -ls -/bin/ls -ls -ls -ls -/bin/ls -ls -ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/twentyfour.bash b/test/task3/twentyfour.bash deleted file mode 100755 index aede069..0000000 --- a/test/task3/twentyfour.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` (surrounded by spaces) (medium) - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input=" /bin/ls " - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/twentynine.bash b/test/task3/twentynine.bash deleted file mode 100755 index be38486..0000000 --- a/test/task3/twentynine.bash +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove PATH variable and set a `PATH1` variable, and execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="hbtn_ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - cp "/bin/ls" "$PWD/hbtn_ls" - export PATH1="$PWD" - OLDPATH="$PATH" - unset PATH - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - $RM -f "$PWD/hbtn_ls" - - return $status -} diff --git a/test/task3/twentyone.bash b/test/task3/twentyone.bash deleted file mode 100755 index a4140ea..0000000 --- a/test/task3/twentyone.bash +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove all environment variables and execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(/usr/bin/env) - for i in `/usr/bin/env | /usr/bin/cut -d'=' -f1` - do - unset $i - done - - # Important: Disable valgrind when running without an environment - let valgrind_error=0 - let valgrind_leak=0 - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/twentyseven.bash b/test/task3/twentyseven.bash deleted file mode 100755 index a40e5ec..0000000 --- a/test/task3/twentyseven.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# '/bin' is in the middle of PATH, execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/bin:/usr/bin:/sbin:/usr/games:/usr/local/games" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/twentysix.bash b/test/task3/twentysix.bash deleted file mode 100755 index 34798c4..0000000 --- a/test/task3/twentysix.bash +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# PATH does not contain '/bin', execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - OLDPATH="$PATH" - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games:/usr/local/games" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - export PATH="$OLDPATH" - - return $status -} diff --git a/test/task3/twentythree.bash b/test/task3/twentythree.bash deleted file mode 100755 index 29a9b51..0000000 --- a/test/task3/twentythree.bash +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `/bin/ls` 3 times - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls -/bin/ls -/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/twentytwo.bash b/test/task3/twentytwo.bash deleted file mode 100755 index a4140ea..0000000 --- a/test/task3/twentytwo.bash +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove all environment variables and execute `/bin/ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(/usr/bin/env) - for i in `/usr/bin/env | /usr/bin/cut -d'=' -f1` - do - unset $i - done - - # Important: Disable valgrind when running without an environment - let valgrind_error=0 - let valgrind_leak=0 - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task3/two.bash b/test/task3/two.bash deleted file mode 100755 index b55f46e..0000000 --- a/test/task3/two.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `ls` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="ls" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task4/checker1.bash b/test/task4/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task4/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task4/checker2.bash b/test/task4/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task4/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task4/one.bash b/test/task4/one.bash deleted file mode 100755 index 27d4faa..0000000 --- a/test/task4/one.bash +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Exit without parameter - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="exit" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task4/two.bash b/test/task4/two.bash deleted file mode 100755 index 0e3d5a8..0000000 --- a/test/task4/two.bash +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute a command that fails, and exit without parameter - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="/bin/ls /test_hbtn -exit" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - status=$1 - - return $status -} diff --git a/test/task5/checker1.bash b/test/task5/checker1.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task5/checker1.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task5/checker2.bash b/test/task5/checker2.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task5/checker2.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task5/checker3.bash b/test/task5/checker3.bash deleted file mode 100755 index f081be7..0000000 --- a/test/task5/checker3.bash +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/bash - -################################################################################ -# SET SOME CONFIG VARIABLES -################################################################################ -R=$RANDOM - -TMP_DIR="/tmp" -COMMANDFILE="$TMP_DIR/hbtn_checker_command_$R" -COMMANDFILE_REAL_SHELL="$TMP_DIR/hbtn_checker_command_real_shell_$R" -STATUS="$TMP_DIR/hbtn_checker_status_$R" -OUTPUTFILE="$TMP_DIR/hbtn_checker_output_$R" -ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_error_output_$R" -VALGRIND_OUTPUTFILE="$TMP_DIR/hbtn_checker_valgrind_$R" -LTRACE_OUTPUTFILE="$TMP_DIR/hbtn_checker_ltrace_output_$R" -EXPECTED_STATUS="$TMP_DIR/hbtn_checker_expected_status_$R" -EXPECTED_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_output_$R" -EXPECTED_ERROR_OUTPUTFILE="$TMP_DIR/hbtn_checker_expected_error_output_$R" -TMP_FILE="$TMP_DIR/hbtn_checker_tmp_$R" -ENV_TMP_FILE="$TMP_DIR/hbtn_env_$R" -LTRACE_ALLOWED_FUNCTIONS_FILE="./allowed_functions" - -################################################################################ -# MOST USED COMMANDS, IN CASE THE ENVIRONMENT IS MISSING -################################################################################ -WHICH="/usr/bin/which" -SLEEP=`$WHICH sleep` -SLEEPSECONDS=2 # Valgrind needs at least 2 seconds to execute properly -LTRACE=`$WHICH ltrace` -ECHO=`$WHICH echo` -CAT=`$WHICH cat` -GREP=`$WHICH grep` -WC=`$WHICH wc` -RM=`$WHICH rm` -TOUCH=`$WHICH touch` -CHMOD=`$WHICH chmod` -PIDOF=`$WHICH pidof` -KILLALL=`$WHICH killall` -KILL=`$WHICH kill` -VALGRIND=`$WHICH valgrind` -SED=`$WHICH sed` -DIFF=`$WHICH diff` -HEAD=`$WHICH head` -TAIL=`$WHICH tail` -CUT=`$WHICH cut` -PS=`$WHICH ps` -HEAD=`$WHICH head` -CP=`$WHICH cp` -ENV=`$WHICH env` - -################################################################################ -# COMMAND-LINE OPTIONS AND PARAMETERS -################################################################################ -usage=0 - -valgrind_error=0 -valgrind_leak=0 -ltrace=0 - -force_diff=0 - -function usage() -{ - exitcode=$1 - -$ECHO "Usage: $0 shell test_file - -Options: ---valgrind_error Checks for valgrind errors ---valgrind_leak Cehcks for valgrind leaks ---valgrind Checks for both valgrind errors and leaks ---ltrace Checks for forbidden system/library calls - ---diff Force to print the output diff - ---help Prints the help and exit" - - exit $exitcode -} - -################################################################################ -# PARSE COMMAND-LINE PARAMETERS -################################################################################ -for arg in "$@" -do - if [ "$arg" == "--valgrind_error" ] - then - let valgrind_error=1 - shift $ARGV - elif [ "$arg" == "--valgrind_leak" ] - then - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--valgrind" ] - then - let valgrind_error=1 - let valgrind_leak=1 - shift $ARGV - elif [ "$arg" == "--ltrace" ] - then - let ltrace=1 - shift $ARGV - elif [ "$arg" == "--diff" ] - then - let force_diff=1 - shift $ARGV - elif [ "$arg" == "--help" ] - then - let usage=1 - shift $ARGV - fi -done - -[[ "$usage" -eq "1" ]] && usage 0 -[[ "$#" -lt "2" ]] && usage 1 - -HSHELL=$1 -TEST_FILE=$2 -REAL_SHELL=`$WHICH sh` - -################################################################################ -# UTILITIES FUNCTIONS -################################################################################ -function stop_process() -{ - prog=$1 - base_shell=${prog##*/} - - # for pid in `ps aux | grep "$base_shell" | cut -d' ' -f3` - # do - # kill -9 $pid > /dev/null 2>&1 - # done - - running_shells=`$PIDOF "$base_shell" | $WC -l` - if [ "$running_shells" -ne "0" ] - then - $KILLALL -9 "$base_shell" > /dev/null 2>&1 - fi -} - -function cleanup() -{ - stop_process $HSHELL - $RM -f $COMMANDFILE - $RM -f $COMMANDFILE_REAL_SHELL - $RM -f $STATUS - $RM -f $OUTPUTFILE - $RM -f $ERROR_OUTPUTFILE - $RM -f $CHECK_OUTPUTFILE - $RM -f $VALGRIND_OUTPUTFILE - $RM -f $LTRACE_OUTPUTFILE - $RM -f $EXPECTED_STATUS - $RM -f $EXPECTED_OUTPUTFILE - $RM -f $EXPECTED_ERROR_OUTPUTFILE - $RM -f $TMP_FILE - $RM -f $ENV_TMP_FILE -} - -function print_diff() -{ - input=$1 - params=$2 - - $ECHO -n "(command)[" - if [ ! -z "$input" ] - then - $ECHO -e -n "echo \"$input\" | " - fi - $ECHO -n "$HSHELL" - if [ ! -z "$params" ] - then - $ECHO -n " $params" - fi - $ECHO "]" - $ECHO "" - - $ECHO "[GOT]:" - $ECHO -n "(stdout)[" - $CAT $OUTPUTFILE - $ECHO "](Length: `$CAT $OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $STATUS - $ECHO -e "]\n" - - $ECHO "[EXPECTED]:" - $ECHO -n "(stdout)[" - $CAT $EXPECTED_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_OUTPUTFILE | $WC -c`)" - $ECHO -n "(stderr)[" - $CAT $EXPECTED_ERROR_OUTPUTFILE - $ECHO "](Length: `$CAT $EXPECTED_ERROR_OUTPUTFILE | $WC -c`)" - $ECHO -n "(status)[" - $CAT $EXPECTED_STATUS - $ECHO -e "]\n" - - $ECHO "Environment:" - $CAT $ENV_TMP_FILE | $GREP -v "LS_COLORS" -} - -################################################################################ -# START -################################################################################ -stop_process $HSHELL -status=0 -params="" - -################################################################################ -# READ AND EXECUTE CHECK SCRIPT -################################################################################ -source $TEST_FILE - -################################################################################ -# REATRIEVE SHELL INPUT (STDIN) AND PARAMS -################################################################################ -if [ -z ${shell_input+x} ] -then - echo "The variable \$shell_input is not defined in $TEST_FILE!" - exit 1 -fi -if [ ! -z ${shell_params+x} ] -then - params=$shell_params -fi - -################################################################################ -# FUNCTION "check_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_setup)" ] && [ "$(type -t check_setup)" = function ] -then - check_setup -fi - -shell_pid=0 -shell_ppid=0 -differs=0 - -################################################################################ -# PREPARING COMMAND SCRIPT FILE -################################################################################ -$ECHO -e -n "$ECHO " > $COMMANDFILE -$ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE -$ECHO -e -n " | " >> $COMMANDFILE -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - $ECHO -e -n "$VALGRIND --log-file=\"$VALGRIND_OUTPUTFILE\" " >> $COMMANDFILE -fi -$ECHO -e "\"$HSHELL\" $params > \"$OUTPUTFILE\" 2> \"$ERROR_OUTPUTFILE\"" >> $COMMANDFILE -$ECHO -e "$ECHO -n \$? > \"$STATUS\"" >> $COMMANDFILE -$CHMOD +x $COMMANDFILE - -################################################################################ -# TEST COMMAND AGAINST STUDENT SHELL -################################################################################ -. $COMMANDFILE & -$SLEEP $SLEEPSECONDS -stop_process $COMMANDFILE -# stop_process $HSHELL - -################################################################################ -# PARSE VALGRIND OUTPUT TO RETRIEVE SHELL PID -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - # stop valgrind - valgrind_pid=`$PIDOF valgrind.bin` - if [ -n "$valgrind_pid" ] - then - $KILL -9 "$valgrind_pid" > /dev/null 2>&1 - fi - - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="==([0-9]+)== Parent PID: ([0-9]+)" - if [[ $content =~ $regex ]] - then - let shell_pid=${BASH_REMATCH[1]} - let shell_ppid=${BASH_REMATCH[2]} - - # DISCARD PARENT PROCESS OUTPUT - $ECHO "$content" | $GREP -v -e "^==$shell_ppid" > $VALGRIND_OUTPUTFILE - fi -fi - -################################################################################ -# RUN LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ($ECHO "$shell_input" | $LTRACE -bc -o "$LTRACE_OUTPUTFILE" "$HSHELL" $params > /dev/null 2>&1 &) - $SLEEP $SLEEPSECONDS - stop_process $LTRACE -fi - -function check_diff() -{ - let differs=0 - - ######################################################################## - # CHECK DIFF - ######################################################################## - diff_out=`$DIFF $OUTPUTFILE $EXPECTED_OUTPUTFILE` - diff_err=`$DIFF $ERROR_OUTPUTFILE $EXPECTED_ERROR_OUTPUTFILE` - diff_status=`$DIFF $STATUS $EXPECTED_STATUS` - if [ ! -z "$diff_out" ] || [ ! -z "$diff_err" ] || [ ! -z "$diff_status" ] - then - let differs=1 - let status=1 - fi -} - -################################################################################ -# FUNCTION "sh_setup" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t sh_setup)" ] && [ "$(type -t sh_setup)" = function ] -then - sh_setup -fi - -################################################################################ -# RUN SH IN ORDER TO COMPARE OUTPUTS -################################################################################ -if [ -z ${compare_with_sh+x} ] || [ $compare_with_sh -ne 0 ] -then - ######################################################################## - # PREPARING COMMAND SCRIPT FILE - ######################################################################## - $ECHO -e -n "$ECHO " > $COMMANDFILE_REAL_SHELL - $ECHO -e -n "\"$shell_input\"" >> $COMMANDFILE_REAL_SHELL - cmd=" | \"$REAL_SHELL\" $params > \"$EXPECTED_OUTPUTFILE\" 2> \"$EXPECTED_ERROR_OUTPUTFILE\" ; $ECHO -n \$? > \"$EXPECTED_STATUS\"" - $ECHO -e $cmd >> $COMMANDFILE_REAL_SHELL - $CHMOD +x $COMMANDFILE_REAL_SHELL - - . $COMMANDFILE_REAL_SHELL & - - $SLEEP $SLEEPSECONDS - stop_process $COMMANDFILE_REAL_SHELL - - # REPLACE REAL SHELL'S NAME WITH STUDENT'S SHELL NAME ON ERROR OUTPUT - # EXAMPLE: '/bin/sh: 1: qwerty: not found' - # BECOMES: './hsh: 1: qwerty: not found' - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_OUTPUTFILE - $SED -i "s@${REAL_SHELL}@${HSHELL}@g" $EXPECTED_ERROR_OUTPUTFILE - - check_diff -fi - -################################################################################ -# Save environment used during correction -################################################################################ -$ENV > $ENV_TMP_FILE - -################################################################################ -# FUNCTION "check_callback" CAN BE DEFINED IN THE CHECK SCRIPT -################################################################################ -if [ -n "$(type -t check_callback)" ] && [ "$(type -t check_callback)" = function ] -then - check_callback $status - let status=$? -fi - -################################################################################ -# PRINT OUTPUTS COMPARISON -################################################################################ -if [ $differs -ne 0 ] || [ $force_diff -ne 0 ] -then - print_diff "$shell_input" "$params" -fi - -errors=0 -leaks=0 -################################################################################ -# CHECK VALGRIND ERRORS AND MEMORY LEAKS -################################################################################ -if [ $valgrind_error -ne 0 ] || [ $valgrind_leak -ne 0 ] -then - ######################################################################## - # CHECK FOR VALGRIND ERRORS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="ERROR SUMMARY: ([1-9][0-9]*) errors" - if [[ $content =~ $regex ]] - then - let errors=1 - fi - - ######################################################################## - # CHECK FOR VALGRIND LEAKS - ######################################################################## - content=`$CAT $VALGRIND_OUTPUTFILE` - regex="(LEAK SUMMARY:)" - if [[ $content =~ $regex ]] - then - let leaks=1 - fi - - ######################################################################## - # PRINT VALGRIND LOG IF ERROR OR LEAK DETECTED - ######################################################################## - if [ $errors -ne 0 ] || [ $leaks -ne 0 ] - then - $ECHO "[VALGRIND]:" - $CAT "$VALGRIND_OUTPUTFILE" - $ECHO "" - - let status=1 - fi -fi - -################################################################################ -# CHECK LTRACE -################################################################################ -if [ $ltrace -ne 0 ] -then - ######################################################################## - # PARSE LTRACE OUTPUT TO KEEP ONLY A LIST OF CALLED FUNCTIONS - ######################################################################## - functions_called=`$CAT $LTRACE_OUTPUTFILE | $HEAD -n -2 | $TAIL -n +3 | $SED -e 's/ */ /g' | $SED -e 's/^ //g' | $CUT -d' ' -f5 | $GREP -vw 'function' | $GREP -vwe '--------------------' | $GREP -vw 'calls'` - - for f in $functions_called - do - ################################################################ - # CHECK THAT THE FUNCTION IS PART OF THE ALLOWED FUNCTIONS - ################################################################ - if [ `$GREP -w "$f" "$LTRACE_ALLOWED_FUNCTIONS_FILE" | $WC -l` -eq 0 ] - then - $ECHO "Function '$f' is not allowed" - let status=1 - fi - done -fi - -################################################################################ -# CLEANUP AND QUIT -################################################################################ -cleanup - -[[ $status -eq 0 ]] && $ECHO -n "OK" -exit $status diff --git a/test/task5/one.bash b/test/task5/one.bash deleted file mode 100755 index f8b2ae9..0000000 --- a/test/task5/one.bash +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove all environment variables, except one, and execute `env` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="env" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(/usr/bin/env) - for i in `/usr/bin/env | /usr/bin/cut -d'=' -f1` - do - unset $i - done - - export HBTN="Holberton" - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - let status=0 - - # Remove environment variables and set by valgrind from student output - content=`$CAT "$OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCPP_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCXX_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^LD_PRELOAD="` - content=`$ECHO "$content" | $GREP -v -e "^LD_LIBRARY_PATH="` - content=`$ECHO "$content" | $GREP -v -e "^_="` - content=`$ECHO "$content" | $GREP -v -e "^PWD="` - $ECHO "$content" > $OUTPUTFILE - - # Remove "_" environment variable from expected output - content=`$CAT "$EXPECTED_OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^_="` - content=`$ECHO "$content" | $GREP -v -e "^PWD="` - $ECHO "$content" > $EXPECTED_OUTPUTFILE - - $ECHO -n "" > $EXPECTED_ERROR_OUTPUTFILE - $ECHO -n "0" > $EXPECTED_STATUS - - check_diff - - return $status -} diff --git a/test/task5/three.bash b/test/task5/three.bash deleted file mode 100755 index 255d1ce..0000000 --- a/test/task5/three.bash +++ /dev/null @@ -1,117 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Remove all environment variables and execute `env` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="env" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(/usr/bin/env) - for i in `/usr/bin/env | /usr/bin/cut -d'=' -f1` - do - unset $i - done - - # Important: Disable valgrind when running without an environment - let valgrind_error=0 - let valgrind_leak=0 - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - let status=0 - - # Remove environment variables and set by valgrind from student output - content=`$CAT "$OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCPP_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCXX_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^LD_PRELOAD="` - content=`$ECHO "$content" | $GREP -v -e "^LD_LIBRARY_PATH="` - content=`$ECHO "$content" | $GREP -v -e "^_="` - content=`$ECHO "$content" | $GREP -v -e "^PWD="` - $ECHO "$content" > $OUTPUTFILE - - # Remove "_" environment variable from expected output - content=`$CAT "$EXPECTED_OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^_="` - content=`$ECHO "$content" | $GREP -v -e "^PWD="` - $ECHO "$content" > $EXPECTED_OUTPUTFILE - - $ECHO -n "" > $EXPECTED_ERROR_OUTPUTFILE - $ECHO -n "0" > $EXPECTED_STATUS - - check_diff - - return $status -} diff --git a/test/task5/two.bash b/test/task5/two.bash deleted file mode 100755 index 644af8f..0000000 --- a/test/task5/two.bash +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash - -################################################################################ -# Description for the intranet check (one line, support Markdown syntax) -# Execute `env` - -################################################################################ -# The variable 'compare_with_sh' IS OPTIONNAL -# -# Uncomment the following line if you don't want the output of the shell -# to be compared against the output of /bin/sh -# -# It can be useful when you want to check a builtin command that sh doesn't -# implement -# compare_with_sh=0 - -################################################################################ -# The variable 'shell_input' HAS TO BE DEFINED -# -# The content of this variable will be piped to the student's shell and to sh -# as follows: "echo $shell_input | ./hsh" -# -# It can be empty and multiline -shell_input="env" - -################################################################################ -# The variable 'shell_params' IS OPTIONNAL -# -# The content of this variable will be passed to as the paramaters array to the -# shell as follows: "./hsh $shell_params" -# -# It can be empty -# shell_params="" - -################################################################################ -# The function 'check_setup' will be called BEFORE the execution of the shell -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function check_setup() -{ - current_env=$(env) - - return 0 -} - -################################################################################ -# The function 'sh_setup' will be called AFTER the execution of the students -# shell, and BEFORE the execution of the real shell (sh) -# It allows you to set custom VARIABLES, prepare files, etc -# If you want to set variables for the shell to use, be sure to export them, -# since the shell will be launched in a subprocess -# -# Return value: Discarded -function sh_setup() -{ - return 0 -} - -################################################################################ -# The function `check_callback` will be called AFTER the execution of the shell -# It allows you to clear VARIABLES, cleanup files, ... -# -# It is also possible to perform additionnal checks. -# Here is a list of available variables: -# STATUS -> Path to the file containing the exit status of the shell -# OUTPUTFILE -> Path to the file containing the stdout of the shell -# ERROR_OUTPUTFILE -> Path to the file containing the stderr of the shell -# EXPECTED_STATUS -> Path to the file containing the exit status of sh -# EXPECTED_OUTPUTFILE -> Path to the file containing the stdout of sh -# EXPECTED_ERROR_OUTPUTFILE -> Path to the file continaing the stderr of sh -# -# Parameters: -# $1 -> Status of the comparison with sh -# 0 -> The output is the same as sh -# 1 -> The output differs from sh -# -# Return value: -# 0 -> Check succeed -# 1 -> Check fails -function check_callback() -{ - let status=0 - - # Remove environment variables and set by valgrind from student output - content=`$CAT "$OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCPP_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^GLIBCXX_FORCE_NEW="` - content=`$ECHO "$content" | $GREP -v -e "^LD_PRELOAD="` - content=`$ECHO "$content" | $GREP -v -e "^LD_LIBRARY_PATH="` - content=`$ECHO "$content" | $GREP -v -e "^_="` - $ECHO "$content" > $OUTPUTFILE - - # Remove "_" environment variable from expected output - content=`$CAT "$EXPECTED_OUTPUTFILE"` - content=`$ECHO "$content" | $GREP -v -e "^_="` - $ECHO "$content" > $EXPECTED_OUTPUTFILE - - check_diff - - return $status -} diff --git a/test/usage.md b/test/usage.md deleted file mode 100644 index ab28355..0000000 --- a/test/usage.md +++ /dev/null @@ -1,15 +0,0 @@ -# Simple-Shell Test Cases - -## How To Use?? - -Super simple, you need to download the `checker.bash` script and the test case script. Both can be downloaded by selecting the task and the checker test case. Then execute the following command: - -```bash -./checker.bash ./hsh -``` - -Replace `` with the name of the test case script you want to use. - -**Note:** - -- Only use to solve failed tasks after using the checker. Otherwise, you will waste your time.