#!/bin/bash
################################################################################
##                                                                            ##
## 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.$$ 2>&1 ;
                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
