blob: 8a03846b26ce9159c7e0f11528f559b5e4d818e7 [file] [log] [blame]
exit ()
{
if [ -n "$_CLEANUP_TEST" ]; then
rm -f "$WORKSPACE_ROOT/.testing" 2>/dev/null
rm -f "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null
fi
if [ -n "$_SYSLOG_TRACE_PID" ]; then
case "$DISTRIBUTION" in
debian | \
ubuntu | \
redhat | \
centos | \
sl | \
slackware | \
opensuse | \
suse | \
freebsd | \
netbsd | \
openbsd | \
sunos )
kill -TERM "$_SYSLOG_TRACE_PID" 2>/dev/null &&
{
wait "$_SYSLOG_TRACE_PID"
unset _SYSLOG_TRACE_PID
}
;;
esac
fi
builtin exit $*
}
append_path ()
{
if [ -d "$1" ]; then
if [ -n "$PATH" ]; then
echo "$PATH" | $GREP -q -- "$1:" 2>/dev/null && return;
echo "$PATH" | $GREP -q -- "$1\$" 2>/dev/null && return;
PATH="$PATH:$1"
else
PATH="$1"
fi
export PATH
fi
}
prepend_path ()
{
if [ -d "$1" ]; then
if [ -n "$PATH" ]; then
echo "$PATH" | $GREP -q -- "$1:" 2>/dev/null && return;
echo "$PATH" | $GREP -q -- "$1\$" 2>/dev/null && return;
PATH="$1:$PATH"
else
PATH="$1"
fi
export PATH
fi
}
append_cflags ()
{
if [ -n "$1" ]; then
if [ -n "$CFLAGS" ]; then
echo "$CFLAGS" | $GREP -q -- "$1 " 2>/dev/null && return;
echo "$CFLAGS" | $GREP -q -- "$1\$" 2>/dev/null && return;
CFLAGS="$CFLAGS $1"
else
CFLAGS="$1"
fi
export CFLAGS
fi
}
append_cppflags ()
{
if [ -n "$1" ]; then
if [ -n "$CPPFLAGS" ]; then
echo "$CPPFLAGS" | $GREP -q -- "$1 " 2>/dev/null && return;
echo "$CPPFLAGS" | $GREP -q -- "$1\$" 2>/dev/null && return;
CPPFLAGS="$CPPFLAGS $1"
else
CPPFLAGS="$1"
fi
export CPPFLAGS
fi
}
append_ldflags ()
{
if [ -n "$1" ]; then
if [ -n "$LDFLAGS" ]; then
echo "$LDFLAGS" | $GREP -q -- "$1 " 2>/dev/null && return;
echo "$LDFLAGS" | $GREP -q -- "$1\$" 2>/dev/null && return;
LDFLAGS="$LDFLAGS $1"
else
LDFLAGS="$1"
fi
export LDFLAGS
fi
}
append_ld_library_path ()
{
if [ -d "$1" ]; then
if [ -n "$LD_LIBRARY_PATH" ]; then
echo "$LD_LIBRARY_PATH" | $GREP -q -- "$1:" 2>/dev/null && return;
echo "$LD_LIBRARY_PATH" | $GREP -q -- "$1\$" 2>/dev/null && return;
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$1"
else
LD_LIBRARY_PATH="$1"
fi
export LD_LIBRARY_PATH
fi
}
find_jenkins_workspace_root ()
{
if [ -z "$WORKSPACE" -o ! -d "$WORKSPACE" ]; then
echo "find_jenkins_workspace_root: Unable to find workspace root since no WORKSPACE has been defined" >&2
return 1
fi
local workspace="$WORKSPACE"
local max_iter=20
local currdir
while [ "$max_iter" -gt 0 ] 2>/dev/null; do
# check if the last dir on the path is workspace
currdir=`echo "$workspace" | sed 's%.*/%%' 2>/dev/null`
if [ "$currdir" = "workspace" ]; then
break
fi
# remove the last dir on the path
workspace=`echo "$workspace" | sed 's%/[^/]*$%%' 2>/dev/null`
max_iter=$(( max_iter - 1))
done
if [ -n "$workspace" -a "$max_iter" -gt 0 ] 2>/dev/null; then
WORKSPACE_ROOT="$workspace"
return 0
fi
echo "find_jenkins_workspace_root: Failed to find workspace root in WORKSPACE=$WORKSPACE" >&2
return 1
}
find_program ()
{
if [ -n "$1" ]; then
local path=`which "$1" 2>/dev/null`
if [ -n "$path" -a -x "$path" ]; then
echo "$path"
return 0
fi
fi
return 1
}
find_make ()
{
local make
local program
local programs="gmake make"
case "$DISTRIBUTION" in
freebsd )
programs="gmake"
;;
esac
for program in $programs; do
make=`find_program "$program"`
if [ -n "$make" ]; then
export MAKE="$make"
return 0
fi
done
return 1
}
find_m4 ()
{
local m4
local program
for program in gm4 m4; do
m4=`find_program "$program"`
if [ -n "$m4" ]; then
export M4="$m4"
return 0
fi
done
return 1
}
find_md5sum ()
{
local md5sum
local program
for program in md5sum gmd5sum md5; do
md5sum=`find_program "$program"`
if [ -n "$md5sum" ]; then
MD5SUM="$md5sum"
case "$program" in
md5)
MD5SUM="$MD5SUM -q"
;;
esac
export MD5SUM
return 0
fi
done
return 1
}
find_sha1sum ()
{
local shasum
local program
for program in sha1sum gsha1sum shasum sha1; do
shasum=`find_program "$program"`
if [ -n "$shasum" ]; then
SHA1SUM="$shasum"
case "$program" in
shasum)
SHA1SUM="$SHA1SUM -a 1"
;;
sha1)
SHA1SUM="$SHA1SUM -q"
;;
esac
export SHA1SUM
return 0
fi
done
return 1
}
find_sha256sum ()
{
local sha256sum
local program
for program in sha256sum gsha256sum shasum sha256; do
sha256sum=`find_program "$program"`
if [ -n "$sha256sum" ]; then
SHA256SUM="$shasum"
case "$program" in
shasum)
SHA256SUM="$SHA256SUM -a 256"
;;
sha256)
SHA256SUM="$SHA256SUM -q"
;;
esac
export SHA256SUM
return 0
fi
done
return 1
}
find_wget ()
{
local wget
local program
for program in wget; do
wget=`find_program "$program"`
if [ -n "$wget" ]; then
export WGET="$wget"
return 0
fi
done
return 1
}
find_ccache ()
{
local ccache
local program
local path
for program in ccache; do
ccache=`find_program "$program"`
if [ -n "$ccache" ]; then
export CCACHE="$ccache"
for path in /usr/lib64/ccache /usr/lib/ccache /usr/local/lib64/ccache /usr/local/lib/ccache; do
if [ -d "$path" ]; then
prepend_path "$path"
break
fi
done
return 0
fi
done
return 1
}
find_cc ()
{
local cc
local program
for program in cc gcc; do
cc=`find_program "$program"`
if [ -n "$cc" ]; then
export CC="$cc"
return 0
fi
done
return 1
}
find_cxx ()
{
local cxx
local program
for program in c++ g++; do
cxx=`find_program "$program"`
if [ -n "$cxx" ]; then
export CXX="$cxx"
return 0
fi
done
return 1
}
find_tee ()
{
local tee
local program
for program in tee; do
tee=`find_program "$program"`
if [ -n "$tee" ]; then
export TEE="$tee"
return 0
fi
done
return 1
}
find_date ()
{
local date
local program
local time_now
for program in date; do
date=`find_program "$program"`
if [ -n "$date" ]; then
time_now=`$date '+%s' 2>/dev/null`
if [ -n "$time_now" -a "$time_now" -gt 0 ] 2>/dev/null; then
export DATE="$date"
return 0
fi
fi
done
return 1
}
find_tail ()
{
local tail
local tail_follow
local program
local programs="tail"
case "$DISTRIBUTION" in
sunos )
programs="gtail"
;;
esac
for program in $programs; do
tail=`find_program "$program"`
if [ -n "$tail" ]; then
break
fi
done
if [ -z "$tail" ]; then
return 1
fi
case "$DISTRIBUTION" in
debian | \
ubuntu | \
redhat | \
centos | \
sl | \
slackware | \
opensuse | \
suse | \
sunos )
tail_follow="$tail --follow=name -n 0"
;;
freebsd | \
netbsd )
tail_follow="$tail -f -F -n 0"
;;
openbsd )
tail_follow="$tail -f -n 0"
;;
esac
if [ -z "$tail_follow" ]; then
return 1
fi
export TAIL="$tail"
export TAIL_FOLLOW="$tail_follow"
return 0
}
find_grep ()
{
local grep
local program
for program in ggrep grep; do
grep=`find_program "$program"`
if [ -n "$grep" ]; then
export GREP="$grep"
return
fi
done
return 1
}
setup_install_root ()
{
if [ -n "$INSTALL_ROOT" ]; then
if [ -d "$INSTALL_ROOT" ]; then
return 0
else
return 1
fi
fi
if [ ! -d "$WORKSPACE_ROOT/root" ]; then
if ! mkdir -p "$WORKSPACE_ROOT/root" 2>/dev/null; then
echo "setup_install_root: Unable to create INSTALL_ROOT at $WORKSPACE_ROOT/root" >&2
return 1
fi
fi
if [ -n "$INSTALL_TAG" ]; then
if [ ! -d "$WORKSPACE_ROOT/root/$INSTALL_TAG" ]; then
if ! mkdir -p "$WORKSPACE_ROOT/root/$INSTALL_TAG" 2>/dev/null; then
echo "setup_install_root: Unable to create INSTALL_ROOT at $WORKSPACE_ROOT/root/$INSTALL_TAG" >&2
return 1
fi
fi
INSTALL_ROOT="$WORKSPACE_ROOT/root/$INSTALL_TAG"
if [ -d "$INSTALL_ROOT/bin" ]; then
prepend_path "$INSTALL_ROOT/bin"
fi
if [ -d "$INSTALL_ROOT/sbin" ]; then
prepend_path "$INSTALL_ROOT/sbin"
fi
if [ -d "$INSTALL_ROOT/lib64" ]; then
append_ldflags "-L$INSTALL_ROOT/lib64"
append_ld_library_path "$INSTALL_ROOT/lib64"
fi
if [ -d "$INSTALL_ROOT/lib" ]; then
append_ldflags "-L$INSTALL_ROOT/lib"
append_ld_library_path "$INSTALL_ROOT/lib"
fi
if [ -d "$INSTALL_ROOT/include" ]; then
append_cflags "-I$INSTALL_ROOT/include"
append_cppflags "-I$INSTALL_ROOT/include"
fi
return 0
fi
echo "setup_install_root: INSTALL_TAG or INSTALL_ROOT is not set, need to know in where to build/test" >&2
return 1
}
detect_revision ()
{
if [ -z "$REVISION" ]; then
if [ -n "$SVN_REVISION" ]; then
REVISION="$SVN_REVISION"
elif [ -n "$GIT_COMMIT" ]; then
REVISION="$GIT_COMMIT"
fi
fi
}
detect_distribution ()
{
DISTRIBUTION="UNKNOWN"
if [ -f "/etc/debian_version" ]; then
if uname -a 2>/dev/null | $GREP -q -i ubuntu 2>/dev/null; then
DISTRIBUTION="ubuntu"
else
DISTRIBUTION="debian"
fi
elif [ -f "/etc/redhat-release" ]; then
if $GREP -q -i centos /etc/redhat-release 2>/dev/null; then
DISTRIBUTION="centos"
elif $GREP -q -i fedora /etc/redhat-release 2>/dev/null; then
DISTRIBUTION="fedora"
elif $GREP -q -i "scientific linux" /etc/redhat-release 2>/dev/null; then
DISTRIBUTION="sl"
else
DISTRIBUTION="redhat"
fi
elif [ -f "/etc/slackware-version" ]; then
DISTRIBUTION="slackware"
elif [ -f "/etc/os-release" ]; then
if $GREP -q -i opensuse /etc/os-release 2>/dev/null; then
DISTRIBUTION="opensuse"
fi
elif [ -f "/etc/SuSE-release" ]; then
if $GREP -q -i "suse linux enterprise" /etc/SuSE-release 2>/dev/null; then
DISTRIBUTION="suse"
fi
elif uname -a 2>/dev/null | $GREP -q -i freebsd 2>/dev/null; then
DISTRIBUTION="freebsd"
elif uname -a 2>/dev/null | $GREP -q -i sunos 2>/dev/null; then
DISTRIBUTION="sunos"
elif uname -a 2>/dev/null | $GREP -q -i openbsd 2>/dev/null; then
DISTRIBUTION="openbsd"
elif uname -a 2>/dev/null | $GREP -q -i netbsd 2>/dev/null; then
DISTRIBUTION="netbsd"
fi
export DISTRIBUTION
}
init ()
{
unset _CLEANUP_TEST
unset _SYSLOG_TRACE_PID
unset PRE_TEST
unset POST_TEST
find_grep || exit 1
detect_revision
detect_distribution
find_jenkins_workspace_root || exit 1
setup_install_root || exit 1
find_make || exit 1
find_m4 || exit 1
find_wget || exit 1
find_md5sum || exit 1
find_sha1sum || exit 1
find_sha256sum || exit 1
find_ccache # ccache needs to be found before cc/cxx
find_cc || exit 1
find_cxx || exit 1
find_tee || exit 1
find_date || exit 1
find_tail || exit 1
# prevent CTRL-Z and CTRL-C
trap "" SIGINT 2>/dev/null >/dev/null
trap "" SIGTSTP 2>/dev/null >/dev/null
return 0
}
finish ()
{
local core
find "$WORKSPACE" "$INSTALL_ROOT" -name '*core' -type f 2>/dev/null | while read core; do
chmod a+r "$core" 2>/dev/null
done
}
check_if_built ()
{
if [ -z "$1" ]; then
echo "usage: check_if_built <name tag>" >&2
exit 1
fi
if [ -z "$REVISION" ]; then
echo "check_if_built: No REVISION is set, can't check if build is ok!" >&2
exit 1
fi
local name_tag="$1"
if [ -f "$INSTALL_ROOT/.$name_tag.build" ]; then
local build_rev=`cat "$INSTALL_ROOT/.$name_tag.build" 2>/dev/null`
if [ "$REVISION" = "$build_rev" ]; then
return 0
fi
fi
return 1
}
start_build ()
{
if [ -z "$1" ]; then
echo "usage: start_build <name tag>" >&2
exit 1
fi
local name_tag="$1"
if [ -f "$INSTALL_ROOT/.$name_tag.ok" ]; then
if ! rm "$INSTALL_ROOT/.$name_tag.ok" 2>/dev/null; then
echo "start_build: can't remove old ok file $INSTALL_ROOT/.$name_tag.ok !" >&2
exit 1
fi
fi
echo "start_build: Starting build for $name_tag on $DISTRIBUTION"
return 0
}
set_build_ok ()
{
if [ -z "$1" ]; then
echo "usage: set_build_ok <name tag>" >&2
exit 1
fi
if [ -z "$REVISION" ]; then
echo "set_build_ok: No REVISION is set, can't check if build is ok!" >&2
exit 1
fi
local name_tag="$1"
if [ -f "$INSTALL_ROOT/.$name_tag.ok" ]; then
echo "set_build_ok: Build already mark ok, this should not happend. Did you forget to start_build?" >&2
exit 1
fi
echo "$REVISION" > "$INSTALL_ROOT/.$name_tag.build"
if [ -f "$INSTALL_ROOT/.$name_tag.build" ]; then
local build_rev=`cat "$INSTALL_ROOT/.$name_tag.build" 2>/dev/null`
if [ "$REVISION" = "$build_rev" ]; then
if ! touch "$INSTALL_ROOT/.$name_tag.ok" 2>/dev/null; then
echo "set_build_ok: Can't tag build ok $INSTALL_ROOT/.$name_tag.ok !" >&2
return 1
fi
return 0
fi
fi
echo "set_build_ok: Was not able to tag build ok!" >&2
return 1
}
check_if_tested ()
{
if [ -z "$1" ]; then
echo "usage: check_if_tested <name tag>" >&2
exit 1
fi
if [ -z "$REVISION" ]; then
echo "check_if_tested: No REVISION is set, can't check if test is ok!" >&2
exit 1
fi
local name_tag="$1"
if [ -f "$INSTALL_ROOT/.$name_tag.test" ]; then
local build_rev=`cat "$INSTALL_ROOT/.$name_tag.test" 2>/dev/null`
if [ "$REVISION" = "$build_rev" ]; then
if [ "$INSTALL_ROOT/.$name_tag.junit" ]; then
if ! cp -- "$INSTALL_ROOT/.$name_tag.junit" "$WORKSPACE/junit.xml" 2>/dev/null; then
return 1
fi
fi
if [ -f "$WORKSPACE/junit.xml" ]; then
touch "$WORKSPACE/junit.xml"
fi
return 0
fi
fi
return 1
}
start_test ()
{
if [ -z "$1" ]; then
echo "usage: start_test <name tag>" >&2
exit 1
fi
local name_tag="$1"
# local time_start=`$DATE '+%s' 2>/dev/null`
# local timeout=3600
# local time_stop=$(( time_start + timeout ))
# local time_now
# local build_tag
#
# echo "$BUILD_TAG $$" > "$WORKSPACE_ROOT/.testing.$$"
# build_tag=`cat "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null`
# if [ "$build_tag" != "$BUILD_TAG $$" ]; then
# echo "start_test: Unable to add test lock!" >&2
# rm -f "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null
# return 1
# fi
#
# while true; do
# if [ ! -f "$WORKSPACE_ROOT/.testing" ]; then
# if ln -s "$WORKSPACE_ROOT/.testing.$$" "$WORKSPACE_ROOT/.testing" 2>/dev/null; then
# build_tag=`cat "$WORKSPACE_ROOT/.testing" 2>/dev/null`
# if [ "$build_tag" = "$BUILD_TAG $$" ]; then
# if [ -f "$INSTALL_ROOT/.$name_tag.ok.test" ]; then
# if ! rm "$INSTALL_ROOT/.$name_tag.ok.test" 2>/dev/null; then
# echo "start_test: can't remove old ok file $INSTALL_ROOT/.$name_tag.ok.test !" >&2
# exit 1
# fi
# fi
# export _CLEANUP_TEST=1
# return 0
# fi
# fi
# fi
#
# if [ -z "$time_now" ]; then
# echo "start_test: waiting for other tests to finish (timeout $timeout)"
# fi
#
# time_now=`$DATE '+%s' 2>/dev/null`
# if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
# break
# fi
# if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
# echo "start_test: Invalid timestamp from date!" >&2
# exit 1
# fi
# sleep 2
# done
#
# echo "start_test: Unable to get test lock, timeout" >&2
# rm -f "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null
# exit 1
if [ -f "$INSTALL_ROOT/.$name_tag.ok.test" ]; then
if ! rm "$INSTALL_ROOT/.$name_tag.ok.test" 2>/dev/null; then
echo "start_test: can't remove old ok file $INSTALL_ROOT/.$name_tag.ok.test !" >&2
exit 1
fi
fi
echo "start_test: Starting test for $name_tag on $DISTRIBUTION"
return 0
}
stop_test ()
{
# local build_tag
#
# if [ ! -f "$WORKSPACE_ROOT/.testing" ]; then
# echo "stop_test: Called without a test lock file, this should not happen!" >&2
# return 1
# fi
#
# build_tag=`cat "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null`
# if [ "$build_tag" != "$BUILD_TAG $$" ]; then
# echo "stop_test: Our test lock does not exist or is not our own!" >&2
# return 1
# fi
#
# build_tag=`cat "$WORKSPACE_ROOT/.testing" 2>/dev/null`
# if [ "$build_tag" != "$BUILD_TAG $$" ]; then
# echo "stop_test: Content of test lock changed during test!" >&2
# rm -f "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null
# return 1
# fi
#
# rm -f "$WORKSPACE_ROOT/.testing" 2>/dev/null
# rm -f "$WORKSPACE_ROOT/.testing.$$" 2>/dev/null
# export _CLEANUP_TEST=""
return 0
}
set_test_ok ()
{
if [ -z "$1" ]; then
echo "usage: set_test_ok <name tag>" >&2
exit 1
fi
if [ -z "$REVISION" ]; then
echo "set_test_ok: No REVISION is set, can't check if test is ok!" >&2
exit 1
fi
local name_tag="$1"
if [ -f "$INSTALL_ROOT/.$name_tag.ok.test" ]; then
echo "set_test_ok: Test already mark ok, this should not happend. Did you forget to start_test?" >&2
exit 1
fi
echo "$REVISION" > "$INSTALL_ROOT/.$name_tag.test"
if [ -f "$INSTALL_ROOT/.$name_tag.test" ]; then
local test_rev=`cat "$INSTALL_ROOT/.$name_tag.test" 2>/dev/null`
if [ "$REVISION" = "$test_rev" ]; then
if ! touch "$INSTALL_ROOT/.$name_tag.ok.test" 2>/dev/null; then
echo "set_test_ok: Can't tag test ok $INSTALL_ROOT/.$name_tag.ok.test !" >&2
return 1
fi
if [ -f "$WORKSPACE/junit.xml" ]; then
if ! cp -- "$WORKSPACE/junit.xml" "$INSTALL_ROOT/.$name_tag.junit" 2>/dev/null; then
echo "set_test_ok: Can't copy $WORKSPACE/junit.xml to $INSTALL_ROOT/.$name_tag.junit !" >&2
return 1
fi
fi
return 0
fi
fi
echo "set_test_ok: Was not able to tag test ok!" >&2
return 1
}
require ()
{
if [ -z "$1" ]; then
echo "usage: require <name tag>" >&2
exit 1
fi
local name_tag="$1"
if [ ! -f "$INSTALL_ROOT/.$name_tag.ok" ]; then
echo "require: Required program $name_tag not found or not built!" >&2
exit 1
fi
if [ ! -f "$INSTALL_ROOT/.$name_tag.build" ]; then
echo "require: Required program $name_tag corrupt, can't find build version!" >&2
exit 1
fi
local require_rev=`cat "$INSTALL_ROOT/.$name_tag.build" 2>/dev/null`
if [ -z "$require_rev" ]; then
echo "require: There is no build version for $name_tag!" >&2
exit 1
fi
export REVISION="$REVISION-$name_tag:$require_rev"
}
check_hash ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: check_hash <filename> <type> <hash>" >&2
exit 1
fi
local filename="$1"
local type="$2"
local hash="$3"
local file_hash
if [ -f "$filename" ]; then
case "$type" in
md5)
file_hash=`$MD5SUM "$filename" 2>/dev/null | awk '{print $1}'`
;;
sha1)
file_hash=`$SHA1SUM "$filename" 2>/dev/null | awk '{print $1}'`
;;
sha256)
file_hash=`$SHA256SUM "$filename" 2>/dev/null | awk '{print $1}'`
;;
esac
if [ -n "$file_hash" -a "$hash" = "$file_hash" ]; then
return 0
fi
fi
return 1
}
fetch_src ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ]; then
echo "usage: fetch_src <url> <filename> <type> <hash>" >&2
exit 1
fi
local url="$1"
local filename="$2"
local type="$3"
local hash="$4"
local path_filename
if [ ! -d "$WORKSPACE_ROOT/cache" ]; then
if ! mkdir -p "$WORKSPACE_ROOT/cache" 2>/dev/null; then
echo "fetch_src: Unable to create cache directory $WORKSPACE_ROOT/cache!" >&2
exit 1
fi
fi
path_filename="$WORKSPACE_ROOT/cache/$filename"
if [ -f "$path_filename" ]; then
if check_hash "$path_filename" "$type" "$hash"; then
echo "$path_filename"
return 0
fi
if ! rm "$path_filename" 2>/dev/null; then
echo "fetch_src: Unable to remove old invalid file $path_filename!" >&2
exit 1
fi
fi
if ! $WGET -O "$path_filename" "$url" 2>/dev/null; then
echo "fetch_src: wget failed!" >&2
rm -f "$path_filename" 2>/dev/null
exit 1
fi
if [ ! -f "$path_filename" ]; then
echo "fetch_src: File at $url not found at $path_filename!" >&2
exit 1
fi
if ! check_hash "$path_filename" "$type" "$hash"; then
echo "fetch_src: Checksum does not match for $path_filename!" >&2
exit 1
fi
echo "$path_filename"
}
log_init ()
{
if [ -z "$1" ]; then
echo "usage: log_this <log name>" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
touch "$log_stderr" "$log_stdout"
}
log_this ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: log_this <log name> <command> [options ...]" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
shift
touch "$log_stderr" "$log_stdout"
echo "log_this: logging $name for command: $*"
$* 2>>"$log_stderr" >>"$log_stdout"
}
log_this_timeout ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: log_this_timeout <log name> <timeout in seconds> <command ... >" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local timeout="$2"
local pid
shift 2
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "log_this_timeout: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "log_this_timeout: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "log_this_timeout: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
touch "$log_stderr" "$log_stdout"
echo "log_this_timeout: logging $name with timeout $timeout for command: $*"
( $* 2>>"$log_stderr" >>"$log_stdout" ) &
pid="$!"
if [ -z "$pid" -o "$pid" -le 0 ] 2>/dev/null; then
echo "log_this_timeout: No pid from backgrounded program?" >&2
return 1
fi
while true; do
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "log_this_timeout: Invalid timestamp from date!" >&2
exit 1
fi
if ! kill -0 "$pid" 2>/dev/null; then
wait "$pid"
return "$?"
fi
sleep 1
done
kill -TERM "$pid"
sleep 1
if kill -0 "$pid" 2>/dev/null; then
kill -KILL "$pid"
fi
return 1
}
log_force_stop ()
{
if [ -z "$1" ]; then
echo "usage: log_force_stop <log name> [grace period in seconds]" >&2
exit 1
fi
local name="$1"
local grace="$2"
local log_stderr_pid="_log_pid.$BUILD_TAG.$name.stderr"
local log_stdout_pid="_log_pid.$BUILD_TAG.$name.stdout"
local stderr_pid
local stdout_pid
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop=$(( time_start + 5 ))
local time_now
if [ -n "$grace" -a "$grace" -gt 0 ] 2>/dev/null; then
time_stop=$(( time_start + grace ))
fi
while true; do
if [ ! -f "$log_stderr_pid" -a ! -f "$log_stdout_pid" ]; then
break
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break;
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "log_force_stop: Invalid timestamp from date!" >&2
return 1
fi
sleep 1
done
if [ -f "$log_stderr_pid" ]; then
stderr_pid=`cat "$log_stderr_pid"`
if [ "$stderr_pid" -gt 0 ] 2>/dev/null; then
kill -TERM "$stderr_pid" 2>/dev/null
fi
rm -f "$log_stderr_pid"
fi
if [ -f "$log_stdout_pid" ]; then
stdout_pid=`cat "$log_stdout_pid"`
if [ "$stdout_pid" -gt 0 ] 2>/dev/null; then
kill -TERM "$stdout_pid" 2>/dev/null
fi
rm -f "$log_stdout_pid"
fi
return 0
}
log_grep ()
{
local output=""
OPTIND=1
while getopts ":o" opt; do
case "$opt" in
o)
output=1
;;
\?)
echo "log_grep: Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: log_grep [-o] <log name> <stdout|stderr|both> <grep string ...>" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
local type="$2"
local grep_string="$3"
local log_files
case "$type" in
stdout)
if [ ! -f "$log_stdout" ]; then
return 1
fi
log_files="$log_stdout"
;;
stderr)
if [ ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stderr"
;;
both)
if [ ! -f "$log_stdout" -a ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stdout $log_stderr"
;;
esac
if [ -z "$log_files" ]; then
echo "log_grep: Wrong type of log file specified, should be stdout, stderr or both!" >&2
exit 1
fi
if [ -n "$output" ]; then
$GREP -- "$grep_string" $log_files 2>/dev/null
else
echo "log_grep: greping in $name for: $grep_string"
$GREP -q -- "$grep_string" $log_files 2>/dev/null
fi
}
log_grep_count ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$3" ]; then
echo "usage: log_grep_count <log name> <stdout|stderr|both> <count> <grep string ...>" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
local type="$2"
local grep_string="$3"
local count="$4"
local log_files
local count_found
case "$type" in
stdout)
if [ ! -f "$log_stdout" ]; then
return 1
fi
log_files="$log_stdout"
;;
stderr)
if [ ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stderr"
;;
both)
if [ ! -f "$log_stdout" -a ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stdout $log_stderr"
;;
esac
if [ -z "$log_files" ]; then
echo "log_grep_count: Wrong type of log file specified, should be stdout, stderr or both!" >&2
exit 1
fi
echo "log_grep_count: greping in $name, should find $count of: $grep_string"
count_found=`$GREP -- "$grep_string" $log_files 2>/dev/null | wc -l 2>/dev/null`
if [ "$count_found" -eq "$count" ] 2>/dev/null; then
return 0
fi
return 1
}
log_waitfor ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$3" ]; then
echo "usage: log_waitfor <log name> <stdout|stderr|both> <timeout in seconds> <grep string ...>" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
local type="$2"
local timeout="$3"
local grep_string="$4"
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local log_files
case "$type" in
stdout)
if [ ! -f "$log_stdout" ]; then
return 1
fi
log_files="$log_stdout"
;;
stderr)
if [ ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stderr"
;;
both)
if [ ! -f "$log_stdout" -a ! -f "$log_stderr" ]; then
return 1
fi
log_files="$log_stdout $log_stderr"
;;
esac
if [ -z "$log_files" ]; then
echo "log_waitfor: Wrong type of log file specified, should be stdout, stderr or both!" >&2
exit 1
fi
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "log_waitfor: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "log_waitfor: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "log_waitfor: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
echo "log_waitfor: waiting for log $name to contain (timeout $timeout): $grep_string"
while true; do
if $GREP -q -- "$grep_string" $log_files 2>/dev/null; then
return 0
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "log_waitfor: Invalid timestamp from date!" >&2
exit 1
fi
sleep 2
done
return 1
}
log_cleanup ()
{
local pid_file
local pid
ls _log_pid* 2>/dev/null | while read pid_file; do
pid=`cat $pid_file 2>/dev/null`
if [ -n "$pid" -a "$pid" -gt 0 ] 2>/dev/null; then
kill -TERM "$pid" 2>/dev/null
rm -f "$pid_file" 2>/dev/null
fi
done
rm -f "_log.$BUILD_TAG"* 2>/dev/null
}
log_remove ()
{
if [ -z "$1" ]; then
echo "usage: log_remove <log name>" >&2
exit 1
fi
local name="$1"
local log_stderr="_log.$BUILD_TAG.$name.stderr"
local log_stdout="_log.$BUILD_TAG.$name.stdout"
rm -f "$log_stderr" "$log_stdout" 2>/dev/null
}
log_save_try ()
{
if [ -z "$1" ]; then
echo "usage: log_save_try <try>" >&2
exit 1
fi
local try="$1"
local log_file
ls "_log.$BUILD_TAG"* 2>/dev/null | while read log_file; do
if ! mv "$log_file" "$log_file-try-$try" 2>/dev/null; then
echo "log_save_try: Unable to save log file $log_file to $log_file-try-$try"
return 1
fi
done
return 0
}
run_tests ()
{
if [ -z "$1" ]; then
echo "usage: run_tests <tests directory>" >&2
exit 1
fi
local test_dir="$1"
local entry
local test=()
local test_num=0
local test_iter=0
local test_path
local test_status
local test_failed=0
local test_start
local test_stop
local test_time
local pwd=`pwd`
local pwd2
local retry
local junit="$WORKSPACE/junit.xml"
local junit_head="$WORKSPACE/junit.xml.head"
local junit_test="$WORKSPACE/junit.xml.test"
local junit_foot="$WORKSPACE/junit.xml.foot"
local tail_pid
local test_name
local test_classname
if [ -n "$PRE_TEST" ]; then
if ! declare -F "$PRE_TEST" >/dev/null 2>/dev/null; then
unset PRE_TEST
fi
fi
if [ -n "$POST_TEST" ]; then
if ! declare -F "$POST_TEST" >/dev/null 2>/dev/null; then
unset POST_TEST
fi
fi
if [ -n "$INTERRUPT_TEST" ]; then
if ! declare -F "$INTERRUPT_TEST" >/dev/null 2>/dev/null; then
unset INTERRUPT_TEST
fi
fi
if [ -n "$RETRY_TEST" ]; then
if [ ! "$RETRY_TEST" -gt 0 ] 2>/dev/null; then
RETRY_TEST=0
fi
else
RETRY_TEST=0
fi
if [ -n "$RETRY_SLEEP" ]; then
if [ ! "$RETRY_SLEEP" -ge 0 ] 2>/dev/null; then
RETRY_SLEEP=10
fi
else
RETRY_SLEEP=10
fi
if ! cd "$test_dir" 2>/dev/null; then
echo "run_tests: unable to change to test directory $test_dir!" >&2
return 1
fi
rm -f "$junit" "$junit_test"
echo '<?xml version="1.0" encoding="UTF-8"?>' > "$junit_head"
echo '<testsuites>' > "$junit_head"
ls -1 2>/dev/null | $GREP '^[0-9]*' | $GREP -v '\.off$' 2>/dev/null >"_tests.$BUILD_TAG"
while read entry; do
if [ -d "$entry" -a -f "$entry/test.sh" ]; then
if [ -f "$entry/off" ]; then
test_name=`echo "$entry"|sed 's%\.% %g'|awk '{print $3}'`
if [ -z "$test_name" ]; then
test_name='unknown'
fi
test_classname=`echo "$entry"|sed 's%\.% %g'|awk '{print $1 "." $2}'`
if [ -z "$test_classname" ]; then
test_classname='unknown.unknown'
fi
echo '<testsuite name="'"$entry"'" tests="1" skip="1">' >> "$junit_test"
echo '<testcase name="'"$test_name"'" classname="'"$test_classname"'">' >> "$junit_test"
echo '<skipped message="Skipped">Test skipped, disabled with off file</skipped>' >> "$junit_test"
echo '</testcase>' >> "$junit_test"
echo '</testsuite>' >> "$junit_test"
else
test[test_num]="$entry"
test_num=$(( test_num + 1 ))
fi
fi
done <"_tests.$BUILD_TAG"
rm -f "_tests.$BUILD_TAG" 2>/dev/null
if [ "$test_num" -le 0 ] 2>/dev/null; then
echo "run_tests: no active tests found!" >&2
cd "$pwd"
# Do not generate JUnit if there is no tests or all tests skipped because
# Jenkins might mark it failed otherwise
rm -f "$junit_head" "$junit_test" "$junit_foot"
return 1
fi
if [ -n "$INTERRUPT_TEST" ]; then
STOP_TEST=0
trap "STOP_TEST=1" SIGINT
fi
echo "Running tests ..."
while [ "$test_iter" -lt "$test_num" ] 2>/dev/null; do
retry=0
test_path="${test[test_iter]}"
test_iter=$(( test_iter + 1 ))
test_start=`date +%s`
test_name=`echo "$test_path"|sed 's%\.% %g'|awk '{print $3}'`
if [ -z "$test_name" ]; then
test_name='unknown'
fi
test_classname=`echo "$test_path"|sed 's%\.% %g'|awk '{print $1 "." $2}'`
if [ -z "$test_classname" ]; then
test_classname='unknown.unknown'
fi
echo "##### `date` $test_iter/$test_num $test_path ... "
pwd2=`pwd`
cd "$test_path" 2>/dev/null &&
rm -f "_test.$BUILD_TAG" &&
touch "_test.$BUILD_TAG" &&
while [ "$retry" -le "$RETRY_TEST" ] 2>/dev/null; do
if [ "$retry" -gt 0 ] 2>/dev/null; then
syslog_stop &&
log_save_try "$retry" &&
syslog_save_try "$retry" ||
{
echo "##### `date` $test_iter/$test_num $test_path ... Unable to retry"
test_status=1
break
}
echo "##### `date` $test_iter/$test_num $test_path ... RETRY $retry in $RETRY_SLEEP seconds"
sleep "$RETRY_SLEEP"
rm -f "_test.$BUILD_TAG"
touch "_test.$BUILD_TAG"
fi
syslog_trace &&
if [ -n "$PRE_TEST" ]; then
$PRE_TEST "$test_path"
fi &&
( source ./test.sh ) >> "_test.$BUILD_TAG" 2>&1
test_status="$?"
if [ -n "$INTERRUPT_TEST" -a "$STOP_TEST" = "1" ]; then
cat "_test.$BUILD_TAG"
echo "##### `date` $test_iter/$test_num $test_path ... INTERRUPTED"
break
fi
if [ "$test_status" -eq 0 ] 2>/dev/null; then
break
fi
retry=$(( retry + 1 ))
done
test_stop=`date +%s`
test_time=0
if [ "$test_start" -gt 0 -a "$test_stop" -gt 0 ] 2>/dev/null; then
test_time=$(( test_stop - test_start ))
fi
syslog_stop
if [ -n "$INTERRUPT_TEST" -a "$STOP_TEST" = "1" ]; then
$INTERRUPT_TEST "$test_path"
test_failed=1
break
elif [ -n "$POST_TEST" ]; then
$POST_TEST "$test_path" "$test_status"
fi
if [ "$test_status" -eq 0 ] 2>/dev/null; then
cat "_test.$BUILD_TAG"
echo "##### `date` $test_iter/$test_num $test_path ... OK"
log_cleanup
syslog_cleanup
echo '<testsuite name="'"$test_path"'" tests="1" time="'"$test_time"'">' >> "$junit_test"
echo '<testcase name="'"$test_name"'" classname="'"$test_classname"'" time="'"$test_time"'">' >> "$junit_test"
echo '</testcase>' >> "$junit_test"
echo '<system-out>' >> "$junit_test"
cat "_test.$BUILD_TAG" | sed 's%&%\&amp;%g' | sed 's%<%\&lt;%g' | sed 's%>%\&gt;%g' >> "$junit_test" 2>/dev/null
echo '</system-out>' >> "$junit_test"
echo '</testsuite>' >> "$junit_test"
else
test_failed=$(( test_failed + 1 ))
cat "_test.$BUILD_TAG"
echo "##### `date` $test_iter/$test_num $test_path ... FAILED!"
echo '<testsuite name="'"$test_path"'" tests="1" time="'"$test_time"'">' >> "$junit_test"
echo '<testcase name="'"$test_name"'" classname="'"$test_classname"'" time="'"$test_time"'">' >> "$junit_test"
echo '<failure message="Failed">Test failed, exit code '"$test_status"'</failure>' >> "$junit_test"
echo '</testcase>' >> "$junit_test"
echo '<system-err>' >> "$junit_test"
cat "_test.$BUILD_TAG" | sed 's%&%\&amp;%g' | sed 's%<%\&lt;%g' | sed 's%>%\&gt;%g' >> "$junit_test" 2>/dev/null
echo '</system-err>' >> "$junit_test"
echo '</testsuite>' >> "$junit_test"
fi
rm -f "_test.$BUILD_TAG"
if ! cd "$pwd2" 2>/dev/null; then
echo "run_tests: unable to change back to test directory $pwd2 after running a test!" >&2
test_failed=1
break
fi
done
if [ -n "$INTERRUPT_TEST" ]; then
trap "" SIGINT
fi
echo '</testsuites>' > "$junit_foot"
cat "$junit_head" "$junit_test" "$junit_foot" > "$junit" 2>/dev/null
rm -f "$junit_head" "$junit_test" "$junit_foot"
if ! cd "$pwd" 2>/dev/null; then
echo "run_tests: unable to change back to directory $pwd after running tests!" >&2
return 1
fi
if [ "$test_failed" -gt 0 ] 2>/dev/null; then
return 1
fi
}
run_test ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: run_test <test name> <test directory>" >&2
exit 1
fi
local test_name="$1"
local test_dir="$2"
local test_status
local pwd=`pwd`
if [ -n "$PRE_TEST" ]; then
if ! declare -F "$PRE_TEST" >/dev/null 2>/dev/null; then
unset PRE_TEST
fi
fi
if [ -n "$POST_TEST" ]; then
if ! declare -F "$POST_TEST" >/dev/null 2>/dev/null; then
unset POST_TEST
fi
fi
if [ -n "$INTERRUPT_TEST" ]; then
if ! declare -F "$INTERRUPT_TEST" >/dev/null 2>/dev/null; then
unset INTERRUPT_TEST
fi
fi
if [ ! -f "$test_dir/test.sh" ]; then
echo "run_test: no test.sh in test $test_name ($test_dir)!" >&2
return 1
fi
if ! cd "$test_dir" 2>/dev/null; then
echo "run_test: unable to change to test $test_name directory $test_dir!" >&2
return 1
fi
if [ -n "$INTERRUPT_TEST" ]; then
STOP_TEST=0
trap "STOP_TEST=1" SIGINT
fi
echo "##### Running test $test_name ..."
if [ -n "$PRE_TEST" ]; then
$PRE_TEST "$test_name"
fi &&
syslog_trace &&
( source ./test.sh )
test_status="$?"
syslog_stop
if [ -n "$INTERRUPT_TEST" -a "$STOP_TEST" = "1" ]; then
echo "##### `date` $test_iter/$test_num $test_path ... INTERRUPTED"
$INTERRUPT_TEST "$test_path"
trap "" SIGINT
return 1
elif [ -n "$POST_TEST" ]; then
$POST_TEST "$test_name" "$test_status"
fi
if [ "$test_status" -eq 0 ] 2>/dev/null; then
echo "##### Test $test_name ... OK"
log_cleanup
syslog_cleanup
else
echo "##### Test $test_name ... FAILED!"
fi
if ! cd "$pwd" 2>/dev/null; then
echo "run_test: unable to change back to directory $pwd after running test $test_name!" >&2
return 1
fi
if [ "$test_status" -ne 0 ] 2>/dev/null; then
return 1
fi
}
syslog_trace ()
{
if [ -n "$_SYSLOG_TRACE_PID" ]; then
echo "syslog_trace: Syslog trace already running (pid $_SYSLOG_TRACE_PID)!" >&2
exit 1
fi
local syslog_file
case "$DISTRIBUTION" in
debian | \
ubuntu )
syslog_file="/var/log/syslog"
;;
redhat | \
centos | \
sl | \
slackware | \
opensuse | \
suse | \
freebsd | \
netbsd | \
openbsd )
syslog_file="/var/log/messages"
;;
sunos )
syslog_file="/var/adm/messages"
;;
esac
if [ -z "$syslog_file" ]; then
echo "syslog_trace: Unable to start trace of syslog: no syslog file set" >&2
exit 1
fi
if [ ! -r "$syslog_file" ]; then
echo "syslog_trace: Unable to start trace of syslog: no access to $syslog_file" >&2
exit 1
fi
$TAIL_FOLLOW "$syslog_file" >"_syslog.$BUILD_TAG" 2>/dev/null &
_SYSLOG_TRACE_PID="$!"
if [ -z "$_SYSLOG_TRACE_PID" -o ! "$_SYSLOG_TRACE_PID" -gt 0 ] 2>/dev/null; then
echo "syslog_trace: Unable to start trace of syslog!" >&2
exit 1
fi
if ! kill -0 "$_SYSLOG_TRACE_PID" 2>/dev/null >/dev/null; then
wait "$_SYSLOG_TRACE_PID"
echo "syslog_trace: Unable to start trace of syslog: exited with status $?"
exit 1
fi
echo "syslog_trace: trace started (pid $_SYSLOG_TRACE_PID)"
}
syslog_stop ()
{
if [ -z "$_SYSLOG_TRACE_PID" ]; then
echo "syslog_stop: Syslog trace not started!" >&2
exit 1
fi
if kill -TERM "$_SYSLOG_TRACE_PID" 2>/dev/null; then
wait "$_SYSLOG_TRACE_PID" 2>/dev/null
unset _SYSLOG_TRACE_PID
fi
if [ -n "$_SYSLOG_TRACE_PID" ]; then
echo "syslog_stop: Unable to stop trace of syslog!" >&2
exit 1
fi
echo "syslog_stop: trace stopped"
}
syslog_waitfor ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: syslog_waitfor <timeout in seconds> <grep string ...>" >&2
exit 1
fi
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local timeout="$1"
local grep_string="$2"
if [ ! -f "_syslog.$BUILD_TAG" ]; then
echo "syslog_waitfor: No syslog file to grep from!" >&2
exit 1
fi
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "syslog_waitfor: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "syslog_waitfor: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "syslog_waitfor: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
echo "syslog_waitfor: waiting for syslog to contain (timeout $timeout): $grep_string"
while true; do
if $GREP -q -- "$grep_string" "_syslog.$BUILD_TAG" 2>/dev/null; then
return 0
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ -z "$_SYSLOG_TRACE_PID" -o "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "syslog_waitfor: Invalid timestamp from date!" >&2
exit 1
fi
sleep 2
done
return 1
}
syslog_waitfor_count ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: syslog_waitfor_count <timeout in seconds> <count> <grep string ...>" >&2
exit 1
fi
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local timeout="$1"
local count="$2"
local grep_string="$3"
local count_found
if [ ! -f "_syslog.$BUILD_TAG" ]; then
echo "syslog_waitfor_count: No syslog file to grep from!" >&2
exit 1
fi
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "syslog_waitfor_count: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "syslog_waitfor_count: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "syslog_waitfor_count: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
echo "syslog_waitfor_count: waiting for syslog to contain $count counts of (timeout $timeout): $grep_string"
while true; do
count_found=`$GREP -- "$grep_string" "_syslog.$BUILD_TAG" 2>/dev/null | wc -l 2>/dev/null`
if [ "$count_found" -eq "$count" ] 2>/dev/null; then
return 0
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ -z "$_SYSLOG_TRACE_PID" -o "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "syslog_waitfor_count: Invalid timestamp from date!" >&2
exit 1
fi
sleep 2
done
return 1
}
syslog_grep ()
{
if [ -z "$1" ]; then
echo "usage: syslog_grep <grep string ...>" >&2
exit 1
fi
local grep_string="$1"
if [ ! -f "_syslog.$BUILD_TAG" ]; then
echo "syslog_grep: No syslog file to grep from!" >&2
exit 1
fi
echo "syslog_grep: greping syslog for: $grep_string"
$GREP -q -- "$grep_string" "_syslog.$BUILD_TAG" 2>/dev/null
}
syslog_grep_count ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: syslog_grep_count <count> <grep string ...>" >&2
exit 1
fi
local count="$1"
local grep_string="$2"
local count_found
# create a non-local variable so the caller can get the actually value if they want
syslog_grep_count_variable=0
if [ ! -f "_syslog.$BUILD_TAG" ]; then
echo "syslog_grep_count: No syslog file to grep from!" >&2
exit 1
fi
echo "syslog_grep_count: greping syslog, should find $count of: $grep_string"
count_found=`$GREP -- "$grep_string" "_syslog.$BUILD_TAG" 2>/dev/null | wc -l 2>/dev/null`
syslog_grep_count_variable=$count_found
if [ "$count_found" -eq "$count" ] 2>/dev/null; then
return 0
fi
return 1
}
syslog_cleanup ()
{
rm -f "_syslog.$BUILD_TAG"* 2>/dev/null
}
syslog_save_try ()
{
if [ -z "$1" ]; then
echo "usage: syslog_save_try <try>" >&2
exit 1
fi
local try="$1"
if ! mv "_syslog.$BUILD_TAG" "_syslog.$BUILD_TAG-try-$try" 2>/dev/null; then
echo "syslog_save_try: Unable to save syslog file _syslog.$BUILD_TAG to _syslog.$BUILD_TAG-try-$try"
return 1
fi
return 0
}
apply_parameter ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: apply_parameter <parameter tag> <parameter value> <files ... >" >&2
echo " ex: apply_parameter \"INSTALL_ROOT\" \"\$INSTALL_ROOT\" conf.xml" >&2
exit 1
fi
local parameter_tag="$1"
local parameter_value="$2"
shift 2
local files="$*"
local file
if echo "$parameter_tag" | grep -q "@" 2>/dev/null; then
echo "apply_parameter: parameter tag contains '@', it must not" >&2
return 1
fi
for file in $files; do
if [ ! -f "$file" ]; then
echo "apply_parameter: File $file not found" >&2
return 1
fi
if [ -f "$file.$$" ]; then
echo "apply_parameter: Temporary file $file.$$ exists but it should not" >&2
return 1
fi
done
for file in $files; do
sed 's%@'"$parameter_tag"'@%'"$parameter_value"'%g' "$file" > "$file.$$" 2>/dev/null &&
mv "$file.$$" "$file" 2>/dev/null ||
{
echo "apply_parameter: Unable to apply parameter $parameter_tag value $parameter_value to file $file" >&2
return 1
}
done
return 0
}
sed_inplace ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: sed_inplace <expression> <files ... >" >&2
exit 1
fi
local expression="$1"
shift 1
local files="$*"
local file
for file in $files; do
if [ ! -f "$file" ]; then
echo "sed_inplace: File $file not found" >&2
return 1
fi
if [ -f "$file.$$" ]; then
echo "sed_inplace: Temporary file $file.$$ exists but it should not" >&2
return 1
fi
done
for file in $files; do
sed "$expression" "$file" > "$file.$$" 2>/dev/null &&
mv "$file.$$" "$file" 2>/dev/null ||
{
echo "sed_inplace: Unable to sed inplace file $file" >&2
return 1
}
done
return 0
}
try_run ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: try_run <timeout in seconds> <command ... >" >&2
exit 1
fi
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local timeout="$1"
local pid
shift
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "try_run: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "try_run: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "try_run: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
( $* ) &
pid="$!"
if [ -z "$pid" -o "$pid" -le 0 ] 2>/dev/null; then
echo "try_run: No pid from backgrounded program?" >&2
return 1
fi
while true; do
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "try_run: Invalid timestamp from date!" >&2
exit 1
fi
if ! kill -0 "$pid" 2>/dev/null; then
wait "$pid"
return "$?"
fi
sleep 1
done
kill -TERM "$pid"
sleep 1
if kill -0 "$pid" 2>/dev/null; then
kill -KILL "$pid"
fi
return 1
}
waitfor_this ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: waitfor_this <file to grep> <timeout in seconds> <grep string ...>" >&2
exit 1
fi
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local file="$1"
local timeout="$2"
local grep_string="$3"
if [ ! -f "$file" ]; then
echo "waitfor_this: No file to grep from!" >&2
exit 1
fi
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "waitfor_this: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "waitfor_this: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "waitfor_this: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
echo "waitfor_this: waiting for $file to contain (timeout $timeout): $grep_string"
while true; do
if $GREP -q -- "$grep_string" "$file" 2>/dev/null; then
return 0
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "waitfor_this: Invalid timestamp from date!" >&2
exit 1
fi
sleep 2
done
return 1
}
waitfor_count_this ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ]; then
echo "usage: waitfor_count_this <file to grep> <timeout in seconds> <count> <grep string ...>" >&2
exit 1
fi
local time_start=`$DATE '+%s' 2>/dev/null`
local time_stop
local time_now
local file="$1"
local timeout="$2"
local count="$3"
local grep_string="$4"
local count_found
if [ ! -f "$file" ]; then
echo "waitfor_count_this: No file to grep from!" >&2
exit 1
fi
if [ ! "$time_start" -gt 0 ] 2>/dev/null; then
echo "waitfor_count_this: Unable to get start time!" >&2
exit 1
fi
if [ ! "$timeout" -gt 0 ] 2>/dev/null; then
echo "waitfor_count_this: Wrong timeout value or 0!" >&2
exit 1
fi
if [ "$timeout" -gt 3600 ] 2>/dev/null; then
echo "waitfor_count_this: Too long timeout used, can't be over 3600 seconds!" >&2
exit 1
fi
time_stop=$(( time_start + timeout ))
echo "waitfor_count_this: waiting for $file to contain $count counts of (timeout $timeout): $grep_string"
while true; do
count_found=`$GREP -- "$grep_string" "$file" 2>/dev/null | wc -l 2>/dev/null`
if [ "$count_found" -eq "$count" ] 2>/dev/null; then
return 0
fi
time_now=`$DATE '+%s' 2>/dev/null`
if [ "$time_now" -ge "$time_stop" ] 2>/dev/null; then
break
fi
if [ -z "$time_now" -o ! "$time_now" -lt "$time_stop" ] 2>/dev/null; then
echo "waitfor_count_this: Invalid timestamp from date!" >&2
exit 1
fi
sleep 2
done
return 1
}
grep_this ()
{
if [ -z "$1" -o -z "$2" ]; then
echo "usage: grep_this <file to grep> <grep string ...>" >&2
exit 1
fi
local file="$1"
local grep_string="$2"
if [ ! -f "$file" ]; then
echo "grep_this: No file to grep from!" >&2
exit 1
fi
echo "grep_this: greping in $file for: $grep_string"
$GREP -q -- "$grep_string" "$file" 2>/dev/null
}
grep_count_this ()
{
if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
echo "usage: grep_count_this <file to grep> <count> <grep string ...>" >&2
exit 1
fi
local file="$1"
local count="$2"
local grep_string="$3"
local count_found
if [ ! -f "$file" ]; then
echo "grep_count_this: No file to grep from!" >&2
exit 1
fi
echo "grep_count_this: greping in $file, should find $count of: $grep_string"
count_found=`$GREP -- "$grep_string" "$file" 2>/dev/null | wc -l 2>/dev/null`
if [ "$count_found" -eq "$count" ] 2>/dev/null; then
return 0
fi
return 1
}