Bash程序  |  158行  |  4.08 KB

#!/bin/sh
#
#    Command library that provides a boilerplate set of functions and variables
#    required for all bourne shell based scripts.
#
#    Copyright (C) 2009, Cisco Systems 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 2 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, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Garrett Cooper, August 2009
#

set -u

export SHELL_DEBUG=${SHELL_DEBUG:=0}
if [ "x$SHELL_DEBUG" = x1 ] ; then
    set -x
fi

#=============================================================================
# FUNCTION:   tst_cleanup
# PURPOSE:    Clean up after a testcase.
#=============================================================================
tst_cleanup()
{
    # Disable the trap EXIT handler.
    trap '' EXIT
    # To ensure set -u passes...
    TCtmp=${TCtmp:=}
    tst_resm TINFO "Cleaning up."
    # Nuke the testcase temporary directory if it exists.
    [ -d "$TCtmp" ] && rm -rf "$TCtmp"
}

#=============================================================================
# FUNCTION:  setup
# PURPOSE:   Setup the test environment.
#=============================================================================
tst_setup()
{

    TST_COUNT=1
    TST_TOTAL=${TST_TOTAL:=1}
    export TCID TST_COUNT TST_TOTAL

    for varname in TST_TOTAL; do
        if eval "test -z \"\$${varname}\""; then
            end_testcase "You must set ${varname} before calling setup()."
        fi
    done

    LTPROOT=${LTPROOT:="../../../../"}
    TEMPDIR=${TEMPDIR:=/tmp}

    TCtmp=${TCtmp:=$TEMPDIR/$TC$$}
    # User wants a temporary sandbox to play with.
    if [ -n "$TCtmp" -a "$TCtmp" != "$TEMPDIR/$$" ] ; then
        test -d "$TCtmp" || mkdir -p "$TCtmp"
        # Clean up on exit.
        trap tst_cleanup EXIT
    fi

}

#=============================================================================
# FUNCTION NAME:        end_testcase
#
# FUNCTION DESCRIPTION: Print out whether or not a test failed. Do not use
#			this when TBROK messages should be applied.
#
# PARAMETERS:           Failure message, or "" / unset if passed.
#
# RETURNS:              None.
#=============================================================================
end_testcase()
{
    if [ $# -eq 0 ]; then
        tst_resm TPASS "Test successful"
        exit 0
    else
        tst_resm TFAIL "Test broken: $*"
        exit 1
    fi
}

#=============================================================================
# FUNCTION:  exists
# PURPOSE:   Check if command(s) used by this test script exist.
#=============================================================================
exists()
{
    for cmd in $*; do
        if ! command -v $cmd >/dev/null 2>&1; then
            end_testcase "$cmd: command not found"
            exit 1
        fi
    done
}

incr_tst_count()
{
    : $(( TST_COUNT += 1 ))
}

tst_require_root()
{
	if [ "x$(id -u)" != "x0" ]; then
		tst_resm TCONF "You must be root to execute this test"
		exit 0
	fi
}

#
# $0 is maintained by the caller script; tested on FreeBSD (ash) and Gentoo
# GNU/Linux (bash) -- assuming you aren't calling this from another function
# or command:
#
# foo.sh:
# echo ${0##*/}
# . ${$0%%*}/bar.sh
# bar.sh:
# echo ${0##*/}
# echo $SHELL
#
# Gentoo:
# gcooper@orangebox ~/Desktop $ ./foo.sh
# foo.sh
# foo.sh
# /bin/bash
# gcooper@orangebox ~/Desktop $ uname -sr
# Linux 2.6.29-gentoo-r5
#
# FreeBSD:
# $ ./foo.sh
# foo.sh
# foo.sh
# /bin/sh
# $ uname -sr
# FreeBSD 8.0-BETA2
#
TCID=${TCID:=}
[ -z "$TCID" ] && TCID=${0##*/}
TC=$(echo "$TCID" | awk '{ sub( /[0-9]+$/,""); print; }')

. daemonlib.sh