1#!/bin/sh
2################################################################################
3##                                                                            ##
4## Copyright (c) International Business Machines  Corp., 2001                 ##
5##                                                                            ##
6## This program is free software;  you can redistribute it and#or modify      ##
7## it under the terms of the GNU General Public License as published by       ##
8## the Free Software Foundation; either version 2 of the License, or          ##
9## (at your option) any later version.                                        ##
10##                                                                            ##
11## This program is distributed in the hope that it will be useful, but        ##
12## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
13## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
14## for more details.                                                          ##
15##                                                                            ##
16## You should have received a copy of the GNU General Public License          ##
17## along with this program;  if not, write to the Free Software               ##
18## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
19##                                                                            ##
20################################################################################
21# File: runltp
22#
23# Description:  This script can be used to the tests in the LTP test suite
24#
25# Authors:      Manoj Iyer - manjo@mail.utexas.edu
26#               Robbe Williamson - robbiew@us.ibm.com
27#
28# History:      Oct 07 2003 - Modified - Manoj Iyer
29#               - use functions
30#               - clean up on script exit
31#               - error checking etc.
32#
33#               Oct 08 2003 - Modified - Manoj Iyer
34#               - fixed bug in creating results directory
35#               - all checks should be enlclosed in " " to avoid bash error
36#               - exit with error if ltp-pan is not found in pan directory
37#
38#               Jul 22 2007 - Modified - Ricardo Salveti de Araujo
39#               - added support to put more then one file at CMDLINE (-f)
40#               - added a new option, that the user can pass the address of
41#               the command file, and it'll use wget to get it (-w)
42#               - now -s does the grep at the selected command files (default,
43#               -f or -w)
44#
45#               Jul 23 2007 - Modified - Ricardo Salveti de Araujo
46#               - added flag to get the command file that has all failed tests
47#
48#               Sep 11 2007 - Modified - Subrata Modak
49#               - added option to create Failed File if it is not an absolute path
50#               - added option to create Output File if it is not an absolute path
51#               - added option to create Failed File compulsory, even if user has not mentioned it
52#
53#               Sep 14 2007 - Modified - Ricardo Salveti de Araujo
54#               - cleaning and removing duplicated code
55#
56#               Oct 27 2007 - Modified - Ricardo Salveti de Araujo and Subrata Modak
57#               - better ways to integrate "ltp/tools/genload/stress" with "ltp/runltp"
58#               Nov 24 2007 - Modified - Subrata Modak
59#               - Added a new option to generate output in HTML format also. Also retaining
60#                 the original test format
61#               Nov 28 2007 - Modified - Subrata Modak
62#               - Added a new option to mail back LTP reports
63#               May 19 2008 - Modified - Subrata Modak
64#               - Added capability for default Log file generation
65#		Aug 17 2009 - Modified - Subrata Modak
66#		- Added Fault Injection generation Capability through -F Option
67#
68#################################################################################
69
70
71
72setup()
73{
74    cd `dirname $0` || \
75    {
76        echo "FATAL: unable to change directory to $(dirname $0)"
77        exit 1
78    }
79    export LTPROOT=${PWD}
80    export TMPBASE="/tmp"
81    export PATH="${PATH}:${LTPROOT}/testcases/bin:${LTPROOT}/bin"
82
83    export LTP_DEV_FS_TYPE="ext2"
84
85    [ -d "$LTPROOT/testcases/bin" ] ||
86    {
87        echo "FATAL: LTP not installed correctly"
88        echo "INFO:  Follow directions in INSTALL!"
89        exit 1
90    }
91
92    [ -e "$LTPROOT/bin/ltp-pan" ] ||
93    {
94        echo "FATAL: Test suite driver 'ltp-pan' not found"
95        echo "INFO:  Follow directions in INSTALL!"
96        exit 1
97    }
98}
99
100version_of_ltp()
101{
102    cat "$LTPROOT/Version"
103    exit 0
104}
105
106usage()
107{
108    cat <<-EOF >&2
109
110    usage: ${0##*/} [ -a EMAIL_TO ] [ -c NUM_PROCS ] [ -C FAILCMDFILE ] [ -T TCONFCMDFILE ]
111    [ -d TMPDIR ] [ -D NUM_PROCS,NUM_FILES,NUM_BYTES,CLEAN_FLAG ] -e [ -f CMDFILES(,...) ]
112    [ -g HTMLFILE] [ -i NUM_PROCS ] [ -l LOGFILE ] [ -m NUM_PROCS,CHUNKS,BYTES,HANGUP_FLAG ]
113    -N -n [ -o OUTPUTFILE ] -p -q -Q [ -r LTPROOT ] [ -s PATTERN ] [ -t DURATION ]
114    -v [ -w CMDFILEADDR ] [ -x INSTANCES ] [ -b DEVICE ] [-B LTP_DEV_FS_TYPE]
115	[ -F LOOPS,PERCENTAGE ] [ -z BIG_DEVICE ] [-Z  LTP_BIG_DEV_FS_TYPE]
116
117    -a EMAIL_TO     EMAIL all your Reports to this E-mail Address
118    -c NUM_PROCS    Run LTP under additional background CPU load
119                    [NUM_PROCS = no. of processes creating the CPU Load by spinning over sqrt()
120                                 (Defaults to 1 when value)]
121    -C FAILCMDFILE  Command file with all failed test cases.
122    -T TCONFCMDFILE Command file with all test cases that are not fully tested.
123    -d TMPDIR       Directory where temporary files will be created.
124    -D NUM_PROCS,NUM_FILES,NUM_BYTES,CLEAN_FLAG
125                    Run LTP under additional background Load on Secondary Storage (Seperate by comma)
126                    [NUM_PROCS   = no. of processes creating Storage Load by spinning over write()]
127                    [NUM_FILES   = Write() to these many files (Defaults to 1 when value 0 or undefined)]
128                    [NUM_BYTES   = write these many bytes (defaults to 1GB, when value 0 or undefined)]
129                    [CLEAN_FLAG  = unlink file to which random data written, when value 1]
130    -e              Prints the date of the current LTP release
131    -f CMDFILES     Execute user defined list of testcases (separate with ',')
132	-F LOOPS,PERCENTAGE Induce PERCENTAGE Fault in the Kernel Subsystems, and, run each test for LOOPS loop
133    -g HTMLFILE     Create an additional HTML output format
134    -h              Help. Prints all available options.
135    -i NUM_PROCS    Run LTP under additional background Load on IO Bus
136                    [NUM_PROCS   = no. of processes creating IO Bus Load by spinning over sync()]
137    -K DMESG_LOG_DIR
138			Log Kernel messages generated for each test cases inside this directory
139    -l LOGFILE      Log results of test in a logfile.
140    -m NUM_PROCS,CHUNKS,BYTES,HANGUP_FLAG
141                    Run LTP under additional background Load on Main memory (Seperate by comma)
142                    [NUM_PROCS   = no. of processes creating main Memory Load by spinning over malloc()]
143                    [CHUNKS      = malloc these many chunks (default is 1 when value 0 or undefined)]
144                    [BYTES       = malloc CHUNKS of BYTES bytes (default is 256MB when value 0 or undefined) ]
145                    [HANGUP_FLAG = hang in a sleep loop after memory allocated, when value 1]
146	-M CHECK_TYPE
147		[CHECK_TYPE=1 => Full Memory Leak Check tracing children as well]
148		[CHECK_TYPE=2 => Thread Concurrency Check tracing children as well]
149		[CHECK_TYPE=3 => Full Memory Leak & Thread Concurrency Check tracing children as well]
150    -N              Run all the networking tests.
151    -n              Run LTP with network traffic in background.
152    -o OUTPUTFILE   Redirect test output to a file.
153    -p              Human readable format logfiles.
154    -q              Print less verbose output to screen. This implies
155                    not logging start of the test in kernel log.
156    -Q              Don't log start of test in kernel log.
157    -r LTPROOT      Fully qualified path where testsuite is installed.
158    -R              Randomize test order.
159    -s PATTERN      Only run test cases which match PATTERN.
160    -S SKIPFILE     Skip tests specified in SKIPFILE
161    -t DURATION     Execute the testsuite for given duration. Examples:
162                      -t 60s = 60 seconds
163                      -t 45m = 45 minutes
164                      -t 24h = 24 hours
165                      -t 2d  = 2 days
166    -I ITERATIONS   Execute the testsuite ITERATIONS times.
167    -w CMDFILEADDR  Uses wget to get the user's list of testcases.
168    -x INSTANCES    Run multiple instances of this testsuite.
169    -b DEVICE       Some tests require an unmounted block device
170                    to run correctly.
171    -B LTP_DEV_FS_TYPE The file system of test block devices.
172    -z BIG_DEVICE   Some tests require a big unmounted block device
173                    to run correctly.
174    -Z  LTP_BIG_DEV_FS_TYPE The file system of the big device
175
176
177
178    example: ${0##*/} -c 2 -i 2 -m 2,4,10240,1 -D 2,10,10240,1 -p -q  -l /tmp/result-log.$$ -o /tmp/result-output.$$ -C /tmp/result-failed.$$ -d ${PWD}
179
180
181	EOF
182exit 0
183}
184
185main()
186{
187    local CMDFILES=
188    local PRETTY_PRT=
189    local ALT_DIR_OUT=0
190    local ALT_DIR_RES=0
191    local ALT_HTML_OUT=0
192    local ALT_EMAIL_OUT=0
193    local ALT_DMESG_OUT=0
194    local RUN_NETEST=0
195    local RUN_REPEATED=0
196    local QUIET_MODE=
197    local NO_KMSG=
198    local NETPIPE=0
199    local GENLOAD=0
200    local MEMSIZE=0
201    local DURATION=
202    local CMDFILEADDR=
203    local FAILCMDFILE=
204    local TCONFCMDFILE=
205    local INJECT_KERNEL_FAULT=
206    local INJECT_KERNEL_FAULT_PERCENTAGE=
207    local INJECT_FAULT_LOOPS_PER_TEST=
208    local VALGRIND_CHECK=
209    local VALGRIND_CHECK_TYPE=
210    local LOGFILE_NAME=
211    local LOGFILE=
212    local OUTPUTFILE_NAME=
213    local OUTPUTFILE=
214    local HTMLFILE_NAME=
215    local HTMLFILE=
216    local DMESG_DIR=
217    local EMAIL_TO=
218    local TAG_RESTRICT_STRING=
219    local PAN_COMMAND=
220    local RANDOMRUN=0
221    local DEFAULT_FILE_NAME_GENERATION_TIME=`date +"%Y_%m_%d-%Hh_%Mm_%Ss"`
222    local scenfile=
223
224    version_date=$(cat "$LTPROOT/Version")
225
226    while getopts a:b:B:c:C:T:d:D:ef:F:g:hi:I:K:l:m:M:No:pqQr:Rs:S:t:T:w:x:z:Z: arg
227    do  case $arg in
228        a)  EMAIL_TO=$OPTARG
229            ALT_EMAIL_OUT=1;;
230        c)
231            NUM_PROCS=$(($OPTARG))
232            if   [ "$NUM_PROCS" -eq 0 ]; then
233                # User Did not Define the Value ,or, User Defined Zero,
234                # hence, prevent from creating infinite processes
235                NUM_PROCS=1
236            fi
237            $LTPROOT/testcases/bin/genload --cpu $NUM_PROCS >/dev/null 2>&1 &
238            GENLOAD=1 ;;
239
240        C)
241            case $OPTARG in
242            /*)
243                FAILCMDFILE="-C $OPTARG" ;;
244            *)
245                FAILCMDFILE="-C $LTPROOT/output/$OPTARG"
246                ALT_DIR_OUT=1 ;;
247            esac ;;
248
249        T)
250            case $OPTARG in
251            /*)
252                TCONFCMDFILE="-T $OPTARG" ;;
253            *)
254                TCONFCMDFILE="-T $LTPROOT/output/$OPTARG"
255                ALT_DIR_OUT=1 ;;
256            esac ;;
257
258        d)  # convert the user path to absolute path.
259            export TMPBASE=$(readlink -f ${OPTARG}) ;;
260
261        D)  NUM_PROCS=1; NUM_FILES=1; NUM_BYTES=$((1024 * 1024 * 1024)); CLEAN_FLAG=0
262            ARGUMENT_LIST=$OPTARG
263            TOTAL_ARGUMENTS=1
264            for ARGUMENT in `echo "$ARGUMENT_LIST" | tr ',' ' '`
265            do
266                case $TOTAL_ARGUMENTS in
267                    1) NUM_PROCS="$ARGUMENT" ;;
268                    2) NUM_FILES="$ARGUMENT" ;;
269                    3) NUM_BYTES="$ARGUMENT" ;;
270                    4) CLEAN_FLAG="$ARGUMENT" ;;
271                esac
272                TOTAL_ARGUMENTS=`expr $TOTAL_ARGUMENTS + 1`
273            done
274            # just to get the default values if the user passed 0
275            if [ "$NUM_PROCS" -eq 0 ]; then
276                NUM_PROCS=1
277            fi
278            if [ "$NUM_FILES" -eq 0 ]; then
279                NUM_FILES=1
280            fi
281            if [ "$NUM_BYTES" -eq 0 ]; then
282                NUM_BYTES=$((1024 * 1024 * 1024))
283            fi
284            if [ "$CLEAN_FLAG" -ne 1 ]; then
285                CLEAN_FLAG=0
286            fi
287            if [ "$CLEAN_FLAG" -eq 1 ]; then
288                # Do not unlink file in this case
289                $LTPROOT/testcases/bin/genload --hdd $NUM_PROCS --hdd-files \
290                    $NUM_FILES --hdd-bytes $NUM_BYTES >/dev/null 2>&1 &
291            else
292                # Cleanup otherwise
293                $LTPROOT/testcases/bin/genload --hdd $NUM_PROCS --hdd-files \
294                    $NUM_FILES --hdd-bytes $NUM_BYTES --hdd-noclean >/dev/null 2>&1 &
295            fi
296            GENLOAD=1;;
297
298        e)  # Print out the version of LTP
299            version_of_ltp
300	    ;;
301        f)  # Execute user defined set of testcases.
302            # Can be more then one file, just separate it with ',', like:
303            # -f nfs,commands,/tmp/testfile
304            CMDFILES=$OPTARG;;
305	F)	INJECT_KERNEL_FAULT=1
306		#Seperate out the NO_OF_LOOPS & FAULT_PERCENTAGE
307		INJECT_FAULT_LOOPS_PER_TEST=`echo $OPTARG |cut -d',' -f1 | tr -d '\n' | tr -d ' '`
308		INJECT_KERNEL_FAULT_PERCENTAGE=`echo $OPTARG |cut -d',' -f2 | tr -d '\n' | tr -d ' '`
309		if [ ! $INJECT_FAULT_LOOPS_PER_TEST ]; then
310			echo "Loops not properly defined. Resorting to default 5..."
311			export INJECT_FAULT_LOOPS_PER_TEST=5
312		fi
313		if [ ! $INJECT_KERNEL_FAULT_PERCENTAGE ]; then
314			echo "Fault Persentage not properly defined. Resorting to default 10..."
315			export INJECT_KERNEL_FAULT_PERCENTAGE=10
316		fi;;
317        g)  HTMLFILE_NAME="$OPTARG"
318            case $OPTARG in
319            /*)
320                HTMLFILE="$OPTARG";;
321            *)
322                HTMLFILE="$LTPROOT/output/$OPTARG";;
323            esac
324            ALT_DIR_OUT=1
325            ALT_HTML_OUT=1;;
326        h)  usage;;
327
328        i)
329            NUM_PROCS=$(($OPTARG))
330            if   [ "$NUM_PROCS" -eq 0 ]; then
331                # User Did not Define the Value ,or, User Defined Zero,
332                # hence, prevent from creating infinite processes
333                NUM_PROCS=1
334            fi
335            $LTPROOT/testcases/bin/genload --io $NUM_PROCS >/dev/null 2>&1 &
336            GENLOAD=1 ;;
337
338        K)
339	    case $OPTARG in
340        	   /*)
341			DMESG_DIR="$OPTARG-dmesg-output-`echo $$-``date +%X | tr -d ' '`";;
342	            *)
343		        DMESG_DIR="$LTPROOT/output/$OPTARG-dmesg-output-`echo $$-``date +%X | tr -d ' '`";;
344	    esac
345            mkdir -p $DMESG_DIR
346            ALT_DMESG_OUT=1;;
347        l)
348            LOGFILE_NAME="$OPTARG"
349            case $OPTARG in
350            /*)
351                LOGFILE="-l $OPTARG" ;;
352            *)
353                LOGFILE="-l $LTPROOT/results/$OPTARG"
354                ALT_DIR_RES=1 ;;
355            esac ;;
356
357        m)  NUM_PROCS=1; CHUNKS=1; BYTES=$((256 * 1024 * 1024)); HANGUP_FLAG=0
358            ARGUMENT_LIST=$OPTARG
359            TOTAL_ARGUMENTS=1
360            for ARGUMENT in `echo "$ARGUMENT_LIST" | tr ',' ' '`
361            do
362                case $TOTAL_ARGUMENTS in
363                    1) NUM_PROCS="$ARGUMENT" ;;
364                    2) CHUNKS="$ARGUMENT" ;;
365                    3) BYTES="$ARGUMENT" ;;
366                    4) HANGUP_FLAG="$ARGUMENT" ;;
367                esac
368                TOTAL_ARGUMENTS=`expr $TOTAL_ARGUMENTS + 1`
369            done
370            # just to get the default values if the user passed 0
371            if [ "$NUM_PROCS" -eq 0 ]; then
372                NUM_PROCS=1
373            fi
374            if [ "$CHUNKS" -eq 0 ]; then
375                CHUNKS=1
376            fi
377            if [ "$BYTES" -eq 0 ]; then
378                BYTES=$((256 * 1024 * 1024))
379            fi
380            if [ "$HANGUP_FLAG" -ne 1 ]; then
381                HANGUP_FLAG=0
382            fi
383            if [ "$HANGUP_FLAG" -eq 1 ]; then
384                # Hang in a Sleep loop after memory allocated
385                $LTPROOT/testcases/bin/genload --vm $NUM_PROCS --vm-chunks \
386                    $CHUNKS --vm-bytes $BYTES --vm-hang >/dev/null 2>&1 &
387            else
388                # Otherwise Do not Hangup
389                $LTPROOT/testcases/bin/genload --vm $NUM_PROCS --vm-chunks \
390                    $CHUNKS --vm-bytes $BYTES >/dev/null 2>&1 &
391            fi
392            GENLOAD=1;;
393	M)
394		VALGRIND_CHECK=1
395		VALGRIND_CHECK_TYPE="$OPTARG";;
396
397        N)  RUN_NETEST=1;;
398
399        o)  OUTPUTFILE_NAME="$OPTARG"
400            case $OPTARG in
401            /*)
402                OUTPUTFILE="-o $OPTARG";;
403            *)
404                OUTPUTFILE="-o $LTPROOT/output/$OPTARG"
405                ALT_DIR_OUT=1 ;;
406            esac ;;
407
408        p)  PRETTY_PRT="-p";;
409
410        q)  QUIET_MODE="-q";;
411
412        Q)  NO_KMSG="-Q";;
413
414        r)  LTPROOT=$OPTARG;;
415
416        R)  RANDOMRUN=1;;
417
418        s)  TAG_RESTRICT_STRING=$OPTARG;;
419
420	S)  case $OPTARG in
421            /*)
422                SKIPFILE=$OPTARG;;
423            *)
424                SKIPFILE="$LTPROOT/$OPTARG";;
425            esac ;;
426
427        t)  # In case you want to specify the time
428            # to run from the command line
429            # (2m = two minutes, 2h = two hours, etc)
430            DURATION="-t $OPTARG" ;;
431
432        I)  # In case you want the testcases to runsequentially RUN_REPEATED times
433            RUN_REPEATED=$OPTARG;;
434
435        w)  CMDFILEADDR=$OPTARG;;
436
437        x)  # number of ltp's to run
438            cat <<-EOF >&1
439            WARNING: The use of -x can cause unpredictable failures, as a
440                     result of concurrently running multiple tests designed
441                     to be ran exclusively.
442                     Pausing for 10 seconds..."
443	EOF
444            sleep 10
445            INSTANCES="-x $OPTARG";;
446        b) DEVICE=$OPTARG;;
447        B) LTP_DEV_FS_TYPE=$OPTARG;;
448        z) BIG_DEVICE=$OPTARG;;
449        Z) BIG_DEVICE_FS_TYPE=$OPTARG;;
450        \?) usage;;
451        esac
452    done
453
454    ## It would be nice to create a default log file even if the user has not mentioned
455    if [ ! "$LOGFILE" ]; then                                ## User has not mentioned about Log File name
456       LOGFILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
457       LOGFILE="-l $LTPROOT/results/LTP_RUN_ON-$LOGFILE_NAME.log"
458       ALT_DIR_RES=1
459       PRETTY_PRT="-p"
460    fi
461
462    ## It would be nice if a Failed File is compulsorily created (gives User better Idea of Tests that failed)
463
464    if [ ! "$FAILCMDFILE" ]; then                            ## User has not mentioned about Failed File name
465         ALT_DIR_OUT=1
466         if [ ! "$OUTPUTFILE" ]; then		             ## User has not mentioned about Output File name either
467            if [ ! "$LOGFILE" ]; then                        ## User has not mentioned about Log File name either
468               FAILED_FILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
469               FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
470            else					     ## User Fortunately wanted a log file,
471               FAILED_FILE_NAME=`basename $LOGFILE_NAME`     ## Extract log file name and use it to construct Failed file name
472               FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
473            fi
474         else                                                ## User Fortunately wanted a Output file
475               FAILED_FILE_NAME=`basename $OUTPUTFILE_NAME`  ## Extract output file name and use it to construct Failed file name
476               FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
477         fi
478    fi
479
480    if [ ! "$TCONFCMDFILE" ]; then
481         ALT_DIR_OUT=1
482         if [ ! "$OUTPUTFILE" ]; then
483            if [ ! "$LOGFILE" ]; then
484               TCONF_FILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
485               TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
486            else
487               TCONF_FILE_NAME=`basename $LOGFILE_NAME`
488               TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
489            fi
490         else
491               TCONF_FILE_NAME=`basename $OUTPUTFILE_NAME`
492               TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
493         fi
494    fi
495
496    if [ "$ALT_HTML_OUT" -eq 1 ] ; then                      ## User wants the HTML version of the output
497       QUIET_MODE=""                                         ## Suppressing this guy as it will prevent generation of proper output
498                                                             ## which the HTML parser will require
499       if [ ! "$OUTPUTFILE" ]; then                          ## User has not mentioned about the Outputfile name, then we need to definitely generate one
500          OUTPUTFILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
501          OUTPUTFILE="-o $LTPROOT/output/LTP_RUN_ON-$OUTPUTFILE_NAME.output"
502          ALT_DIR_OUT=1
503          if [ ! "$HTMLFILE" ] ; then                        ## User has not mentioned HTML File name, We need to create one
504             HTMLFILE_NAME=`basename $OUTPUTFILE_NAME`
505             HTMLFILE="$LTPROOT/output/$HTMLFILE_NAME.html"
506          fi
507       fi
508    fi
509
510    # If we need, create the output directory
511    [ "$ALT_DIR_OUT" -eq 1 ] && \
512    {
513        [ ! -d $LTPROOT/output ] && \
514        {
515           echo "INFO: creating $LTPROOT/output directory"
516           mkdir -p $LTPROOT/output || \
517           {
518               echo "ERROR: failed to create $LTPROOT/output"
519               exit 1
520            }
521        }
522    }
523    # If we need, create the results directory
524    [ "$ALT_DIR_RES" -eq 1 ] && \
525    {
526        echo "INFO: creating $LTPROOT/results directory"
527        [ ! -d $LTPROOT/results ] && \
528        {
529           mkdir -p $LTPROOT/results || \
530           {
531               echo "ERROR: failed to create $LTPROOT/results"
532               exit 1
533            }
534        }
535    }
536
537    # Added -m 777 for tests that call tst_tmpdir() and try to
538    #  write to it as user nobody
539    mkdir -m 777 -p $TMPBASE || \
540    {
541        echo "FATAL: Unable to make temporary directory $TMPBASE"
542        exit 1
543    }
544    # use mktemp to create "safe" temporary directories
545    export TMPTEMPLATE="${TMPBASE}/ltp-XXXXXXXXXX"
546    TMP=`mktemp -d $TMPTEMPLATE` || \
547    {
548        echo "FATAL: Unable to make temporary directory: $TMP"
549        exit 1
550    }
551    export TMP
552    # To be invoked by tst_tmpdir()
553    # write to it as user nobody
554    export TMPDIR=$TMP
555
556    chmod 777 $TMP || \
557    {
558      echo "unable to chmod 777 $TMP ... aborting"
559      exit 1
560    }
561
562    cd $TMP || \
563    {
564      echo "could not cd ${TMP} ... exiting"
565      exit 1
566    }
567
568    [ -n "$INSTANCES" ] && \
569    {
570      INSTANCES="$INSTANCES -O ${TMP}"
571    }
572
573    # If user does not provide a command file select a default set of testcases
574    # to execute.
575    if [ -z "$CMDFILES" ] && [ -z "$CMDFILEADDR" ]; then
576
577        SCENARIO_LISTS="$LTPROOT/scenario_groups/default"
578        if [ "$RUN_NETEST" -eq 1 ]; then
579            SCENARIO_LISTS="$LTPROOT/scenario_groups/network"
580        fi
581
582        cat <<-EOF >&1
583INFO: no command files were provided. Executing following runtest scenario files:
584`cat $SCENARIO_LISTS | tr '\012' ' '`
585
586EOF
587        cat_ok_sentinel=$TMP/cat_ok.$$
588        touch "$cat_ok_sentinel"
589        cat $SCENARIO_LISTS | while read scenfile; do
590            scenfile=${LTPROOT}/runtest/$scenfile
591            [ -f "$scenfile" ] || continue
592
593            cat $scenfile >> "$TMP/alltests" || {
594                echo "FATAL: unable to append to command file"
595                rm -Rf "$TMP"
596                rm -f "$cat_ok_sentinel"
597                exit 1
598            }
599        done
600        rm -f "$cat_ok_sentinel"
601    fi
602
603    [ -n "$CMDFILES" ] && \
604    {
605        for scenfile in `echo "$CMDFILES" | tr ',' ' '`
606        do
607            [ -f "$scenfile" ] || scenfile="$LTPROOT/runtest/$scenfile"
608            cat "$scenfile" >> ${TMP}/alltests || \
609            {
610                echo "FATAL: unable to create command file"
611                rm -Rf "$TMP"
612                exit 1
613            }
614        done
615    }
616
617    [ -n "$CMDFILEADDR" ] && \
618    {
619        wget -q "${CMDFILEADDR}" -O ${TMP}/wgetcmdfile
620        if [ $? -ne 0 ]; then
621            echo "FATAL: error while getting the command file with wget (address $CMDFILEADDR)"
622            exit 1
623        fi
624        cat "${TMP}/wgetcmdfile" >> ${TMP}/alltests || \
625        {
626            echo "FATAL: unable to create command file"
627            exit 1
628        }
629    }
630
631    # The fsx-linux tests use the SCRATCHDEV environment variable as a location
632    # that can be reformatted and run on.  Set SCRATCHDEV if you want to run
633    # these tests.  As a safeguard, this is disabled.
634    unset SCRATCHDEV
635    [ -n "$SCRATCHDEV" ] && \
636    {
637         cat ${LTPROOT}/runtest/fsx >> ${TMP}/alltests ||
638         {
639             echo "FATAL: unable to create  fsx-linux tests command file"
640             exit 1
641         }
642    }
643
644    # If enabled, execute only test cases that match the PATTERN
645    if [ -n "$TAG_RESTRICT_STRING" ]
646    then
647        mv -f ${TMP}/alltests ${TMP}/alltests.orig
648	    grep $TAG_RESTRICT_STRING ${TMP}/alltests.orig > ${TMP}/alltests #Not worth checking return codes for this case
649    fi
650
651    # Blacklist or skip tests if a SKIPFILE was specified with -S
652    if [ -n "${SKIPFILE}" ]; then
653        for test_name in $(awk '{print $1}' "${SKIPFILE}"); do
654            case "${test_name}" in \#*) continue;; esac
655            sed -i "/\<${test_name}\>/c\\${test_name} exit 32;" alltests
656        done
657    fi
658
659    # check for required users and groups
660    ${LTPROOT}/IDcheck.sh || \
661    {
662        echo "WARNING: required users and groups not present"
663        echo "WARNING: some test cases may fail"
664    }
665
666    # display versions of installed software
667    [ -z "$QUIET_MODE" ] && \
668    {
669        ${LTPROOT}/ver_linux || \
670        {
671            echo "WARNING: unable to display versions of software installed"
672            exit 1
673    }
674    }
675
676    set_block_device
677
678    # here even if the user don't specify a big block device, we
679    # also don't create the big block device.
680    if [ -z "$BIG_DEVICE" ]; then
681        echo "no big block device was specified on commandline."
682        echo "Tests which require a big block device are disabled."
683        echo "You can specify it with option -z"
684    else
685        export LTP_BIG_DEV=$BIG_DEVICE
686        if [ -z "$BIG_DEVICE_FS_TYPE" ]; then
687            export LTP_BIG_DEV_FS_TYPE="ext2"
688        else
689            export LTP_BIG_DEV_FS_TYPE=$BIG_DEVICE_FS_TYPE
690        fi
691    fi
692
693    if [ $RUN_REPEATED -gt 1 ]; then # You need to specify at least more than 1 sequential run, else it runs default
694         echo "PAN will run these test cases $RUN_REPEATED times....."
695         echo "Test Tags will be Prepended with ITERATION NO.s....."
696         inc=1
697         sed -e '/^$/ d' -e 's/^[ ,\t]*//' -e '/^#/ d' < ${TMP}/alltests > ${TMP}/alltests.temp ##This removes all newlines, leading spaces, tabs, #
698         sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp > ${TMP}/alltests ## .temp is kept as Base file
699         while [ $inc -lt $RUN_REPEATED ] ; do
700               inc=`expr $inc + 1`
701               sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp >> ${TMP}/alltests #Keep appending with Iteration No.s
702         done
703    fi
704
705    if [ "$RANDOMRUN" != "0" ]; then
706        sort -R ${TMP}/alltests -o ${TMP}/alltests
707    fi
708
709    [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test start time: $(date)" ; }
710    PAN_COMMAND="${LTPROOT}/bin/ltp-pan $QUIET_MODE $NO_KMSG -e -S $INSTANCES $DURATION -a $$ \
711    -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE"
712    echo "COMMAND:    $PAN_COMMAND"
713    if [ ! -z "$TAG_RESTRICT_STRING" ] ; then
714      echo "INFO: Restricted to $TAG_RESTRICT_STRING"
715    fi
716    #$PAN_COMMAND #Duplicated code here, because otherwise if we fail, only "PAN_COMMAND" gets output
717
718    ## Display the Output/Log/Failed/HTML file names here
719    printf "LOG File: "
720    echo $LOGFILE | cut -b4-
721
722    if [ "$OUTPUTFILE" ]; then
723       printf "OUTPUT File: "
724       echo $OUTPUTFILE | cut -b4-
725    fi
726
727    printf "FAILED COMMAND File: "
728    echo $FAILCMDFILE | cut -b4-
729
730   printf "TCONF COMMAND File: "
731   echo $TCONFCMDFILE | cut -b4-
732
733    if [ "$HTMLFILE" ]; then
734       echo "HTML File: $HTMLFILE"
735    fi
736
737    echo "Running tests......."
738    test_start_time=$(date)
739
740	# User wants testing with Kernel Fault Injection
741	if [ $INJECT_KERNEL_FAULT ] ; then
742		#See if Debugfs is mounted, and
743		#Fault Injection Framework available through Debugfs
744		use_faultinjection=true
745		for debug_subdir in \
746			fail_io_timeout \
747			fail_make_request \
748			fail_page_alloc \
749			failslab \
750		; do
751			if [ -d "/sys/kernel/debug/$debug_subdir" ]
752			then
753				use_faultinjection=true
754				break
755			fi
756		done
757		if $use_faultinjection; then
758			#If atleast one of the Framework is available
759			#Go ahead to Inject Fault & Create required
760			#Command Files for LTP run
761			echo Running tests with Fault Injection Enabled in the Kernel...
762			awk -v LOOPS=$INJECT_FAULT_LOOPS_PER_TEST \
763				-v PERCENTAGE=$INJECT_KERNEL_FAULT_PERCENTAGE \
764				-f ${LTPROOT}/bin/create_kernel_faults_in_loops_and_probability.awk \
765				${TMP}/alltests > ${TMP}/alltests.tmp
766			cp ${TMP}/alltests.tmp ${TMP}/alltests
767			rm -rf ${TMP}/alltests.tmp
768		else
769			echo Fault Injection not enabled in the Kernel..
770			echo Running tests normally...
771		fi
772	fi
773
774	## Valgrind Check will work only when Kernel Fault Injection is not expected,
775	## We do not want to test Faults when valgrind is running
776	if [ $VALGRIND_CHECK ]; then
777		if [ ! $INJECT_KERNEL_FAULT ]; then
778			which valgrind || VALGRIND_CHECK_TYPE=XYZ
779			case $VALGRIND_CHECK_TYPE in
780			[1-3])
781				awk -v CHECK_LEVEL=$VALGRIND_CHECK_TYPE \
782					-f ${LTPROOT}/bin/create_valgrind_check.awk \
783					${TMP}/alltests $VALGRIND_CHECK_TYPE > \
784					${TMP}/alltests.tmp
785				cp ${TMP}/alltests.tmp ${TMP}/alltests
786				rm -rf ${TMP}/alltests.tmp
787				;;
788			*)
789				echo "Invalid Memory Check Type, or, Valgrind is not available"
790				;;
791			esac
792		fi
793	fi
794
795	if [ $ALT_DMESG_OUT -eq 1 ] ; then
796		#We want to print dmesg output for each test,lets do the trick inside the script
797		echo Enabling dmesg output logging for each test...
798		awk -v DMESG_DIR=$DMESG_DIR \
799			-f ${LTPROOT}/bin/create_dmesg_entries_for_each_test.awk \
800			${TMP}/alltests > ${TMP}/alltests.tmp
801		cp ${TMP}/alltests.tmp ${TMP}/alltests
802		rm -rf ${TMP}/alltests.tmp
803	fi
804    # Some tests need to run inside the "bin" directory.
805    cd "${LTPROOT}/testcases/bin"
806    "${LTPROOT}/bin/ltp-pan" $QUIET_MODE $NO_KMSG -e -S $INSTANCES $DURATION -a $$ -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE
807
808    if [ $? -eq 0 ]; then
809      echo "INFO: ltp-pan reported all tests PASS"
810      VALUE=0
811      export LTP_EXIT_VALUE=0;
812    else
813      echo "INFO: ltp-pan reported some tests FAIL"
814      VALUE=1
815      export LTP_EXIT_VALUE=1;
816    fi
817    cd ..
818    echo "LTP Version: $version_date"
819
820	# $DMESG_DIR is used to cache messages obtained from dmesg after a test run.
821	# Proactively reap all of the 0-byte files in $DMESG_DIR as they have zero value
822	# and only clutter up the filesystem.
823
824	if [ $ALT_DMESG_OUT -eq 1 ] ; then
825		if ! find "$DMESG_DIR" -size 0 -exec rm {} + ; then
826			echo "cd to $DMESG_DIR failed: $?"
827		fi
828		if [ -n "$(ls "$DMESG_DIR")" ] ; then
829			echo "Kernel messages were generated for LTP tests $version_date"
830		else
831			echo "No Kernel messages were generated for LTP tests $version_date"
832		fi
833	fi
834
835    if [ "$ALT_HTML_OUT" -eq 1 ] ; then        #User wants the HTML output to be created, it then needs to be generated
836       export LTP_VERSION=$version_date
837       export TEST_START_TIME="$test_start_time"
838       export TEST_END_TIME="$(date)"
839       OUTPUT_DIRECTORY=`echo $OUTPUTFILE | cut -c4-`
840       LOGS_DIRECTORY="$LTPROOT/results"
841       export TEST_OUTPUT_DIRECTORY="$LTPROOT/output"
842       export TEST_LOGS_DIRECTORY=$LOGS_DIRECTORY
843       echo "Generating HTML Output.....!!"
844       ( perl $LTPROOT/bin/genhtml.pl $LTPROOT/bin/html_report_header.txt test_start test_end test_output execution_status $OUTPUT_DIRECTORY  > $HTMLFILE; )
845       echo "Generated HTML Output.....!!"
846       echo "Location: $HTMLFILE";
847
848    fi
849
850    if [ "$ALT_EMAIL_OUT" -eq 1 ] ; then                    ## User wants reports to be e-mailed
851        TAR_FILE_NAME=LTP_RUN_$version_date$DEFAULT_FILE_NAME_GENERATION_TIME.tar
852        if [ "$HTMLFILE_NAME" ] ; then                      ## HTML file Exists
853            if [ "$ALT_HTML_OUT" -ne 1 ] ; then             ## The HTML file path is absolute and not $LTPROOT/output
854                mkdir -p $LTPROOT/output                    ## We need to create this Directory
855                cp $HTMLFILE_NAME $LTPROOT/output/
856            fi
857        fi
858        if [ "$OUTPUTFILE_NAME" ] ; then                    ## Output file exists
859            if [ "$ALT_DIR_OUT" -ne 1 ] ; then              ## The Output file path is absolute and not $LTPROOT/output
860                mkdir -p $LTPROOT/output                    ## We need to create this Directory
861                cp $OUTPUTFILE_NAME $LTPROOT/output/
862            fi
863        fi
864        if [ "$LOGFILE_NAME" ] ; then                       ## Log file exists
865            if [ "$ALT_DIR_RES" -ne 1 ] ; then              ## The Log file path is absolute and not $LTPROOT/results
866                mkdir -p $LTPROOT/results                   ## We need to create this Directory
867                cp $LOGFILE_NAME $LTPROOT/results/
868            fi
869        fi
870        if [ -d $LTPROOT/output ] ; then
871            tar -cf  ./$TAR_FILE_NAME $LTPROOT/output
872            if [ $? -eq 0 ]; then
873                echo "Created TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/output"
874            else
875                echo "Cannot Create TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/output"
876            fi
877        fi
878        if [ -d $LTPROOT/results ] ; then
879            tar -uf ./$TAR_FILE_NAME $LTPROOT/results
880            if [ $? -eq 0 ]; then
881                echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/results"
882            else
883                echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/results"
884            fi
885        fi
886        if [ -e $LTPROOT/nohup.out ] ; then                 ## If User would have Chosen nohup to do ltprun
887            tar -uf ./$TAR_FILE_NAME $LTPROOT/nohup.out
888            if [ $? -eq 0 ]; then
889                echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/nohup.out"
890            else
891                echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/nohup.out"
892            fi
893        fi
894        gzip ./$TAR_FILE_NAME                               ## gzip this guy
895        if [ $? -eq 0 ]; then
896            echo "Gunzipped TAR File: ./$TAR_FILE_NAME"
897        else
898            echo "Cannot Gunzip TAR File: ./$TAR_FILE_NAME"
899        fi
900        if which mutt >/dev/null 2>&1; then
901            echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz"
902            mutt -a ./$TAR_FILE_NAME.gz -s "LTP Reports on $test_start_time" -- $EMAIL_TO < /dev/null
903            if [ $? -eq 0 ]; then
904                echo "Reports Successfully mailed to: $EMAIL_TO"
905            else
906                echo "Reports cannot be mailed to: $EMAIL_TO"
907            fi
908        else ## Use our Ageold mail program
909            echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz"
910            uuencode ./$TAR_FILE_NAME.gz $TAR_FILE_NAME.gz | mail  $EMAIL_TO -s "LTP Reports on $test_start_time"
911            if [ $? -eq 0 ]; then
912                echo "Reports Successfully mailed to: $EMAIL_TO"
913            else
914                echo "Reports cannot be mailed to: $EMAIL_TO"
915            fi
916        fi
917    fi
918
919    [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test end time: $(date)" ; }
920
921    [ "$GENLOAD" -eq 1 ] && { killall -9 genload  >/dev/null 2>&1; }
922    [ "$NETPIPE" -eq 1 ] && { killall -9 NPtcp  >/dev/null 2>&1; }
923
924    [ "$ALT_DIR_OUT" -eq 1 ] || [ "$ALT_DIR_RES" -eq 1 ] && \
925    {
926    cat <<-EOF >&1
927
928       ###############################################################
929
930            Done executing testcases.
931            LTP Version:  $version_date
932       ###############################################################
933
934	EOF
935    }
936    exit $VALUE
937}
938
939create_block()
940{
941    #create a block device
942    dd if=/dev/zero of=${TMP}/test.img bs=1024 count=262144 >/dev/null 2>&1
943    if [ $? -ne 0 ]; then
944        echo "Failed to create loopback device image, please check disk space and re-run"
945        return 1
946    else
947        ##search for an unused loop dev
948        LOOP_DEV=$(losetup -f)
949        if [ $? -ne 0 ]; then
950            echo "no unused loop device is found"
951            return 1
952        else
953            ##attach the created file to loop dev.
954            losetup $LOOP_DEV ${TMP}/test.img
955            if [ $? -ne 0 ]; then
956                echo "losetup failed to create block device"
957                return 1
958            fi
959            DEVICE=$LOOP_DEV
960            return 0
961        fi
962    fi
963}
964
965set_block_device()
966{
967    if [ -z "$DEVICE" ]; then
968        create_block
969        if [ $? -ne 0 ]; then
970            echo "no block device was specified on commandline."
971            echo "Block device could not be created using loopback device"
972            echo "Tests which require block device are disabled."
973            echo "You can specify it with option -b"
974	else
975            export LTP_DEV=$DEVICE
976        fi
977    else
978        export LTP_DEV=$DEVICE
979    fi
980}
981
982cleanup()
983{
984    [ "$LOOP_DEV" ] && losetup -d $LOOP_DEV
985    rm -rf ${TMP}
986}
987
988
989LTP_SCRIPT="$(basename $0)"
990
991if [ "$LTP_SCRIPT" = "runltp" ]; then
992    trap "cleanup" 0
993    setup
994    main "$@"
995fi
996