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 -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 182 exit 0 183 } 184 185 main() 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 [ "$RUN_NETEST" -eq 1 ] && \ 574 { 575 [ -z "$RHOST" ] || [ -z "$PASSWD" ] && \ 576 { 577 [ -z "$RHOST" ] && \ 578 { 579 printf "INFO: Enter RHOST = 'name of the remote host machine'" 580 printf "\n-> " 581 read RHOST 582 } 583 584 [ -z "$PASSWD" ] && \ 585 { 586 printf "\nINFO: " 587 printf "Enter PASSWD = 'root passwd of the remote host machine'" 588 printf "\n-> " 589 read PASSWD 590 } 591 export RHOST=$RHOST 592 export PASSWD=$PASSWD 593 echo "WARNING: security of $RHOST may be compromised" 594 } 595 } 596 597 # If user does not provide a command file select a default set of testcases 598 # to execute. 599 if [ -z "$CMDFILES" ] && [ -z "$CMDFILEADDR" ] 600 then 601 cat <<-EOF >&1 602 603 INFO: no command files were provided. Will execute the following 604 runtest scenario files: 605 606 `cat $LTPROOT/scenario_groups/default | tr '\012' ' '` 607 608 EOF 609 610 SCENARIO_LISTS="$LTPROOT/scenario_groups/default" 611 if [ "$RUN_NETEST" -eq 1 ]; then 612 SCENARIO_LISTS="$SCENARIO_LISTS $LTPROOT/scenario_groups/network" 613 fi 614 615 # DO NOT INDENT/DEDENT! 616 if [ -n "$SCENARIO_LISTS" ]; then 617 # Insurance to make sure that the first element in the pipe 618 # completed successfully. 619 cat_ok_sentinel=$TMP/cat_ok.$$ 620 (cat $SCENARIO_LISTS && touch "$cat_ok_sentinel") | \ 621 while read scenfile; do 622 623 scenfile=${LTPROOT}/runtest/$scenfile 624 625 # Skip over non-existent scenario files; things are 626 # robust enough now that the build will fail if these 627 # files don't exist. 628 [ -f "$scenfile" ] || continue 629 630 cat $scenfile >> "$TMP/alltests" || { 631 echo "FATAL: unable to append to command file" 632 rm -Rf "$TMP" 633 rm -f "$cat_ok_sentinel" 634 exit 1 635 } 636 637 done 638 639 rm -f "$cat_ok_sentinel" 640 641 fi 642 # ^^DO NOT INDENT/DEDENT!^^ 643 644 fi 645 646 [ -n "$CMDFILES" ] && \ 647 { 648 for scenfile in `echo "$CMDFILES" | tr ',' ' '` 649 do 650 [ -f "$scenfile" ] || scenfile="$LTPROOT/runtest/$scenfile" 651 cat "$scenfile" >> ${TMP}/alltests || \ 652 { 653 echo "FATAL: unable to create command file" 654 rm -Rf "$TMP" 655 exit 1 656 } 657 done 658 } 659 660 [ -n "$CMDFILEADDR" ] && \ 661 { 662 wget -q "${CMDFILEADDR}" -O ${TMP}/wgetcmdfile 663 if [ $? -ne 0 ]; then 664 echo "FATAL: error while getting the command file with wget (address $CMDFILEADDR)" 665 exit 1 666 fi 667 cat "${TMP}/wgetcmdfile" >> ${TMP}/alltests || \ 668 { 669 echo "FATAL: unable to create command file" 670 exit 1 671 } 672 } 673 674 # The fsx-linux tests use the SCRATCHDEV environment variable as a location 675 # that can be reformatted and run on. Set SCRATCHDEV if you want to run 676 # these tests. As a safeguard, this is disabled. 677 unset SCRATCHDEV 678 [ -n "$SCRATCHDEV" ] && \ 679 { 680 cat ${LTPROOT}/runtest/fsx >> ${TMP}/alltests || 681 { 682 echo "FATAL: unable to create fsx-linux tests command file" 683 exit 1 684 } 685 } 686 687 # If enabled, execute only test cases that match the PATTERN 688 if [ -n "$TAG_RESTRICT_STRING" ] 689 then 690 mv -f ${TMP}/alltests ${TMP}/alltests.orig 691 grep $TAG_RESTRICT_STRING ${TMP}/alltests.orig > ${TMP}/alltests #Not worth checking return codes for this case 692 fi 693 694 # Blacklist or skip tests if a SKIPFILE was specified with -S 695 if [ -n "${SKIPFILE}" ]; then 696 for test_name in $(awk '{print $1}' "${SKIPFILE}"); do 697 case "${test_name}" in \#*) continue;; esac 698 sed -i "/\<${test_name}\>/c\\${test_name} exit 32;" alltests 699 done 700 fi 701 702 # check for required users and groups 703 ${LTPROOT}/IDcheck.sh || \ 704 { 705 echo "WARNING: required users and groups not present" 706 echo "WARNING: some test cases may fail" 707 } 708 709 # display versions of installed software 710 [ -z "$QUIET_MODE" ] && \ 711 { 712 ${LTPROOT}/ver_linux || \ 713 { 714 echo "WARNING: unable to display versions of software installed" 715 exit 1 716 } 717 } 718 719 set_block_device 720 721 # here even if the user don't specify a big block device, we 722 # also don't create the big block device. 723 if [ -z "$BIG_DEVICE" ]; then 724 echo "no big block device was specified on commandline." 725 echo "Tests which require a big block device are disabled." 726 echo "You can specify it with option -z" 727 else 728 export LTP_BIG_DEV=$BIG_DEVICE 729 if [ -z "$BIG_DEVICE_FS_TYPE" ]; then 730 export LTP_BIG_DEV_FS_TYPE="ext2" 731 else 732 export LTP_BIG_DEV_FS_TYPE=$BIG_DEVICE_FS_TYPE 733 fi 734 fi 735 736 if [ $RUN_REPEATED -gt 1 ]; then # You need to specify at least more than 1 sequential run, else it runs default 737 echo "PAN will run these test cases $RUN_REPEATED times....." 738 echo "Test Tags will be Prepended with ITERATION NO.s....." 739 inc=1 740 sed -e '/^$/ d' -e 's/^[ ,\t]*//' -e '/^#/ d' < ${TMP}/alltests > ${TMP}/alltests.temp ##This removes all newlines, leading spaces, tabs, # 741 sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp > ${TMP}/alltests ## .temp is kept as Base file 742 while [ $inc -lt $RUN_REPEATED ] ; do 743 inc=`expr $inc + 1` 744 sed 's/^[0-9,a-z,A-Z]*/'"$inc"'_ITERATION_&/' < ${TMP}/alltests.temp >> ${TMP}/alltests #Keep appending with Iteration No.s 745 done 746 fi 747 748 if [ "$RANDOMRUN" != "0" ]; then 749 sort -R ${TMP}/alltests -o ${TMP}/alltests 750 fi 751 752 [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test start time: $(date)" ; } 753 PAN_COMMAND="${LTPROOT}/bin/ltp-pan $QUIET_MODE $NO_KMSG -e -S $INSTANCES $DURATION -a $$ \ 754 -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE" 755 echo "COMMAND: $PAN_COMMAND" 756 if [ ! -z "$TAG_RESTRICT_STRING" ] ; then 757 echo "INFO: Restricted to $TAG_RESTRICT_STRING" 758 fi 759 #$PAN_COMMAND #Duplicated code here, because otherwise if we fail, only "PAN_COMMAND" gets output 760 761 ## Display the Output/Log/Failed/HTML file names here 762 printf "LOG File: " 763 echo $LOGFILE | cut -b4- 764 765 if [ "$OUTPUTFILE" ]; then 766 printf "OUTPUT File: " 767 echo $OUTPUTFILE | cut -b4- 768 fi 769 770 printf "FAILED COMMAND File: " 771 echo $FAILCMDFILE | cut -b4- 772 773 printf "TCONF COMMAND File: " 774 echo $TCONFCMDFILE | cut -b4- 775 776 if [ "$HTMLFILE" ]; then 777 echo "HTML File: $HTMLFILE" 778 fi 779 780 echo "Running tests......." 781 test_start_time=$(date) 782 783 # User wants testing with Kernel Fault Injection 784 if [ $INJECT_KERNEL_FAULT ] ; then 785 #See if Debugfs is mounted, and 786 #Fault Injection Framework available through Debugfs 787 use_faultinjection=true 788 for debug_subdir in \ 789 fail_io_timeout \ 790 fail_make_request \ 791 fail_page_alloc \ 792 failslab \ 793 ; do 794 if [ -d "/sys/kernel/debug/$debug_subdir" ] 795 then 796 use_faultinjection=true 797 break 798 fi 799 done 800 if $use_faultinjection; then 801 #If atleast one of the Framework is available 802 #Go ahead to Inject Fault & Create required 803 #Command Files for LTP run 804 echo Running tests with Fault Injection Enabled in the Kernel... 805 awk -v LOOPS=$INJECT_FAULT_LOOPS_PER_TEST \ 806 -v PERCENTAGE=$INJECT_KERNEL_FAULT_PERCENTAGE \ 807 -f ${LTPROOT}/bin/create_kernel_faults_in_loops_and_probability.awk \ 808 ${TMP}/alltests > ${TMP}/alltests.tmp 809 cp ${TMP}/alltests.tmp ${TMP}/alltests 810 rm -rf ${TMP}/alltests.tmp 811 else 812 echo Fault Injection not enabled in the Kernel.. 813 echo Running tests normally... 814 fi 815 fi 816 817 ## Valgrind Check will work only when Kernel Fault Injection is not expected, 818 ## We do not want to test Faults when valgrind is running 819 if [ $VALGRIND_CHECK ]; then 820 if [ ! $INJECT_KERNEL_FAULT ]; then 821 which valgrind || VALGRIND_CHECK_TYPE=XYZ 822 case $VALGRIND_CHECK_TYPE in 823 [1-3]) 824 awk -v CHECK_LEVEL=$VALGRIND_CHECK_TYPE \ 825 -f ${LTPROOT}/bin/create_valgrind_check.awk \ 826 ${TMP}/alltests $VALGRIND_CHECK_TYPE > \ 827 ${TMP}/alltests.tmp 828 cp ${TMP}/alltests.tmp ${TMP}/alltests 829 rm -rf ${TMP}/alltests.tmp 830 ;; 831 *) 832 echo "Invalid Memory Check Type, or, Valgrind is not available" 833 ;; 834 esac 835 fi 836 fi 837 838 if [ $ALT_DMESG_OUT -eq 1 ] ; then 839 #We want to print dmesg output for each test,lets do the trick inside the script 840 echo Enabling dmesg output logging for each test... 841 awk -v DMESG_DIR=$DMESG_DIR \ 842 -f ${LTPROOT}/bin/create_dmesg_entries_for_each_test.awk \ 843 ${TMP}/alltests > ${TMP}/alltests.tmp 844 cp ${TMP}/alltests.tmp ${TMP}/alltests 845 rm -rf ${TMP}/alltests.tmp 846 fi 847 # Some tests need to run inside the "bin" directory. 848 cd "${LTPROOT}/testcases/bin" 849 "${LTPROOT}/bin/ltp-pan" $QUIET_MODE $NO_KMSG -e -S $INSTANCES $DURATION -a $$ -n $$ $PRETTY_PRT -f ${TMP}/alltests $LOGFILE $OUTPUTFILE $FAILCMDFILE $TCONFCMDFILE 850 851 if [ $? -eq 0 ]; then 852 echo "INFO: ltp-pan reported all tests PASS" 853 VALUE=0 854 export LTP_EXIT_VALUE=0; 855 else 856 echo "INFO: ltp-pan reported some tests FAIL" 857 VALUE=1 858 export LTP_EXIT_VALUE=1; 859 fi 860 cd .. 861 echo "LTP Version: $version_date" 862 863 # $DMESG_DIR is used to cache messages obtained from dmesg after a test run. 864 # Proactively reap all of the 0-byte files in $DMESG_DIR as they have zero value 865 # and only clutter up the filesystem. 866 867 if [ $ALT_DMESG_OUT -eq 1 ] ; then 868 if ! find "$DMESG_DIR" -size 0 -exec rm {} + ; then 869 echo "cd to $DMESG_DIR failed: $?" 870 fi 871 if [ -n "$(ls "$DMESG_DIR")" ] ; then 872 echo "Kernel messages were generated for LTP tests $version_date" 873 else 874 echo "No Kernel messages were generated for LTP tests $version_date" 875 fi 876 fi 877 878 if [ "$ALT_HTML_OUT" -eq 1 ] ; then #User wants the HTML output to be created, it then needs to be generated 879 export LTP_VERSION=$version_date 880 export TEST_START_TIME="$test_start_time" 881 export TEST_END_TIME="$(date)" 882 OUTPUT_DIRECTORY=`echo $OUTPUTFILE | cut -c4-` 883 LOGS_DIRECTORY="$LTPROOT/results" 884 export TEST_OUTPUT_DIRECTORY="$LTPROOT/output" 885 export TEST_LOGS_DIRECTORY=$LOGS_DIRECTORY 886 echo "Generating HTML Output.....!!" 887 ( perl $LTPROOT/bin/genhtml.pl $LTPROOT/bin/html_report_header.txt test_start test_end test_output execution_status $OUTPUT_DIRECTORY > $HTMLFILE; ) 888 echo "Generated HTML Output.....!!" 889 echo "Location: $HTMLFILE"; 890 891 fi 892 893 if [ "$ALT_EMAIL_OUT" -eq 1 ] ; then ## User wants reports to be e-mailed 894 if [ [ ! "$HTMLFILE_NAME" ] -o [ ! "$OUTPUTFILE_NAME" ] -o [ ! "$LOGFILE_NAME" ] ] ; then 895 ##User does not have output/logs/html-output, nothing to be mailed in this situation 896 echo "Nothing to be mailed here...." 897 else 898 TAR_FILE_NAME=LTP_RUN_$version_date$DEFAULT_FILE_NAME_GENERATION_TIME.tar 899 if [ "$HTMLFILE_NAME" ] ; then ## HTML file Exists 900 if [ "$ALT_HTML_OUT" -ne 1 ] ; then ## The HTML file path is absolute and not $LTPROOT/output 901 mkdir -p $LTPROOT/output ## We need to create this Directory 902 cp $HTMLFILE_NAME $LTPROOT/output/ 903 fi 904 fi 905 if [ "$OUTPUTFILE_NAME" ] ; then ## Output file exists 906 if [ "$ALT_DIR_OUT" -ne 1 ] ; then ## The Output file path is absolute and not $LTPROOT/output 907 mkdir -p $LTPROOT/output ## We need to create this Directory 908 cp $OUTPUTFILE_NAME $LTPROOT/output/ 909 fi 910 fi 911 if [ "$LOGFILE_NAME" ] ; then ## Log file exists 912 if [ "$ALT_DIR_RES" -ne 1 ] ; then ## The Log file path is absolute and not $LTPROOT/results 913 mkdir -p $LTPROOT/results ## We need to create this Directory 914 cp $LOGFILE_NAME $LTPROOT/results/ 915 fi 916 fi 917 if [ -d $LTPROOT/output ] ; then 918 tar -cf ./$TAR_FILE_NAME $LTPROOT/output 919 if [ $? -eq 0 ]; then 920 echo "Created TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/output" 921 else 922 echo "Cannot Create TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/output" 923 fi 924 fi 925 if [ -d $LTPROOT/results ] ; then 926 tar -uf ./$TAR_FILE_NAME $LTPROOT/results 927 if [ $? -eq 0 ]; then 928 echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/results" 929 else 930 echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/results" 931 fi 932 fi 933 if [ -e $LTPROOT/nohup.out ] ; then ## If User would have Chosen nohup to do ltprun 934 tar -uf ./$TAR_FILE_NAME $LTPROOT/nohup.out 935 if [ $? -eq 0 ]; then 936 echo "Updated TAR File: ./$TAR_FILE_NAME successfully, added $LTPROOT/nohup.out" 937 else 938 echo "Cannot Update TAR File: ./$TAR_FILE_NAME for adding $LTPROOT/nohup.out" 939 fi 940 fi 941 gzip ./$TAR_FILE_NAME ## gzip this guy 942 if [ $? -eq 0 ]; then 943 echo "Gunzipped TAR File: ./$TAR_FILE_NAME" 944 else 945 echo "Cannot Gunzip TAR File: ./$TAR_FILE_NAME" 946 fi 947 if [ -e /usr/bin/mutt ] ; then ## This is a better mail client than others 948 echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz" 949 mutt -a ./$TAR_FILE_NAME.gz -s "LTP Reports on $test_start_time" $EMAIL_TO < /dev/null 950 if [ $? -eq 0 ]; then 951 echo "Reports Successfully mailed to: $EMAIL_TO" 952 else 953 echo "Reports cannot be mailed to: $EMAIL_TO" 954 fi 955 else ## Use our Ageold mail program 956 echo "Starting mailing reports to: $EMAIL_TO, file: ./$TAR_FILE_NAME.gz" 957 uuencode ./$TAR_FILE_NAME.gz $TAR_FILE_NAME.gz | mail $EMAIL_TO -s "LTP Reports on $test_start_time" 958 if [ $? -eq 0 ]; then 959 echo "Reports Successfully mailed to: $EMAIL_TO" 960 else 961 echo "Reports cannot be mailed to: $EMAIL_TO" 962 fi 963 fi 964 fi 965 fi 966 967 [ ! -z "$QUIET_MODE" ] && { echo "INFO: Test end time: $(date)" ; } 968 969 [ "$GENLOAD" -eq 1 ] && { killall -9 genload >/dev/null 2>&1; } 970 [ "$NETPIPE" -eq 1 ] && { killall -9 NPtcp >/dev/null 2>&1; } 971 972 [ "$ALT_DIR_OUT" -eq 1 ] || [ "$ALT_DIR_RES" -eq 1 ] && \ 973 { 974 cat <<-EOF >&1 975 976 ############################################################### 977 978 Done executing testcases. 979 LTP Version: $version_date 980 ############################################################### 981 982 EOF 983 } 984 exit $VALUE 985 } 986 987 create_block() 988 { 989 #create a block device 990 dd if=/dev/zero of=${TMP}/test.img bs=1024 count=262144 >/dev/null 2>&1 991 if [ $? -ne 0 ]; then 992 echo "Failed to create loopback device image, please check disk space and re-run" 993 return 1 994 else 995 ##search for an unused loop dev 996 LOOP_DEV=$(losetup -f) 997 if [ $? -ne 0 ]; then 998 echo "no unused loop device is found" 999 return 1 1000 else 1001 ##attach the created file to loop dev. 1002 losetup $LOOP_DEV ${TMP}/test.img 1003 if [ $? -ne 0 ]; then 1004 echo "losetup failed to create block device" 1005 return 1 1006 fi 1007 DEVICE=$LOOP_DEV 1008 return 0 1009 fi 1010 fi 1011 } 1012 1013 set_block_device() 1014 { 1015 if [ -z "$DEVICE" ]; then 1016 create_block 1017 if [ $? -ne 0 ]; then 1018 echo "no block device was specified on commandline." 1019 echo "Block device could not be created using loopback device" 1020 echo "Tests which require block device are disabled." 1021 echo "You can specify it with option -b" 1022 else 1023 export LTP_DEV=$DEVICE 1024 fi 1025 else 1026 export LTP_DEV=$DEVICE 1027 fi 1028 } 1029 1030 cleanup() 1031 { 1032 [ "$LOOP_DEV" ] && losetup -d $LOOP_DEV 1033 rm -rf ${TMP} 1034 } 1035 1036 1037 LTP_SCRIPT="$(basename $0)" 1038 1039 if [ "$LTP_SCRIPT" = "runltp" ]; then 1040 trap "cleanup" 0 1041 setup 1042 main "$@" 1043 fi 1044