################################################################################
##                                                                            ##
## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
#! /bin/bash

# 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=" "

# 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
