#!/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.$$ ;
                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