#!/bin/sh
################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2001                 ##
##                                                                            ##
## This program is free software;  you can redistribute it and#or modify      ##
## it under the terms of the GNU General Public License as published by       ##
## the Free Software Foundation; either version 2 of the License, or          ##
## (at your option) any later version.                                        ##
##                                                                            ##
## This program is distributed in the hope that it will be useful, but        ##
## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
## for more details.                                                          ##
##                                                                            ##
## You should have received a copy of the GNU General Public License          ##
## along with this program;  if not, write to the Free Software               ##
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
##                                                                            ##
################################################################################
#
# File:        runltp
#
# Description: This program is a Graphical User Interface (GUI)
#              Control Centre for LTP. The Control Centre provides
#              functionality to Compile, Execute and View Results of
#              LTP test cases.
#
# Author:      Manoj Iyer - manjo@mail.utexas.edu
#
# Thanks:      Jim Choate - For suggesting the use of dialog command.
#
# History:     March 26 2003 - Created.
#
#	       March 28 2003 - Removed gauges and put make commands in foreground.
#	                     Robbie Williamson - robbiew@us.ibm.com
#
#	       March 31 2003 - Made scenario menu creation dynamic and code
#                              to pull the test descriptions from the scenario files.
#                            Robbie Williamson - robbiew@us.ibm.com
#
#	       April 17 2003 - Added menu selection to list contents of selected
#			       scenario file.
#			     Robbie Williamson - robbiew@us.ibm.com
#
#	       April 23 2003 - Added PID to results filename.
#			     - Added code to allow users to redirect output and
#                              specify test execution duration.
#			     Robbie Williamson - robbiew@us.ibm.com
#
#	       April 30, 2003 - Recoded results display to allow selection
#				of results file.
#			      - Created variable to hold results filename
#		 	      - Added time to results filename.
# Function:    cleanup
#
# Description: Remove all temporary files created by this program. Cleanup
#              always called on program exit.
#
# Input:       NONE
#
# Output:      NONE
cleanup()
{
    rm -f /tmp/runltp.*
}


# Function:    display_info_msg
#
# Description: Displays informational messages window. This window may
#              may be used to display information like errors, instructions
#              etc to the user. The window is dismissed when the user hits
#              the [ENTER] key.
#
# Input:       $1 - Title the needs to be displayed on the window.
#                   eg: ERROR: Compiling LTP
#              $2 - Message text.
#
# Output:      Information message window.
display_info_msg()
{
    dialog --backtitle "Linux Test Project Control Centre" \
           --title " $1 " \
           --msgbox " $2 " 10 70
    return $?
}


# Function:    compile_ltp
#
# Description: Checks for commands that are pre-reqs for compiling and
#              installing LTP. It displays a confirmation window inorder to
#              confirm the choice made by the user.
#
# Calls:       do_make_clean()
#              do_make()
#              do_make_install()
#
# Input:       NONE
#
# Output:      Confirmation window.
compile_ltp()
{
    dialog --backtitle "Linux Test Project Control Centre" \
           --title "Compiling LTP testsuite"\
           --yesno "This will compile all the test cases in\
                    LTP test suite and place the executables\
                    in testcases/bin directory. Do\
                    you wish to continue ??" 7 70 || RC=$?
    case $RC in
        0) \
            for cmd in cc make lex ;
            do \
                which $cmd &>/tmp/runltp.err.$$ ;
                if [ $? -ne 0 ] ;
                    then \
                        display_info_msg "Compiling LTP testsuite" \
                                 "ERROR: command $cmd not found, $cmd is\
                                  required to compile LTP test cases. Please\
                                  install $cmd or export PATH correctly before\
                                  running this program" ;
                    return ;
                fi ;
            done ;
            make clean;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make clean\' - exiting."
	      exit
	    fi
            make ;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make all\' - exiting."
	      exit
	    fi
            make install ;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make install\' - exiting."
	      exit
	    fi
            return ;;

        1)  return ;;

        255) return ;;
    esac
}


# Function:    disp_ltpres
#
# Description: The results generated after the ltp execution located under
#              ltp-mmddyy/results/ directory in a text (ASCII) file called
#              results.todaysdate. This function displays this file in a
#              window. If the results file does not exit it displays an
#              info message window notifing the user that LTP test cases
#              need to be executed inorder to view results.
#
# Input:       ltp-mmddyy/results/results.todaysdate.time
#
# Output:      Window displaying results of testcases that were executed.
disp_ltpres()
{
    RC=0

    RESULTS_LIST=$(for i in `ls -1 -A -I "CVS" results`;do echo -n "$i [more...] "; done)
    if ! [ -z $RESULTS_LIST ] ;then
      while [ $RC -ne "1" ]
      do
        dialog --clear
        dialog --backtitle "Linux Test Project Control Centre" \
               --title "LTP Test Results" \
               --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 8 \
                      $RESULTS_LIST \
                      2>/tmp/runltp.results.$$ || RC=$?
        results_item=$(cat /tmp/runltp.results.$$)
        if ! [ -z $results_item ];then
          dialog --clear
          dialog --backtitle "Linux Test Project Control Centre" \
                 --title "LTP Test Results" \
                 --textbox results/$results_item 17 70

          dialog --backtitle "Linux Test Project Control Centre" \
                 --title "LTP Test Results." \
                 --yesno "Would you like to share these results with the LTP \
                          community by posting it to the LTP results mailing list?" \
                          7 70 || RESPONSE=$?
          case $RESPONSE in
              0) \
                  mail ltp-results@lists.sourceforge.net < \
                          ./results/$results_item ;
                  ;;

              1)  ;;

              255)  ;;
          esac
        fi
      done
    else
      dialog --clear
      dialog --backtitle "Linux Test Project Control Centre" \
             --title "LTP Test Results" \
             --msgbox "ERROR: No files to view in /results directory." 5 53
    fi
    return
}


# Function:    flags_prompt
#
# Description: Prompt for and record user options for run duration and
#	       test output direction
#
# Input:       none
#
# Output:      none
flags_prompt()
{
    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Output Direction" --clear\
	   --yesno "Would you like test output recorded to a file, instead of STDOUT?" 7 80
    RC=$?
    if [ $RC -eq "0" ]
    then
	dialog --backtitle "Linux Test Project Control Centre"\
               --title "Output Direction" --clear\
               --inputbox " Please enter the full path and \
                            name of the file where you wish \
                            to redirect output to" 17 80 \
                          2>/tmp/runltp.outdir.$$ ;
        flags_outfile=$(cat /tmp/runltp.outdir.$$ | awk '{print $1}')
        ./ver_linux > $flags_outfile 2>&1
	RUNALL_FLAGS=" -o $flags_outfile"
    fi

    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Test Duration" --clear\
	   --yesno "Would you like to specify test duration? \
                    Default is the length of one loop." 7 80
    RC=$?
    if [ $RC -eq "0" ]
    then
	dialog --backtitle "Linux Test Project Control Centre"\
	       --title "Test Duration - Interval Selection" --clear\
               --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 4 \
                       s    "Seconds" \
                       m    "Minutes" \
                       h    "Hours" \
                       d    "Days" \
                  2>/tmp/runltp.interval.$$ ;
	flags_interval=$(cat /tmp/runltp.interval.$$ | awk '{print $1}')
	case $flags_interval in
                s)	INTERVAL="seconds" ;;
                m)      INTERVAL="minutes" ;;
                h)      INTERVAL="hours"   ;;
                d)      INTERVAL="days"    ;;
        esac

	echo $INTERVAL
	WINDOW_MSG="Please enter the number of $INTERVAL to run"
	dialog --backtitle "Linux Test Project Control Centre"\
               --title "Test Duration - Length Specification" --clear\
               --inputbox "$WINDOW_MSG" 7 80 \
		          2>/tmp/runltp.length.$$ ;
	flags_length=$(cat /tmp/runltp.length.$$ | awk '{print $1}')
        flags_duration="$flags_length$flags_interval"
	RUNALL_FLAGS=" $RUNALL_FLAGS -t $flags_duration"
    fi
}

# Function:    exectest_screenout
#
# Description: Execute tests by calling runltp, display test status
#              in a window.
#
# Input:       none
#
# Output:      messages printed by testcases.
exectest_screenout()
{
    RC=0    # setting return code to 0, to loop in while

    RESULTS_FILE=$(date +%Y-%m-%d.%H.%M.%S).$$

    # execute runltp with user defined command file.
    ./runltp -q -p $RUNALL_FLAGS -l results.$RESULTS_FILE \
	-f /tmp/runltp.test.list.$$

    sleep 2

    return
}


# Function:    execute_ltp
#
# Description: This function provides a menu of testcases that can be
#              selected for execution. If networking tests are selected,
#              they require a remote machine and remote machines root
#              users password. The user will be prompted to enter this
#              information in a text box.
#              The function checks to see if the ltp-mmddyy/testcases/bin
#              directory was created, this directory is created when the
#              testcases are compiled and installed, if it is not found
#              an info message window will notify the user that LTP needs to
#              be compiled before tests can be executed.
#              This function creates the senatrio file based on the users
#              choice of testcases and uses the runltp script to
#              execute these tests.
#              The messages printed by the testcases are displayed on this
#              terminal.
#
# Input:       Users selection of testcases; scenario file.
#
# Output:      Test selection window, Message window,
#              information message window
execute_ltp()
{
    RC=0
    host_name=" "
    rhost_passwd=" "
    run_net_test=" "

    if ! [ -d ./testcases/bin ]
    then
	display_info_msg "Executing LTP testcases" \
	    "The testcases must to be compiled inorder\
       to execute them. Returning to main menu. \
       Please select the Compile option."
	return
    fi

    LIST=$(for i in `ls -1 -A -I "CVS" runtest`; do echo -n "$i "; j=$(head -n1 runtest/$i | cut -d: -f2|sed s/" "/_/g); echo -n "$j off "; done)
    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Execute LTP" --clear\
           --checklist "Select [SPACEBAR] tests to run" 20 80 5 \
    	    $LIST \
            2>/tmp/runltp.choice.$$ || RC=$?
    size=`wc -m /tmp/runltp.choice.$$|awk '{print $1}'`
    if [ $size -eq 0 ];then
      tst_choice=$(echo "NULL")
    else
      tst_choice=$(cat /tmp/runltp.choice.$$)
    fi
    if [[ $tst_choice == NULL ]];then
      RC=1
    fi
    case $RC in
        0)    \
            for i in $tst_choice ;
            do \
                cat ./runtest/$(echo $i | sed -e 's/"//g') \
                   >> /tmp/runltp.test.list.$$ ;
                if [[ $(echo $i | sed -e 's/"//g') == "tcp_cmds" || \
		      $(echo $i | sed -e 's/"//g') == "tcp_cmds_noexpect" || \
                      $(echo $i | sed -e 's/"//g') == "multicast" || \
                      $(echo $i | sed -e 's/"//g') == "ipv6" || \
                      $(echo $i | sed -e 's/"//g') == "ipv6_noexpect" || \
                      $(echo $i | sed -e 's/"//g') == "nfs" || \
                      $(echo $i | sed -e 's/"//g') == "multicast" ]] ;
                then \
                    run_net_test="Y" ;
                fi ;

            done ;
            if ! [ -z $run_net_test ] ;
            then \
                dialog --backtitle "Linux Test Project Control Centre"\
                       --title "Execute LTP test cases" \
                       --clear \
                       --inputbox "You have chosen to execute testcases \
                                  that require a Remote Machine. \
                                  Please enter the fully qualified host \
                                  name" 17 80 $(hostname --long) \
                                  2>/tmp/runltp.out.$$ ;
                host_name=$(cat /tmp/runltp.out.$$ | awk '{print $1}') ;
                unset $RHOST ;
                RHOST=$host_name ;
                export RHOST;

                dialog --backtitle "Linux Test Project Control Centre"\
                       --title "Execute LTP test cases" \
                       --clear \
                       --inputbox " Please enter the root password \
                                     of this remote machine" 17 80 \
                        2>/tmp/runltp.out.$$ ;
                rhost_passwd=$(cat /tmp/runltp.out.$$ | awk '{print $1}') ;

                PASSWD=$rhost_passwd ;
                export PASSWD;
            fi ;

            if ! [ -d ./testcases/bin ] ;
            then \
                display_info_msg "Executing LTP testcases" \
                    "The testcases must to be compiled inorder\
                     to execute them. Returning to main menu. \
                     Please select the Compile option." ;
                return ;
            fi ;

            dialog --clear ;

	    flags_prompt ;

            exectest_screenout ;

            return ;;
        1)    \
            # echo "Cancel pressed" ;
            return ;;
        255)    \
            # echo "ESC pressed" ;
            return ;;
    esac
}


# Function:    about_ltpcc
#
# Description: This function displays a window containing a brief message
#              describing this programs functionality, and credits the author.
#
# Input:       NONE
#
# Output:      Message window, description of LTP Control Center.
about_ltpcc()
{
    display_info_msg "About LTP Control Centre" \
                     "The LTP Control Centre can be used to\
                     to compile, install and execute\
                     The Linux Test Project test suite. Written by\
                     Manoj Iyer <manjo@mail.utexas.edu>"
    return
}


# Function:    ltp_scenarios
#
# Description: This function displays a list of scenario files located
#              in /runtest.  Users can list the contents of each file.
#
# Input:       Files from /runtest
#
# Output:      1) Menu selection containing each file as an option to list.
#              2) Contents of selected scenario.
ltp_scenarios()
{

RC=0
SCENARIOS=$(for i in `ls -1 -A -I "CVS" runtest`;do echo -n "$i [more...] "; done)

while [ $RC -ne "1" ]
do
  dialog --clear
  dialog --backtitle "Linux Test Project Control Centre" \
         --title "LTP Scenario Files" \
         --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 8 \
                $SCENARIOS \
                2>/tmp/runltp.scenario.$$ || RC=$?
  scenario_item=$(cat /tmp/runltp.scenario.$$)
  if ! [ -z $scenario_item ];then
    dialog --clear
    dialog --backtitle "Linux Test Project Control Centre" \
           --title "LTP Scenario Files" \
           --textbox runtest/$scenario_item 17 70
  fi
done
}



# Function:    main
#
# Description: Displays the main menu to the LTP Control Centre. The menu
#              provides options to Compile, Execute, and View test execution
#              results.
#
# Calls:       about_ltpcc()
#              compile_ltp()
#              execute_ltp()
#              disp_ltpres()
#
# Input:       NONE
#
# Output:      Menu selection of actions to perform.

# Global variables.
RC=0              # return code from commands and local functions
mmenu_item=" "
RHOST=" "
PASSWD=" "
RUNALL_FLAGS=" "
RESULTS_FILE=" "

# test for dialog program exist
if [ ! -x /usr/bin/dialog ]; then
       echo "Sorry, ltpmenu GUI not available, can't find dialog. Exiting...";
       exit 1;
fi

# call cleanup function on program exit.
trap "cleanup" 0


# wait in a loop until user hits [Cancel] button on the main menu.
while :
do
    RC=0
    dialog --clear
    dialog --backtitle "Linux Test Project Control Centre" \
           --title "Main Menu" \
           --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 5 \
                  About        "About LTP Control Centre" \
                  Compile      "Compile LTP testsuite" \
		  Details      "Details of scenario files" \
                  Execute      "Execute LTP testsuite" \
                  Results      "Display a summary of test results" \
                  2>/tmp/runltp.mainmenu.$$ || RC=$?

    case $RC in
        0) mmenu_item=`cat /tmp/runltp.mainmenu.$$` ;
           # echo "return code = $RC" ;
           # echo "MENU ITEM = $mmenu_item" ;
           case $mmenu_item in
                About)        about_ltpcc    ;;
                Compile)      compile_ltp    ;;
		Details)      ltp_scenarios  ;;
                Execute)      execute_ltp    ;;
                Results)      disp_ltpres    ;;
           esac ;;

        1) display_info_msg "Good Bye!" \
                            "Thank you for using Linux Test Project test suite.\
                             Please visit our project website \
                             http://ltp.sourceforge.net \
                             for latest news on The Linux Test Project. "
           exit ;;

        255) display_info_msg "Good Bye!" \
                            "Thank you for using Linux Test Project test suite.\
                             Please visit our project website\
                             http://ltp.sourceforge.net for latest news\
                             on The Linux Test Project. "
            exit;;
    esac
done
