anitazha / rpms / ndctl

Forked from rpms/ndctl a year ago
Clone
Bryan Gurney bb0dc7
#!/bin/bash
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
# Copyright (c) 2016 Red Hat, Inc.
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# This program is free software: you can redistribute it and/or modify
Bryan Gurney bb0dc7
# it under the terms of the GNU General Public License as published by
Bryan Gurney bb0dc7
# the Free Software Foundation, either version 3 of the License, or
Bryan Gurney bb0dc7
# (at your option) any later version.
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# This program is distributed in the hope that it will be useful,
Bryan Gurney bb0dc7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Bryan Gurney bb0dc7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Bryan Gurney bb0dc7
# GNU General Public License for more details.
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# You should have received a copy of the GNU General Public License
Bryan Gurney bb0dc7
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
# Author: Yi Zhang  <yizhan@redhat.com>
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
# filename: function
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
# USAGE
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
test x$LXT_TC = x || return
Bryan Gurney bb0dc7
LXT_TC=1
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# print the current date
Bryan Gurney bb0dc7
# usage: d=$(tdate)
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tdate ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    date '+%T' 2>/dev/null
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# print the log information
Bryan Gurney bb0dc7
# usage: tlog "hello world" "WARNING"
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tlog ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local msg=$1
Bryan Gurney bb0dc7
    local log_level=${2:-INFO}
Bryan Gurney bb0dc7
    local cur_date=$(tdate)
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    echo "[$log_level][$cur_date]$msg"
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    return 0
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# run the cmd and format the log. return the exitint status of cmd
Bryan Gurney bb0dc7
# use the global variables: tSTDOUT and tSTDERR to return the stdout and stderr
Bryan Gurney bb0dc7
# usage: trun "ls"
Bryan Gurney bb0dc7
#        trun "ls"; echo $?
Bryan Gurney bb0dc7
#        stdout=$tSTDOUT
Bryan Gurney bb0dc7
#        stderr=$tSTDERR
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
trun ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local cmd="$*"
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    _trun_ "$cmd"
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# verify the execution of command
Bryan Gurney bb0dc7
# if the cmd return 0, mark this checkpoint failed and return 1
Bryan Gurney bb0dc7
# if not, mark it passed and return 0
Bryan Gurney bb0dc7
# usage: tnot "ls /not_existing"
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tnot () {
Bryan Gurney bb0dc7
    local cmd="$*"
Bryan Gurney bb0dc7
    _trun_ "$cmd" 1
Bryan Gurney bb0dc7
    if test $? -eq 0; then
Bryan Gurney bb0dc7
        tfail_ "$cmd" ;
Bryan Gurney bb0dc7
    else
Bryan Gurney bb0dc7
        tpass_ "$cmd" ;
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# verify the execution of command
Bryan Gurney bb0dc7
# if the cmd return 0, mark this checkpoint passed and return 0
Bryan Gurney bb0dc7
# if not, mark it failed and return 1
Bryan Gurney bb0dc7
# usage: tok "ls /"
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tok ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local cmd="$*"
Bryan Gurney bb0dc7
    _trun_ "$cmd" 0
Bryan Gurney bb0dc7
    if test $? -eq 0; then
Bryan Gurney bb0dc7
        tpass_ "$cmd" ;
Bryan Gurney bb0dc7
    else
Bryan Gurney bb0dc7
        tfail_ "$cmd" ;
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# verify the execution of command
Bryan Gurney bb0dc7
# if the cmd return 0, mark this checkpoint passed and return 0
Bryan Gurney bb0dc7
# if not, mark it failes and exit
Bryan Gurney bb0dc7
# usage: terr "ls"
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
#terr ()
Bryan Gurney bb0dc7
#{
Bryan Gurney bb0dc7
#    tok "$*" || tend
Bryan Gurney bb0dc7
#}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# verify the execution of command
Bryan Gurney bb0dc7
# if the cmd return 0, will continue to run the script
Bryan Gurney bb0dc7
# if not, mark it failes and exit
Bryan Gurney bb0dc7
# usage: terr "ls"
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
terr ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local cmd="$*"
Bryan Gurney bb0dc7
    _trun_ "$cmd" 0
Bryan Gurney bb0dc7
    if test $? -ne 0; then
Bryan Gurney bb0dc7
        tfail_ "$cmd" ;
Bryan Gurney bb0dc7
        tend ;
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# exit the program and print the log message
Bryan Gurney bb0dc7
# usage: texit "error message" 100
Bryan Gurney bb0dc7
# similar to the exception
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
texit ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    msg=$1
Bryan Gurney bb0dc7
    err=$2
Bryan Gurney bb0dc7
    is_null $err && err=1
Bryan Gurney bb0dc7
    test $err -lt 1 || err=1
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    tlog "$msg" "ERROR"
Bryan Gurney bb0dc7
    exit $2
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# print the test report, cleanup the testing bed and  close the testing.
Bryan Gurney bb0dc7
# usage: tend
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tend ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local pcount=$(wc -l $tPASS_FILE | awk '{print $1}')
Bryan Gurney bb0dc7
    local fcount=$(wc -l $tFAIL_FILE | awk '{print $1}')
Bryan Gurney bb0dc7
    local total=$(( $pcount + $fcount ))
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    echo "#################################Test Report###############################"
Bryan Gurney bb0dc7
    echo "TOTAL   : $total"
Bryan Gurney bb0dc7
    echo "PASSED  : $pcount"
Bryan Gurney bb0dc7
    echo "FAILED  : $fcount"
Bryan Gurney bb0dc7
    cat $tPASS_FILE $tFAIL_FILE
Bryan Gurney bb0dc7
    echo "###########################End of running $0########################"
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#cleanup
Bryan Gurney bb0dc7
    rm -f $tPASS_FILE $tFAIL_FILE $tRETURN_FILE $tSTDERR_FILE
Bryan Gurney bb0dc7
#   rm -rf $LXT_TMP_DIR
Bryan Gurney bb0dc7
	if [[ $pcount -eq 0 ]] && [[ $total -eq 0 ]];then
Bryan Gurney bb0dc7
	  exit 0
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
    test $pcount -eq 0 && exit 1
Bryan Gurney bb0dc7
    test $pcount -eq $total && exit 0
Bryan Gurney bb0dc7
    exit 1
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# private function
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# print the error message and call stack. return 1
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tfail_ ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local msg=$*
Bryan Gurney bb0dc7
    tlog "$msg" "ERROR" >>$tFAIL_FILE
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    return 1
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# print the sucessful message. return 0
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
tpass_ ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local msg=$*
Bryan Gurney bb0dc7
    tlog "$msg" "PASS" >> $tPASS_FILE
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    return 0
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
_trun_ ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
    local cmd="$1"
Bryan Gurney bb0dc7
    local chk="$2"
Bryan Gurney bb0dc7
    local cur_date=$(tdate)
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    local stdout=$(eval "$cmd" 2>$tSTDERR_FILE; echo $? >$tRETURN_FILE 2>/dev/null)
Bryan Gurney bb0dc7
#timeout -- how to set timeout?
Bryan Gurney bb0dc7
    local exit_status=$(< $tRETURN_FILE)
Bryan Gurney bb0dc7
    local stderr=$(< $tSTDERR_FILE)
Bryan Gurney bb0dc7
    local msg=CMD
Bryan Gurney bb0dc7
#tnot
Bryan Gurney bb0dc7
    if test x$chk = x1; then
Bryan Gurney bb0dc7
        test $exit_status -eq 0 || msg=PASS
Bryan Gurney bb0dc7
        test $exit_status -eq 0 && msg=FAIL
Bryan Gurney bb0dc7
#should let the tester know this is the negative testing
Bryan Gurney bb0dc7
#if cmd return 0 we will return 1 and vice versa
Bryan Gurney bb0dc7
        cmd="[NOT] $cmd"
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
#tok
Bryan Gurney bb0dc7
    if test x$chk = x0; then
Bryan Gurney bb0dc7
        test $exit_status -eq 0 && msg=PASS
Bryan Gurney bb0dc7
        test $exit_status -eq 0 || msg=FAIL
Bryan Gurney bb0dc7
    fi
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    tSTDOUT=$stdout
Bryan Gurney bb0dc7
    tSTDERR=$stderr
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    test $tIGNORE_STDOUT -eq 1 && stdout='redirect the stdout to /dev/null'
Bryan Gurney bb0dc7
    test $tIGNORE_STDERR -eq 1 && stderr='redirect the stderr to /dev/null'
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    echo "[$msg][$cur_date][$HOSTNAME]$cmd"
Bryan Gurney bb0dc7
    echo "STDOUT:"
Bryan Gurney bb0dc7
    test "x$stdout" = x || echo "$stdout"
Bryan Gurney bb0dc7
    echo "STDERR:$stderr"
Bryan Gurney bb0dc7
    echo "RETURN:$exit_status"
Bryan Gurney bb0dc7
    echo
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    return $exit_status
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# setup the testing environment
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
_tsetup_ ()
Bryan Gurney bb0dc7
{
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    LXT_TMP_DIR="/mnt/testarea/lxt";
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    test -z "$HOSTNAME" && HOSTNAME=$(hostname)
Bryan Gurney bb0dc7
    test -d "$LXT_TMP_DIR" || mkdir -p "$LXT_TMP_DIR" >& /dev/null || exit 1
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
    tSTDERR_FILE="$LXT_TMP_DIR/stderr.$$"
Bryan Gurney bb0dc7
    test -e "$tSTDERR_FILE" || > "$tSTDERR_FILE" || exit 1
Bryan Gurney bb0dc7
    tRETURN_FILE="$LXT_TMP_DIR/return.$$"
Bryan Gurney bb0dc7
    test -e "$tRETURN_FILE" || > "$tRETURN_FILE" || exit 1
Bryan Gurney bb0dc7
    tPASS_FILE="$LXT_TMP_DIR/tc.pass.$$"
Bryan Gurney bb0dc7
    test -e "$tPASS_FILE" || > "$tPASS_FILE" || exit 1
Bryan Gurney bb0dc7
    tFAIL_FILE="$LXT_TMP_DIR/tc.fail.$$"
Bryan Gurney bb0dc7
    test -e "$tFAIL_FILE" || > "$tFAIL_FILE" || exit 1
Bryan Gurney bb0dc7
}
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
# main
Bryan Gurney bb0dc7
#
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
# global variables
Bryan Gurney bb0dc7
tIGNORE_STDOUT=0
Bryan Gurney bb0dc7
tIGNORE_STDERR=0
Bryan Gurney bb0dc7
tSTDOUT=
Bryan Gurney bb0dc7
tSTDERR=
Bryan Gurney bb0dc7
#LXT_TMP_DIR
Bryan Gurney bb0dc7
# only used in this file
Bryan Gurney bb0dc7
tPASS_FILE=
Bryan Gurney bb0dc7
tFAIL_FILE=
Bryan Gurney bb0dc7
Bryan Gurney bb0dc7
_tsetup_