mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-02 10:36:28 +00:00
Add Bash libs tmpdir and log_warn_die. Docu parse_options. Don't use TMPDIR in test-bash-functions; add ok() to test-bash-functions.
This commit is contained in:
45
lib/bash/log_warn_die.sh
Normal file
45
lib/bash/log_warn_die.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
# This program is copyright 2011 Percona Inc.
|
||||
# Feedback and improvements are welcome.
|
||||
#
|
||||
# THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
# 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, version 2; OR the Perl Artistic License. On UNIX and similar
|
||||
# systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
||||
# licenses.
|
||||
#
|
||||
# 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., 59 Temple
|
||||
# Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
# ###########################################################################
|
||||
# Begin log_warn_die lib
|
||||
# ###########################################################################
|
||||
|
||||
# Library: log_warn_die
|
||||
# log_warn_die provides standard log(), warn(), and die() subs.
|
||||
|
||||
set -u
|
||||
|
||||
EXIT_STATUS=0
|
||||
|
||||
log() {
|
||||
TS=$(date +%F-%T | tr :- _);
|
||||
echo "$TS $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
log "$1" >&2
|
||||
EXIT_STATUS=$((EXIT_STATUS | 1))
|
||||
}
|
||||
|
||||
die() {
|
||||
warn "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ###########################################################################
|
||||
# End log_warn_die lib
|
||||
# ###########################################################################
|
@@ -1,11 +1,53 @@
|
||||
# Print usage (--help).
|
||||
# This program is copyright 2011 Percona Inc.
|
||||
# Feedback and improvements are welcome.
|
||||
#
|
||||
# THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
# 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, version 2; OR the Perl Artistic License. On UNIX and similar
|
||||
# systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
||||
# licenses.
|
||||
#
|
||||
# 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., 59 Temple
|
||||
# Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
# ###########################################################################
|
||||
# Begin parse_options lib
|
||||
# ###########################################################################
|
||||
|
||||
# Library: parse_options
|
||||
# parse_options parses Perl POD options from Bash tools and creates
|
||||
# global variables for each option.
|
||||
|
||||
set -u
|
||||
|
||||
# Global variables. These must be global because declare inside a
|
||||
# sub will be scoped locally.
|
||||
declare -a ARGV # non-option args (probably input files)
|
||||
declare EXT_ARGV # everything after -- (args for an external command)
|
||||
|
||||
# Sub: usage
|
||||
# Print usage (--help) and list the program's options.
|
||||
#
|
||||
# Arguments:
|
||||
# file - Program file with Perl POD which has usage and options.
|
||||
#
|
||||
# Required Global Variables:
|
||||
# TIMDIR - Temp directory.
|
||||
# TOOL - Tool's name.
|
||||
#
|
||||
# Optional Global Variables:
|
||||
# OPT_ERR - Command line option error message.
|
||||
usage() {
|
||||
local file=$1
|
||||
|
||||
local usage=$(grep '^Usage: ' $file)
|
||||
local opts=$(grep -A 2 '^=item --' $file | sed -e 's/^=item //' -e 's/^\([A-Z]\)/ \1/' -e 's/^--$//' > $TMPDIR/help)
|
||||
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
if [ "$OPT_ERR" ]; then
|
||||
echo "Error: ${OPT_ERR}" >&2
|
||||
fi
|
||||
echo $usage >&2
|
||||
@@ -17,9 +59,19 @@ usage() {
|
||||
echo "For more information, 'man $TOOL' or 'perldoc $file'." >&2
|
||||
}
|
||||
|
||||
# Parse command line options.
|
||||
declare -a ARGV # non-option args (probably input files)
|
||||
declare EXT_ARGV # everything after -- (args for an external command)
|
||||
# Sub: parse_options
|
||||
# Parse Perl POD options from a program file.
|
||||
#
|
||||
# Arguments:
|
||||
# file - Program file with Perl POD options.
|
||||
#
|
||||
# Required Global Variables:
|
||||
# TIMDIR - Temp directory.
|
||||
#
|
||||
# Declared Global Variables:
|
||||
# This sub decalres a global var for each option by uppercasing the
|
||||
# option, removing the option's leading --, changing all - to _, and
|
||||
# prefixing with "OPT_". E.g. --foo-bar becomes OPT_FOO_BAR.
|
||||
parse_options() {
|
||||
local file=$1
|
||||
shift
|
||||
@@ -117,3 +169,7 @@ parse_options() {
|
||||
eval "$opt"="$val"
|
||||
done
|
||||
}
|
||||
|
||||
# ###########################################################################
|
||||
# End parse_options lib
|
||||
# ###########################################################################
|
||||
|
50
lib/bash/tmpdir.sh
Normal file
50
lib/bash/tmpdir.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
# This program is copyright 2011 Percona Inc.
|
||||
# Feedback and improvements are welcome.
|
||||
#
|
||||
# THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
# 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, version 2; OR the Perl Artistic License. On UNIX and similar
|
||||
# systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
||||
# licenses.
|
||||
#
|
||||
# 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., 59 Temple
|
||||
# Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
# ###########################################################################
|
||||
# Begin tmpdir lib
|
||||
# ###########################################################################
|
||||
|
||||
# Library: tmpdir
|
||||
# tmpdir make a secure temporary directory using mktemp.
|
||||
|
||||
set -u
|
||||
|
||||
TMPDIR=""
|
||||
OPT_TMPDIR={OPT_TMPDIR:""}
|
||||
|
||||
set_TMPDIR() {
|
||||
if [ -n "$OPT_TMPDIR" ]; then
|
||||
TMPDIR="$OPT_TMPDIR"
|
||||
if [ ! -d "$TMPDIR" ]; then
|
||||
mkdir $TMPDIR || die "Cannot make $TMPDIR"
|
||||
fi
|
||||
else
|
||||
local tool=`basename $0`
|
||||
TMPDIR=`mktemp -d /tmp/${tool}.XXXXX` || die "Cannot make secure tmpdir"
|
||||
fi
|
||||
}
|
||||
|
||||
rm_TMPDIR() {
|
||||
if [ -n "$TMPDIR" ] && [ -d "$TMPDIR" ]; then
|
||||
rm -rf $TMPDIR
|
||||
fi
|
||||
TMPDIR=""
|
||||
}
|
||||
|
||||
# ###########################################################################
|
||||
# End tmpdir lib
|
||||
# ###########################################################################
|
44
t/lib/bash/tmpdir.sh
Normal file
44
t/lib/bash/tmpdir.sh
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
TESTS=9
|
||||
|
||||
source "$LIB_DIR/log_warn_die.sh"
|
||||
source "$LIB_DIR/tmpdir.sh"
|
||||
|
||||
TEST_NAME="TMPDIR not defined"
|
||||
is "$TMPDIR" ""
|
||||
|
||||
TEST_NAME="set_TMPDIR makes secure tmpdir"
|
||||
set_TMPDIR
|
||||
ok "test -d $TMPDIR"
|
||||
|
||||
tmpdir=$TMPDIR;
|
||||
|
||||
TEST_NAME="rm_TMPDIR"
|
||||
rm_TMPDIR
|
||||
ok "test ! -d $tmpdir"
|
||||
|
||||
TEST_NAME="rm_TMPDIR resets TMPDIR"
|
||||
is "$TMPDIR" ""
|
||||
|
||||
# --tmpdir
|
||||
OPT_TMPDIR="/tmp/use--tmpdir"
|
||||
|
||||
TEST_NAME="TMPDIR not defined"
|
||||
is "$TMPDIR" ""
|
||||
|
||||
TEST_NAME="--tmpdir does not exist yet"
|
||||
ok "test ! -d $OPT_TMPDIR"
|
||||
|
||||
set_TMPDIR
|
||||
TEST_NAME="set_TMPDIR uses --tmpdir"
|
||||
is "$TMPDIR" "/tmp/use--tmpdir"
|
||||
|
||||
TEST_NAME="set_TMPDIR creates --tmpdir"
|
||||
ok "test -d $TMPDIR"
|
||||
|
||||
tmpdir=$TMPDIR;
|
||||
|
||||
TEST_NAME="rm_TMPDIR removes --tmpdir"
|
||||
rm_TMPDIR
|
||||
ok "test ! -d $tmpdir"
|
@@ -34,9 +34,10 @@ die() {
|
||||
# Paths
|
||||
# ############################################################################
|
||||
|
||||
TMPDIR="/tmp/percona-toolkit.test"
|
||||
if [ ! -d $TMPDIR ]; then
|
||||
mkdir $TMPDIR
|
||||
# Do not use TMPDIR because the tools use it for their own secure tmpdir.
|
||||
TEST_TMPDIR="/tmp/percona-toolkit.test"
|
||||
if [ ! -d $TEST_TMPDIR ]; then
|
||||
mkdir $TEST_TMPDIR
|
||||
fi
|
||||
|
||||
# ############################################################################
|
||||
@@ -69,7 +70,7 @@ load_tests() {
|
||||
# Source a test file to run whatever it contains (hopefully tests!).
|
||||
run_test() {
|
||||
local t=$1 # test file name, e.g. "group-by-all-01" for pt-diskstats
|
||||
rm -rf $TMPDIR/* >/dev/null 2>&1
|
||||
rm -rf $TEST_TMPDIR/* >/dev/null 2>&1
|
||||
|
||||
TEST_NUMBER=1 # test number in this test file
|
||||
|
||||
@@ -98,8 +99,8 @@ result() {
|
||||
echo "not ok $testno - $TEST_FILE $test_name"
|
||||
failed_tests=$(( failed_tests + 1))
|
||||
echo "# Failed '$test_command'" >&2
|
||||
if [ -f $TMPDIR/failed_result ]; then
|
||||
cat $TMPDIR/failed_result | sed -e 's/^/# /' -e '30q' >&2
|
||||
if [ -f $TEST_TMPDIR/failed_result ]; then
|
||||
cat $TEST_TMPDIR/failed_result | sed -e 's/^/# /' -e '30q' >&2
|
||||
fi
|
||||
fi
|
||||
testno=$((testno + 1))
|
||||
@@ -115,7 +116,7 @@ no_diff() {
|
||||
local got=$1
|
||||
local expected=$2
|
||||
test_command="diff $got $expected"
|
||||
eval $test_command > $TMPDIR/failed_result 2>&1
|
||||
eval $test_command > $TEST_TMPDIR/failed_result 2>&1
|
||||
result $?
|
||||
}
|
||||
|
||||
@@ -127,6 +128,12 @@ is() {
|
||||
result $?
|
||||
}
|
||||
|
||||
ok() {
|
||||
local test_command=$1
|
||||
$test_command
|
||||
result $?
|
||||
}
|
||||
|
||||
# ############################################################################
|
||||
# Script starts here
|
||||
# ############################################################################
|
||||
@@ -157,6 +164,6 @@ for t in "${tests[@]}"; do
|
||||
run_test $t
|
||||
done
|
||||
|
||||
rm -rf $TMPDIR
|
||||
rm -rf $TEST_TMPDIR
|
||||
|
||||
exit $failed_tests
|
||||
|
Reference in New Issue
Block a user