#!/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