Home | History | Annotate | Download | only in ltp
      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 (at] mail.utexas.edu
     26 #               Robbe Williamson - robbiew (at] 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 
     72 setup()
     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"
     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 
    100 version_of_ltp()
    101 {
    102     cat "$LTPROOT/Version"
    103     exit 0
    104 }
    105 
    106 usage()
    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 [ -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.
    155     -r LTPROOT      Fully qualified path where testsuite is installed.
    156     -s PATTERN      Only run test cases which match PATTERN.
    157     -S SKIPFILE     Skip tests specified in SKIPFILE
    158     -t DURATION     Execute the testsuite for given duration. Examples:
    159                       -t 60s = 60 seconds
    160                       -t 45m = 45 minutes
    161                       -t 24h = 24 hours
    162                       -t 2d  = 2 days
    163     -I ITERATIONS   Execute the testsuite ITERATIONS times.
    164     -w CMDFILEADDR  Uses wget to get the user's list of testcases.
    165     -x INSTANCES    Run multiple instances of this testsuite.
    166     -b DEVICE       Some tests require an unmounted block device
    167                     to run correctly.
    168     -B LTP_DEV_FS_TYPE The file system of test block devices.
    169     -z BIG_DEVICE   Some tests require a big unmounted block device
    170                     to run correctly.
    171     -Z  LTP_BIG_DEV_FS_TYPE The file system of the big device
    172 
    173 
    174 
    175     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}
    176 
    177 
    178 	EOF
    179 exit 0
    180 }
    181 
    182 main()
    183 {
    184     local CMDFILES=""
    185     local PRETTY_PRT=""
    186     local ALT_DIR_OUT=0
    187     local ALT_DIR_RES=0
    188     local ALT_HTML_OUT=0
    189     local ALT_EMAIL_OUT=0
    190     local ALT_DMESG_OUT=0
    191     local RUN_NETEST=0
    192     local RUN_REPEATED=0
    193     local QUIET_MODE=""
    194     local NETPIPE=0
    195     local GENLOAD=0
    196     local MEMSIZE=0
    197     local DURATION=""
    198     local CMDFILEADDR=""
    199     local FAILCMDFILE=""
    200     local TCONFCMDFILE=""
    201     local INJECT_KERNEL_FAULT=""
    202     local INJECT_KERNEL_FAULT_PERCENTAGE=""
    203     local INJECT_FAULT_LOOPS_PER_TEST=""
    204     local VALGRIND_CHECK=""
    205     local VALGRIND_CHECK_TYPE=""
    206     local LOGFILE_NAME=""
    207     local LOGFILE=""
    208     local OUTPUTFILE_NAME=""
    209     local OUTPUTFILE=""
    210     local HTMLFILE_NAME=""
    211     local HTMLFILE=""
    212     local DMESG_DIR=""
    213     local EMAIL_TO=""
    214     local TAG_RESTRICT_STRING=""
    215     local PAN_COMMAND=""
    216     local DEFAULT_FILE_NAME_GENERATION_TIME=`date +"%Y_%m_%d-%Hh_%Mm_%Ss"`
    217     local scenfile=
    218 
    219     version_date=$(cat "$LTPROOT/Version")
    220 
    221     while getopts a:c:C:T:d:D:f:F:ehi:I:K:g:l:m:M:Nno:pqr:s:S:t:T:w:x:b:B:z:Z: arg
    222     do  case $arg in
    223         a)  EMAIL_TO=$OPTARG
    224             ALT_EMAIL_OUT=1;;
    225         c)
    226             NUM_PROCS=$(($OPTARG))
    227             if   [ "$NUM_PROCS" -eq 0 ]; then
    228                 # User Did not Define the Value ,or, User Defined Zero,
    229                 # hence, prevent from creating infinite processes
    230                 NUM_PROCS=1
    231             fi
    232             $LTPROOT/testcases/bin/genload --cpu $NUM_PROCS >/dev/null 2>&1 &
    233             GENLOAD=1 ;;
    234 
    235         C)
    236             case $OPTARG in
    237             /*)
    238                 FAILCMDFILE="-C $OPTARG" ;;
    239             *)
    240                 FAILCMDFILE="-C $LTPROOT/output/$OPTARG"
    241                 ALT_DIR_OUT=1 ;;
    242             esac ;;
    243 
    244         T)
    245             case $OPTARG in
    246             /*)
    247                 TCONFCMDFILE="-T $OPTARG" ;;
    248             *)
    249                 TCONFCMDFILE="-T $LTPROOT/output/$OPTARG"
    250                 ALT_DIR_OUT=1 ;;
    251             esac ;;
    252 
    253         d)  # convert the user path to absolute path.
    254             export TMPBASE=$(readlink -f ${OPTARG}) ;;
    255 
    256         D)  NUM_PROCS=1; NUM_FILES=1; NUM_BYTES=$((1024 * 1024 * 1024)); CLEAN_FLAG=0
    257             ARGUMENT_LIST=$OPTARG
    258             TOTAL_ARGUMENTS=1
    259             for ARGUMENT in `echo "$ARGUMENT_LIST" | tr ',' ' '`
    260             do
    261                 case $TOTAL_ARGUMENTS in
    262                     1) NUM_PROCS="$ARGUMENT" ;;
    263                     2) NUM_FILES="$ARGUMENT" ;;
    264                     3) NUM_BYTES="$ARGUMENT" ;;
    265                     4) CLEAN_FLAG="$ARGUMENT" ;;
    266                 esac
    267                 TOTAL_ARGUMENTS=`expr $TOTAL_ARGUMENTS + 1`
    268             done
    269             # just to get the default values if the user passed 0
    270             if [ "$NUM_PROCS" -eq 0 ]; then
    271                 NUM_PROCS=1
    272             fi
    273             if [ "$NUM_FILES" -eq 0 ]; then
    274                 NUM_FILES=1
    275             fi
    276             if [ "$NUM_BYTES" -eq 0 ]; then
    277                 NUM_BYTES=$((1024 * 1024 * 1024))
    278             fi
    279             if [ "$CLEAN_FLAG" -ne 1 ]; then
    280                 CLEAN_FLAG=0
    281             fi
    282             if [ "$CLEAN_FLAG" -eq 1 ]; then
    283                 # Do not unlink file in this case
    284                 $LTPROOT/testcases/bin/genload --hdd $NUM_PROCS --hdd-files \
    285                     $NUM_FILES --hdd-bytes $NUM_BYTES >/dev/null 2>&1 &
    286             else
    287                 # Cleanup otherwise
    288                 $LTPROOT/testcases/bin/genload --hdd $NUM_PROCS --hdd-files \
    289                     $NUM_FILES --hdd-bytes $NUM_BYTES --hdd-noclean >/dev/null 2>&1 &
    290             fi
    291             GENLOAD=1;;
    292 
    293         e)  # Print out the version of LTP
    294             version_of_ltp
    295 	    ;;
    296         f)  # Execute user defined set of testcases.
    297             # Can be more then one file, just separate it with ',', like:
    298             # -f nfs,commands,/tmp/testfile
    299             CMDFILES=$OPTARG;;
    300 	F)	INJECT_KERNEL_FAULT=1
    301 		#Seperate out the NO_OF_LOOPS & FAULT_PERCENTAGE
    302 		INJECT_FAULT_LOOPS_PER_TEST=`echo $OPTARG |cut -d',' -f1 | tr -d '\n' | tr -d ' '`
    303 		INJECT_KERNEL_FAULT_PERCENTAGE=`echo $OPTARG |cut -d',' -f2 | tr -d '\n' | tr -d ' '`
    304 		if [ ! $INJECT_FAULT_LOOPS_PER_TEST ]; then
    305 			echo "Loops not properly defined. Resorting to default 5..."
    306 			export INJECT_FAULT_LOOPS_PER_TEST=5
    307 		fi
    308 		if [ ! $INJECT_KERNEL_FAULT_PERCENTAGE ]; then
    309 			echo "Fault Persentage not properly defined. Resorting to default 10..."
    310 			export INJECT_KERNEL_FAULT_PERCENTAGE=10
    311 		fi;;
    312         g)  HTMLFILE_NAME="$OPTARG"
    313             case $OPTARG in
    314             /*)
    315                 HTMLFILE="$OPTARG";;
    316             *)
    317                 HTMLFILE="$LTPROOT/output/$OPTARG";;
    318             esac
    319             ALT_DIR_OUT=1
    320             ALT_HTML_OUT=1;;
    321         h)  usage;;
    322 
    323         i)
    324             NUM_PROCS=$(($OPTARG))
    325             if   [ "$NUM_PROCS" -eq 0 ]; then
    326                 # User Did not Define the Value ,or, User Defined Zero,
    327                 # hence, prevent from creating infinite processes
    328                 NUM_PROCS=1
    329             fi
    330             $LTPROOT/testcases/bin/genload --io $NUM_PROCS >/dev/null 2>&1 &
    331             GENLOAD=1 ;;
    332 
    333         K)
    334 	    case $OPTARG in
    335         	   /*)
    336 			DMESG_DIR="$OPTARG-dmesg-output-`echo $$-``date +%X | tr -d ' '`";;
    337 	            *)
    338 		        DMESG_DIR="$LTPROOT/output/$OPTARG-dmesg-output-`echo $$-``date +%X | tr -d ' '`";;
    339 	    esac
    340             mkdir -p $DMESG_DIR
    341             ALT_DMESG_OUT=1;;
    342         l)
    343             LOGFILE_NAME="$OPTARG"
    344             case $OPTARG in
    345             /*)
    346                 LOGFILE="-l $OPTARG" ;;
    347             *)
    348                 LOGFILE="-l $LTPROOT/results/$OPTARG"
    349                 ALT_DIR_RES=1 ;;
    350             esac ;;
    351 
    352         m)  NUM_PROCS=1; CHUNKS=1; BYTES=$((256 * 1024 * 1024)); HANGUP_FLAG=0
    353             ARGUMENT_LIST=$OPTARG
    354             TOTAL_ARGUMENTS=1
    355             for ARGUMENT in `echo "$ARGUMENT_LIST" | tr ',' ' '`
    356             do
    357                 case $TOTAL_ARGUMENTS in
    358                     1) NUM_PROCS="$ARGUMENT" ;;
    359                     2) CHUNKS="$ARGUMENT" ;;
    360                     3) BYTES="$ARGUMENT" ;;
    361                     4) HANGUP_FLAG="$ARGUMENT" ;;
    362                 esac
    363                 TOTAL_ARGUMENTS=`expr $TOTAL_ARGUMENTS + 1`
    364             done
    365             # just to get the default values if the user passed 0
    366             if [ "$NUM_PROCS" -eq 0 ]; then
    367                 NUM_PROCS=1
    368             fi
    369             if [ "$CHUNKS" -eq 0 ]; then
    370                 CHUNKS=1
    371             fi
    372             if [ "$BYTES" -eq 0 ]; then
    373                 BYTES=$((256 * 1024 * 1024))
    374             fi
    375             if [ "$HANGUP_FLAG" -ne 1 ]; then
    376                 HANGUP_FLAG=0
    377             fi
    378             if [ "$HANGUP_FLAG" -eq 1 ]; then
    379                 # Hang in a Sleep loop after memory allocated
    380                 $LTPROOT/testcases/bin/genload --vm $NUM_PROCS --vm-chunks \
    381                     $CHUNKS --vm-bytes $BYTES --vm-hang >/dev/null 2>&1 &
    382             else
    383                 # Otherwise Do not Hangup
    384                 $LTPROOT/testcases/bin/genload --vm $NUM_PROCS --vm-chunks \
    385                     $CHUNKS --vm-bytes $BYTES >/dev/null 2>&1 &
    386             fi
    387             GENLOAD=1;;
    388 	M)
    389 		VALGRIND_CHECK=1
    390 		VALGRIND_CHECK_TYPE="$OPTARG";;
    391 
    392         N)  RUN_NETEST=1;;
    393 
    394         n)
    395             $LTPROOT/testcases/bin/netpipe.sh
    396             NETPIPE=1;;
    397 
    398         o)  OUTPUTFILE_NAME="$OPTARG"
    399             case $OPTARG in
    400             /*)
    401                 OUTPUTFILE="-o $OPTARG";;
    402             *)
    403                 OUTPUTFILE="-o $LTPROOT/output/$OPTARG"
    404                 ALT_DIR_OUT=1 ;;
    405             esac ;;
    406 
    407         p)  PRETTY_PRT=" -p ";;
    408 
    409         q)  QUIET_MODE=" -q ";;
    410 
    411         r)  LTPROOT=$OPTARG;;
    412 
    413         s)  TAG_RESTRICT_STRING=$OPTARG;;
    414 
    415 	S)  case $OPTARG in
    416             /*)
    417                 SKIPFILE=$OPTARG;;
    418             *)
    419                 SKIPFILE="$LTPROOT/$OPTARG";;
    420             esac ;;
    421 
    422         t)  # In case you want to specify the time
    423             # to run from the command line
    424             # (2m = two minutes, 2h = two hours, etc)
    425             DURATION="-t $OPTARG" ;;
    426 
    427         I)  # In case you want the testcases to runsequentially RUN_REPEATED times
    428             RUN_REPEATED=$OPTARG;;
    429 
    430         w)  CMDFILEADDR=$OPTARG;;
    431 
    432         x)  # number of ltp's to run
    433             cat <<-EOF >&1
    434             WARNING: The use of -x can cause unpredictable failures, as a
    435                      result of concurrently running multiple tests designed
    436                      to be ran exclusively.
    437                      Pausing for 10 seconds..."
    438 	EOF
    439             sleep 10
    440             INSTANCES="-x $OPTARG";;
    441         b) DEVICE=$OPTARG;;
    442         B) LTP_DEV_FS_TYPE=$OPTARG;;
    443         z) BIG_DEVICE=$OPTARG;;
    444         Z) BIG_DEVICE_FS_TYPE=$OPTARG;;
    445         \?) usage;;
    446         esac
    447     done
    448 
    449     ## It would be nice to create a default log file even if the user has not mentioned
    450     if [ ! "$LOGFILE" ]; then                                ## User has not mentioned about Log File name
    451        LOGFILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
    452        LOGFILE="-l $LTPROOT/results/LTP_RUN_ON-$LOGFILE_NAME.log"
    453        ALT_DIR_RES=1
    454        PRETTY_PRT=" -p "
    455     fi
    456 
    457     ## It would be nice if a Failed File is compulsorily created (gives User better Idea of Tests that failed)
    458 
    459     if [ ! "$FAILCMDFILE" ]; then                            ## User has not mentioned about Failed File name
    460          ALT_DIR_OUT=1
    461          if [ ! "$OUTPUTFILE" ]; then		             ## User has not mentioned about Output File name either
    462             if [ ! "$LOGFILE" ]; then                        ## User has not mentioned about Log File name either
    463                FAILED_FILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
    464                FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
    465             else					     ## User Fortunately wanted a log file,
    466                FAILED_FILE_NAME=`basename $LOGFILE_NAME`     ## Extract log file name and use it to construct Failed file name
    467                FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
    468             fi
    469          else                                                ## User Fortunately wanted a Output file
    470                FAILED_FILE_NAME=`basename $OUTPUTFILE_NAME`  ## Extract output file name and use it to construct Failed file name
    471                FAILCMDFILE="-C $LTPROOT/output/LTP_RUN_ON-$FAILED_FILE_NAME.failed"
    472          fi
    473     fi
    474 
    475     if [ ! "$TCONFCMDFILE" ]; then
    476          ALT_DIR_OUT=1
    477          if [ ! "$OUTPUTFILE" ]; then
    478             if [ ! "$LOGFILE" ]; then
    479                TCONF_FILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
    480                TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
    481             else
    482                TCONF_FILE_NAME=`basename $LOGFILE_NAME`
    483                TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
    484             fi
    485          else
    486                TCONF_FILE_NAME=`basename $OUTPUTFILE_NAME`
    487                TCONFCMDFILE="-T $LTPROOT/output/LTP_RUN_ON-${TCONF_FILE_NAME}.tconf"
    488          fi
    489     fi
    490 
    491     if [ "$ALT_HTML_OUT" -eq 1 ] ; then                      ## User wants the HTML version of the output
    492        QUIET_MODE=""                                         ## Suppressing this guy as it will prevent generation of proper output
    493                                                              ## which the HTML parser will require
    494        if [ ! "$OUTPUTFILE" ]; then                          ## User has not mentioned about the Outputfile name, then we need to definitely generate one
    495           OUTPUTFILE_NAME="$DEFAULT_FILE_NAME_GENERATION_TIME"
    496           OUTPUTFILE="-o $LTPROOT/output/LTP_RUN_ON-$OUTPUTFILE_NAME.output"
    497           ALT_DIR_OUT=1
    498           if [ ! "$HTMLFILE" ] ; then                        ## User has not mentioned HTML File name, We need to create one
    499              HTMLFILE_NAME=`basename $OUTPUTFILE_NAME`
    500              HTMLFILE="$LTPROOT/output/$HTMLFILE_NAME.html"
    501           fi
    502        fi
    503     fi
    504 
    505     # If we need, create the output directory
    506     [ "$ALT_DIR_OUT" -eq 1 ] && \
    507     {
    508         [ ! -d $LTPROOT/output ] && \
    509         {
    510            echo "INFO: creating $LTPROOT/output directory"
    511            mkdir -p $LTPROOT/output || \
    512            {
    513                echo "ERROR: failed to create $LTPROOT/output"
    514                exit 1
    515             }
    516         }
    517     }
    518     # If we need, create the results directory
    519     [ "$ALT_DIR_RES" -eq 1 ] && \
    520     {
    521         echo "INFO: creating $LTPROOT/results directory"
    522         [ ! -d $LTPROOT/results ] && \
    523         {
    524            mkdir -p $LTPROOT/results || \
    525            {
    526                echo "ERROR: failed to create $LTPROOT/results"
    527                exit 1
    528             }
    529         }
    530     }
    531 
    532     # Added -m 777 for tests that call tst_tmpdir() and try to
    533     #  write to it as user nobody
    534     mkdir -m 777 -p $TMPBASE || \
    535     {
    536         echo "FATAL: Unable to make temporary directory $TMPBASE"
    537         exit 1
    538     }
    539     # use mktemp to create "safe" temporary directories
    540     export TMPTEMPLATE="${TMPBASE}/ltp-XXXXXXXXXX"
    541     TMP=`mktemp -d $TMPTEMPLATE` || \
    542     {
    543         echo "FATAL: Unable to make temporary directory: $TMP"
    544         exit 1
    545     }
    546     export TMP
    547     # To be invoked by tst_tmpdir()
    548     # write to it as user nobody
    549     export TMPDIR=$TMP
    550 
    551     chmod 777 $TMP || \
    552     {
    553       echo "unable to chmod 777 $TMP ... aborting"
    554       exit 1
    555     }
    556 
    557     cd $TMP || \
    558     {
    559       echo "could not cd ${TMP} ... exiting"
    560       exit 1
    561     }
    562 
    563     [ -n "$INSTANCES" ] && \
    564     {
    565       INSTANCES="$INSTANCES -O ${TMP}"
    566     }
    567 
    568     [ "$RUN_NETEST" -eq 1 ] && \
    569     {
    570         [ -z "$RHOST" ] || [ -z "$PASSWD" ] && \
    571         {
    572             [ -z "$RHOST" ] && \
    573             {
    574                 printf "INFO: Enter RHOST = 'name of the remote host machine'"
    575                 printf "\n-> "
    576                 read RHOST
    577             }
    578 
    579             [ -z "$PASSWD" ] && \
    580             {
    581                 printf "\nINFO: "
    582                 printf "Enter PASSWD = 'root passwd of the remote host machine'"
    583                 printf "\n-> "
    584                 read PASSWD
    585             }
    586             export RHOST=$RHOST
    587             export PASSWD=$PASSWD
    588             echo "WARNING: security of $RHOST may be compromised"
    589         }
    590     }
    591 
    592     # If user does not provide a command file select a default set of testcases
    593     # to execute.
    594     if [ -z "$CMDFILES" ] && [ -z "$CMDFILEADDR" ]
    595     then
    596         cat <<-EOF >&1
    597 
    598     INFO: no command files were provided. Will execute the following
    599           runtest scenario files:
    600 
    601 `cat $LTPROOT/scenario_groups/default | tr '\012' ' '`
    602 
    603 	EOF
    604 
    605 	SCENARIO_LISTS="$LTPROOT/scenario_groups/default"
    606         if [ "$RUN_NETEST" -eq 1 ]; then
    607             SCENARIO_LISTS="$SCENARIO_LISTS $LTPROOT/scenario_groups/network"
    608         fi
    609 
    610     # DO NOT INDENT/DEDENT!
    611         if [ -n "$SCENARIO_LISTS" ]; then
    612             # Insurance to make sure that the first element in the pipe
    613             # completed successfully.
    614             cat_ok_sentinel=$TMP/cat_ok.$$
    615 	    (cat $SCENARIO_LISTS && touch "$cat_ok_sentinel") | \
    616                 while read scenfile; do
    617 
    618                     scenfile=${LTPROOT}/runtest/$scenfile
    619 
    620                     # Skip over non-existent scenario files; things are
    621                     # robust enough now that the build will fail if these
    622                     # files don't exist.
    623                     [ -f "$scenfile" ] || continue
    624 
    625                     cat $scenfile >> "$TMP/alltests" || {
    626                         echo "FATAL: unable to append to command file"
    627                         rm -Rf "$TMP"
    628                         rm -f "$cat_ok_sentinel"
    629                         exit 1
    630                     }
    631 
    632                 done
    633 
    634             rm -f "$cat_ok_sentinel"
    635 
    636         fi
    637     # ^^DO NOT INDENT/DEDENT!^^
    638 
    639     fi
    640 
    641     [ -n "$CMDFILES" ] && \
    642     {
    643         for scenfile in `echo "$CMDFILES" | tr ',' ' '`
    644         do
    645             [ -f "$scenfile" ] || scenfile="$LTPROOT/runtest/$scenfile"
    646             cat "$scenfile" >> ${TMP}/alltests || \
    647             {
    648                 echo "FATAL: unable to create command file"
    649                 rm -Rf "$TMP"
    650                 exit 1
    651             }
    652         done
    653     }
    654 
    655     [ -n "$CMDFILEADDR" ] && \
    656     {
    657         wget -q "${CMDFILEADDR}" -O ${TMP}/wgetcmdfile
    658         if [ $? -ne 0 ]; then
    659             echo "FATAL: error while getting the command file with wget (address $CMDFILEADDR)"
    660             exit 1
    661         fi
    662         cat "${TMP}/wgetcmdfile" >> ${TMP}/alltests || \
    663         {
    664             echo "FATAL: unable to create command file"
    665             exit 1
    666         }
    667     }
    668 
    669     # The fsx-linux tests use the SCRATCHDEV environment variable as a location
    670     # that can be reformatted and run on.  Set SCRATCHDEV if you want to run
    671     # these tests.  As a safeguard, this is disabled.
    672     unset SCRATCHDEV
    673     [ -n "$SCRATCHDEV" ] && \
    674     {
    675          cat ${LTPROOT}/runtest/fsx >> ${TMP}/alltests ||
    676          {
    677              echo "FATAL: unable to create  fsx-linux tests command file"
    678              exit 1
    679          }
    680     }
    681 
    682     # If enabled, execute only test cases that match the PATTERN
    683     if [ -n "$TAG_RESTRICT_STRING" ]
    684     then
    685         mv -f ${TMP}/alltests ${TMP}/alltests.orig
    686 	    grep $TAG_RESTRICT_STRING ${TMP}/alltests.orig > ${TMP}/alltests #Not worth checking return codes for this case
    687     fi
    688 
    689     # Blacklist or skip tests if a SKIPFILE was specified with -S
    690     if [ -n "$SKIPFILE" ]
    691     then
    692         for file in $( cat $SKIPFILE ); do
    693             sed -i "/^$file[ \t]/d" ${TMP}/alltests
    694         done
    695     fi
    696 
    697     # check for required users and groups
    698     ${LTPROOT}/IDcheck.sh || \
    699     {
    700         echo "WARNING: required users and groups not present"
    701         echo "WARNING: some test cases may fail"
    702     }
    703 
    704     # display versions of installed software
    705     [ -z "$QUIET_MODE" ] && \
    706     {
    707         ${LTPROOT}/ver_linux || \
    708         {
    709             echo "WARNING: unable to display versions of software installed"
    710             exit 1
    711     }
    712     }
    713 
    714     set_block_device
    715 
    716     # here even if the user don't specify a big block device, we
    717     # also don't create the big block device.
    718     if [ -z "$BIG_DEVICE" ]; then
    719         echo "no big block device was specified on commandline."
    720         echo "Tests which require a big block device are disabled."
    721         echo "You can specify it with option -z"
    722     else
    723         export LTP_BIG_DEV=$BIG_DEVICE
    724         if [ -z "$BIG_DEVICE_FS_TYPE" ]; then
    725             export LTP_BIG_DEV_FS_TYPE="ext2"
    726         else
    727             export LTP_BIG_DEV_FS_TYPE=$BIG_DEVICE_FS_TYPE
    728         fi
    729     fi
    730 
    731     if [ $RUN_REPEATED -gt 1 ]; then # You need to specify at least more than 1 sequential run, else it runs default
    732          echo "PAN will run these test cases $RUN_REPEATED times....."
    733          echo "Test Tags will be Prepended with ITERATION NO.s....."
    734          inc=1
    735          sed -e '/^$/ d' -e 's/^[ ,\t]*//' -e '/^#/ d' < ${TMP}/alltests > ${TMP}/alltests.temp ##This removes all newlines, leading spaces, tabs, #
    736          sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp > ${TMP}/alltests ## .temp is kept as Base file
    737          while [ $inc -lt $RUN_REPEATED ] ; do
    738                inc=`expr $inc + 1`
    739                sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp >> ${TMP}/alltests #Keep appending with Iteration No.s
    740          done
    741     fi
    742 
    743     [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test start time: $(date)" ; }
    744     PAN_COMMAND="${LTPROOT}/bin/ltp-pan $QUIET_MODE -e -S $INSTANCES $DURATION -a $$ \
    745     -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE"
    746     echo "COMMAND:    $PAN_COMMAND"
    747     if [ ! -z "$TAG_RESTRICT_STRING" ] ; then
    748       echo "INFO: Restricted to $TAG_RESTRICT_STRING"
    749     fi
    750     #$PAN_COMMAND #Duplicated code here, because otherwise if we fail, only "PAN_COMMAND" gets output
    751 
    752     ## Display the Output/Log/Failed/HTML file names here
    753     printf "LOG File: "
    754     echo $LOGFILE | cut -b4-
    755 
    756     if [ "$OUTPUTFILE" ]; then
    757        printf "OUTPUT File: "
    758        echo $OUTPUTFILE | cut -b4-
    759     fi
    760 
    761     printf "FAILED COMMAND File: "
    762     echo $FAILCMDFILE | cut -b4-
    763 
    764    printf "TCONF COMMAND File: "
    765    echo $TCONFCMDFILE | cut -b4-
    766 
    767     if [ "$HTMLFILE" ]; then
    768        echo "HTML File: $HTMLFILE"
    769     fi
    770 
    771     echo "Running tests......."
    772     test_start_time=$(date)
    773 
    774 	# User wants testing with Kernel Fault Injection
    775 	if [ $INJECT_KERNEL_FAULT ] ; then
    776 		#See if Debugfs is mounted, and
    777 		#Fault Injection Framework available through Debugfs
    778 		use_faultinjection=true
    779 		for debug_subdir in \
    780 			fail_io_timeout \
    781 			fail_make_request \
    782 			fail_page_alloc \
    783 			failslab \
    784 		; do
    785 			if [ -d "/sys/kernel/debug/$debug_subdir" ]
    786 			then
    787 				use_faultinjection=true
    788 				break
    789 			fi
    790 		done
    791 		if $use_faultinjection; then
    792 			#If atleast one of the Framework is available
    793 			#Go ahead to Inject Fault & Create required
    794 			#Command Files for LTP run
    795 			echo Running tests with Fault Injection Enabled in the Kernel...
    796 			awk -v LOOPS=$INJECT_FAULT_LOOPS_PER_TEST \
    797 				-v PERCENTAGE=$INJECT_KERNEL_FAULT_PERCENTAGE \
    798 				-f ${LTPROOT}/bin/create_kernel_faults_in_loops_and_probability.awk \
    799 				${TMP}/alltests > ${TMP}/alltests.tmp
    800 			cp ${TMP}/alltests.tmp ${TMP}/alltests
    801 			rm -rf ${TMP}/alltests.tmp
    802 		else
    803 			echo Fault Injection not enabled in the Kernel..
    804 			echo Running tests normally...
    805 		fi
    806 	fi
    807 
    808 	## Valgrind Check will work only when Kernel Fault Injection is not expected,
    809 	## We do not want to test Faults when valgrind is running
    810 	if [ $VALGRIND_CHECK ]; then
    811 		if [ ! $INJECT_KERNEL_FAULT ]; then
    812 			which valgrind || VALGRIND_CHECK_TYPE=XYZ
    813 			case $VALGRIND_CHECK_TYPE in
    814 			[1-3])
    815 				awk -v CHECK_LEVEL=$VALGRIND_CHECK_TYPE \
    816 					-f ${LTPROOT}/bin/create_valgrind_check.awk \
    817 					${TMP}/alltests $VALGRIND_CHECK_TYPE > \
    818 					${TMP}/alltests.tmp
    819 				cp ${TMP}/alltests.tmp ${TMP}/alltests
    820 				rm -rf ${TMP}/alltests.tmp
    821 				;;
    822 			*)
    823 				echo "Invalid Memory Check Type, or, Valgrind is not available"
    824 				;;
    825 			esac
    826 		fi
    827 	fi
    828 
    829 	if [ $ALT_DMESG_OUT -eq 1 ] ; then
    830 		#We want to print dmesg output for each test,lets do the trick inside the script
    831 		echo Enabling dmesg output logging for each test...
    832 		awk -v DMESG_DIR=$DMESG_DIR \
    833 			-f ${LTPROOT}/bin/create_dmesg_entries_for_each_test.awk \
    834 			${TMP}/alltests > ${TMP}/alltests.tmp
    835 		cp ${TMP}/alltests.tmp ${TMP}/alltests
    836 		rm -rf ${TMP}/alltests.tmp
    837 	fi
    838     # Some tests need to run inside the "bin" directory.
    839     cd "${LTPROOT}/testcases/bin"
    840     "${LTPROOT}/bin/ltp-pan" $QUIET_MODE -e -S $INSTANCES $DURATION -a $$ -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE
    841 
    842     if [ $? -eq 0 ]; then
    843       echo "INFO: ltp-pan reported all tests PASS"
    844       VALUE=0
    845       export LTP_EXIT_VALUE=0;
    846     else
    847       echo "INFO: ltp-pan reported some tests FAIL"
    848       VALUE=1
    849       export LTP_EXIT_VALUE=1;
    850     fi
    851     cd ..
    852     echo "LTP Version: $version_date"
    853 
    854 	# $DMESG_DIR is used to cache messages obtained from dmesg after a test run.
    855 	# Proactively reap all of the 0-byte files in $DMESG_DIR as they have zero value
    856 	# and only clutter up the filesystem.
    857 
    858 	if [ $ALT_DMESG_OUT -eq 1 ] ; then
    859 		if ! find "$DMESG_DIR" -size 0 -exec rm {} + ; then
    860 			echo "cd to $DMESG_DIR failed: $?"
    861 		fi
    862 		if [ -n "$(ls "$DMESG_DIR")" ] ; then
    863 			echo "Kernel messages were generated for LTP tests $version_date"
    864 		else
    865 			echo "No Kernel messages were generated for LTP tests $version_date"
    866 		fi
    867 	fi
    868 
    869     if [ "$ALT_HTML_OUT" -eq 1 ] ; then        #User wants the HTML output to be created, it then needs to be generated
    870        export LTP_VERSION=$version_date
    871        export TEST_START_TIME=$test_start_time
    872        export TEST_END_TIME=$(date)
    873        OUTPUT_DIRECTORY=`echo $OUTPUTFILE | cut -c4-`
    874        LOGS_DIRECTORY="$LTPROOT/results"
    875        export TEST_OUTPUT_DIRECTORY="$LTPROOT/output"
    876        export TEST_LOGS_DIRECTORY=$LOGS_DIRECTORY
    877        echo "Generating HTML Output.....!!"
    878        ( perl $LTPROOT/bin/genhtml.pl $LTPROOT/bin/html_report_header.txt test_start test_end test_output execution_status $OUTPUT_DIRECTORY  > $HTMLFILE; )
    879        echo "Generated HTML Output.....!!"
    880        echo "Location: $HTMLFILE";
    881 
    882     fi
    883 
    884     if [ "$ALT_EMAIL_OUT" -eq 1 ] ; then                      ## User wants reports to be e-mailed
    885        if [ [ ! "$HTMLFILE_NAME" ] -o [ ! "$OUTPUTFILE_NAME" ] -o [ ! "$LOGFILE_NAME" ] ] ; then
    886           ##User does not have output/logs/html-output, nothing to be mailed in this situation
    887           echo "Nothing to be mailed here...."
    888        else
    889            TAR_FILE_NAME=LTP_RUN_$version_date$DEFAULT_FILE_NAME_GENERATION_TIME.tar
    890            if [ "$HTMLFILE_NAME" ] ; then                          ## HTML file Exists
    891               if [ "$ALT_HTML_OUT" -ne 1 ] ; then                  ## The HTML file path is absolute and not $LTPROOT/output
    892                  mkdir -p $LTPROOT/output                          ## We need to create this Directory
    893                  cp $HTMLFILE_NAME $LTPROOT/output/
    894               fi
    895            fi
    896            if [ "$OUTPUTFILE_NAME" ] ; then                        ## Output file exists
    897               if [ "$ALT_DIR_OUT" -ne 1 ] ; then                   ## The Output file path is absolute and not $LTPROOT/output
    898                  mkdir -p $LTPROOT/output                          ## We need to create this Directory
    899                  cp $OUTPUTFILE_NAME $LTPROOT/output/
    900               fi
    901            fi
    902            if [ "$LOGFILE_NAME" ] ; then                           ## Log file exists
    903               if [ "$ALT_DIR_RES" -ne 1 ] ; then                   ## The Log file path is absolute and not $LTPROOT/results
    904                  mkdir -p $LTPROOT/results                         ## We need to create this Directory
    905                  cp $LOGFILE_NAME $LTPROOT/results/
    906               fi
    907            fi
    908            if [ -d $LTPROOT/output ] ; then
    909               tar -cf  ./$TAR_FILE_NAME $LTPROOT/output
    910               if [ $? -eq 0 ]; then
    911                  echo "Created TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/output"
    912               else
    913                  echo "Cannot Create TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/output"
    914               fi
    915            fi
    916            if [ -d $LTPROOT/results ] ; then
    917               tar -uf ./$TAR_FILE_NAME $LTPROOT/results
    918               if [ $? -eq 0 ]; then
    919                  echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/results"
    920               else
    921                  echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/results"
    922               fi
    923            fi
    924            if [ -e $LTPROOT/nohup.out ] ; then                     ## If User would have Chosen nohup to do ltprun
    925               tar -uf ./$TAR_FILE_NAME $LTPROOT/nohup.out
    926               if [ $? -eq 0 ]; then
    927                  echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/nohup.out"
    928               else
    929                  echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/nohup.out"
    930               fi
    931            fi
    932            gzip ./$TAR_FILE_NAME                                     ## gzip this guy
    933            if [ $? -eq 0 ]; then
    934               echo "Gunzipped TAR File: ./$TAR_FILE_NAME"
    935            else
    936               echo "Cannot Gunzip TAR File: ./$TAR_FILE_NAME"
    937            fi
    938            if [ -e /usr/bin/mutt ] ; then                          ## This is a better mail client than others
    939               echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz"
    940               mutt -a ./$TAR_FILE_NAME.gz -s "LTP Reports on $test_start_time" $EMAIL_TO < /dev/null
    941               if [ $? -eq 0 ]; then
    942                  echo "Reports Successfully mailed to: $EMAIL_TO"
    943               else
    944                  echo "Reports cannot be mailed to: $EMAIL_TO"
    945               fi
    946            else ## Use our Ageold mail program
    947               echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz"
    948               uuencode ./$TAR_FILE_NAME.gz $TAR_FILE_NAME.gz | mail  $EMAIL_TO -s "LTP Reports on $test_start_time"
    949               if [ $? -eq 0 ]; then
    950                  echo "Reports Successfully mailed to: $EMAIL_TO"
    951               else
    952                  echo "Reports cannot be mailed to: $EMAIL_TO"
    953               fi
    954            fi
    955        fi
    956     fi
    957 
    958     [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test end time: $(date)" ; }
    959 
    960     [ "$GENLOAD" -eq 1 ] && { killall -9 genload  >/dev/null 2>&1; }
    961     [ "$NETPIPE" -eq 1 ] && { killall -9 NPtcp  >/dev/null 2>&1; }
    962 
    963     [ "$ALT_DIR_OUT" -eq 1 ] || [ "$ALT_DIR_RES" -eq 1 ] && \
    964     {
    965     cat <<-EOF >&1
    966 
    967        ###############################################################
    968 
    969             Done executing testcases.
    970             LTP Version:  $version_date
    971        ###############################################################
    972 
    973 	EOF
    974     }
    975     exit $VALUE
    976 }
    977 
    978 create_block()
    979 {
    980     #create a block device
    981     dd if=/dev/zero of=${TMP}/test.img bs=1kB count=102400 >/dev/null 2>&1
    982     if [ $? -ne 0 ]; then
    983         echo "Failed to create loopback device image, please check disk space and re-run"
    984         return 1
    985     else
    986         ##search for an unused loop dev
    987         LOOP_DEV=$(losetup -f)
    988         if [ $? -ne 0 ]; then
    989             echo "no unused loop device is found"
    990             return 1
    991         else
    992             ##attach the created file to loop dev.
    993             losetup $LOOP_DEV ${TMP}/test.img
    994             if [ $? -ne 0 ]; then
    995                 echo "losetup failed to create block device"
    996                 return 1
    997             fi
    998             DEVICE=$LOOP_DEV
    999             return 0
   1000         fi
   1001     fi
   1002 }
   1003 
   1004 set_block_device()
   1005 {
   1006     if [ -z "$DEVICE" ]; then
   1007         create_block
   1008         if [ $? -ne 0 ]; then
   1009             echo "no block device was specified on commandline."
   1010             echo "Block device could not be created using loopback device"
   1011             echo "Tests which require block device are disabled."
   1012             echo "You can specify it with option -b"
   1013 	else
   1014             export LTP_DEV=$DEVICE
   1015         fi
   1016     else
   1017         export LTP_DEV=$DEVICE
   1018     fi
   1019 }
   1020 
   1021 cleanup()
   1022 {
   1023     [ "$LOOP_DEV" ] && losetup -d $LOOP_DEV
   1024     rm -rf ${TMP}
   1025 }
   1026 
   1027 
   1028 LTP_SCRIPT="$(basename $0)"
   1029 
   1030 if [ "$LTP_SCRIPT" = "runltp" ]; then
   1031     trap "cleanup" 0
   1032     setup
   1033     main "$@"
   1034 fi
   1035