#!/bin/bash # Copyright (c) 2016 Red Hat, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Author: Lin Li #summary of this script: # this script is used to provide the generai utils for the automation script based on shell # all the global variables should be upper case and began with under line since this script will be used by many scripts # and we don't want the their value is be override by mistake ###############################global variables###################################### #the global variables should begin with under line plus some special keyword?? #global variables, can be used by other scripts #the stdout and stderr of the cmd execution in Cmd function #can get the exit status of the Cmd function by $? _STDOUT= _STDERR= #if set to 1 will not print the stdout and stderr in the function Cmd #should set them to 0 after using it _IGNORE_STDOUT=0 _IGNORE_STDERR=0 #current hostname, same as the global variable HOSTNAME #don't use readonly since we maybe source this file many times in the same shell environment [ -z "$HOSTNAME" ] && HOSTNAME=$(hostname) #private global variables, only used in current script #temp dir and files used by Cmd to capture the stderr and exit status of cmd execution _TEMP_DIR="/tmp/lstf" [ -d $_TEMP_DIR ] || mkdir -p $_TEMP_DIR >& /dev/null || Fail "failed to mkdir $_TEMP_DIR" _TEMP_STDERR_FILE="$_TEMP_DIR/stderr.$$" [ -e $_TEMP_STDERR_FILE ] || touch $_TEMP_STDERR_FILE || Fail "failed to create $_TEMP_STDERR_FILE" _TEMP_RETURN_FILE="$_TEMP_DIR/return.$$" [ -e $_TEMP_RETURN_FILE ] || touch $_TEMP_RETURN_FILE || Fail "failed to create $_TEMP_RETURN_FILE" ############################################################################################### #private function #print the formated date string function _date_str (){ date 2>/dev/null } ############################################################################################### #summary: # eval the paramters and format the output # don't support stderr redirection in the passed command #usage: # Cmd ls -a # if you don't want to print the stdout or stderr you can set the global variables _IGNORE_STDOUT and _IGNORE_STDERR, for example # _IGNORE_STDOUT=1 # Cmd ls -a # _IGNORE_STDOUT=0 #return: # return the exit status of paramter value execution # store the stdout and stderr to the global variables _STDOUT and _STDERR ############################################################################################### function Cmd (){ #use the double qutoa to store all the arguments as a single string local cmd="$*" local date_str=$(_date_str) local stdout=$(eval $cmd 2>$_TEMP_STDERR_FILE; echo $? >$_TEMP_RETURN_FILE 2>/dev/null) #why cannot get the exit status of the value of eval by this ? # local exit_status=$? #remove the \n hence don't use this method # local exit_status=$(cat $_TEMP_RETURN_FILE) local exit_status=$(< $_TEMP_RETURN_FILE) local stderr=$(< $_TEMP_STDERR_FILE) _STDOUT=$stdout _STDERR=$stderr #will not print the stdout and stderr if the 2 global variables set to 1 [ $_IGNORE_STDOUT -eq 1 ] && stdout='redirect the stdout to /dev/null' [ $_IGNORE_STDERR -eq 1 ] && stderr='redirect the stderr to /dev/null' echo "[CMD][$date_str][$HOSTNAME]#$cmd" echo "STDOUT:$stdout" echo "STDERR:$stderr" echo "RETURN:$exit_status" echo return $exit_status } ############################################################################################### #summary: # print the formated log # consider filter the output through the level # level should be INFO, ERROR, WARNING, PASSED #usage: # Log "msg" "level" # Log "msg" # don't use it like this : Log msg level #return: # 0 ############################################################################################### #should redirect io to stderr if log_level is error? function Log (){ local msg=$1 local log_level=${2:-INFO} local date_str=$(_date_str) echo "[$log_level][$date_str]:$msg" echo return 0 } ############################################################################################### #summary: # print the formated error message, call stack information and exit the program with 1 #usage: # Fail error_msg #exit: # 1 ############################################################################################### function Fail (){ local msg=$* local stack=`caller 0` Log "$stack" Log "$msg" "ERROR" exit 1 } ############################################################################################### #summary: # print the formated passed message and exit the program with 0 #usage: # Pass #exit: # 0 ############################################################################################### function Pass (){ Log "Test case passed" "PASSED" exit 0 } ############################################################################################### #summary: # assert the expression, # if the exiting status of the expression is not 0 fail the case and print the failed message # if 0 do nothing just return 0 #usage: # Assert "$exit_status -eq 0" "failed string" # Assert "ls /dev/sdb" "failed string" #return/exit: # the exiting value of expression ############################################################################################### function Assert (){ #should consider the expr is integra or expression, script? local expr=$1 local failed_msg=$2 [ $expr ] || Fail "$failed_msg" return 0 } is_null() { local string=$1 string=$(echo $string | sed 's/\s//g') test -z $string }