Initial commit for downstream tests using standard test interface
This commit is contained in:
parent
0c12737f71
commit
60f7afa183
71
tests/fully-qualified-hostnames/Makefile
Normal file
71
tests/fully-qualified-hostnames/Makefile
Normal file
@ -0,0 +1,71 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /CoreOS/sudo/Sanity/fully-qualified-hostnames
|
||||
# Description: checks if sudo works correctly when FQDN is used in /etc/sudoers
|
||||
# Author: Milos Malik <mmalik@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2011 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/CoreOS/sudo/Sanity/fully-qualified-hostnames
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE ssh-sudo.exp
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
chmod a+x runtest.sh
|
||||
chmod a+x ssh-sudo.exp
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Milos Malik <mmalik@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: checks if sudo works correctly when FQDN is used in /etc/sudoers" >> $(METADATA)
|
||||
@echo "Type: Sanity" >> $(METADATA)
|
||||
@echo "TestTime: 10m" >> $(METADATA)
|
||||
@echo "RunFor: sudo" >> $(METADATA)
|
||||
@echo "Requires: sudo" >> $(METADATA)
|
||||
@echo "Requires: sed" >> $(METADATA)
|
||||
@echo "Requires: grep" >> $(METADATA)
|
||||
@echo "Requires: mktemp" >> $(METADATA)
|
||||
@echo "Requires: openssh-server" >> $(METADATA)
|
||||
@echo "Requires: openssh-clients" >> $(METADATA)
|
||||
@echo "Requires: expect" >> $(METADATA)
|
||||
@echo "Requires: shadow-utils" >> $(METADATA)
|
||||
@echo "Priority: Normal" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
@echo "Confidential: no" >> $(METADATA)
|
||||
@echo "Destructive: no" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
||||
|
3
tests/fully-qualified-hostnames/PURPOSE
Normal file
3
tests/fully-qualified-hostnames/PURPOSE
Normal file
@ -0,0 +1,3 @@
|
||||
PURPOSE of /CoreOS/sudo/Sanity/fully-qualified-hostnames
|
||||
Description: checks if sudo works correctly when FQDN is used in /etc/sudoers
|
||||
Author: Milos Malik <mmalik@redhat.com>
|
106
tests/fully-qualified-hostnames/runtest.sh
Executable file
106
tests/fully-qualified-hostnames/runtest.sh
Executable file
@ -0,0 +1,106 @@
|
||||
#!/bin/bash
|
||||
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# runtest.sh of /CoreOS/sudo/Sanity/fully-qualified-hostnames
|
||||
# Description: checks if sudo works correctly when FQDN is used in /etc/sudoers
|
||||
# Author: Milos Malik <mmalik@redhat.com>
|
||||
# Edit: Ales "alich" Marecek <amarecek@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2011 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
# Include rhts environment
|
||||
. /usr/bin/rhts-environment.sh
|
||||
. /usr/share/beakerlib/beakerlib.sh
|
||||
|
||||
PACKAGE="sudo"
|
||||
USER_NAME="user${RANDOM}"
|
||||
USER_SECRET="s3kr3T${RANDOM}"
|
||||
CONFIG_FILE="/etc/sudoers"
|
||||
OUTPUT_FILE="sudo.log"
|
||||
|
||||
rlJournalStart
|
||||
rlPhaseStartSetup
|
||||
rlAssertRpm ${PACKAGE}
|
||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
||||
rlRun "cp ssh-sudo.exp ${TmpDir}" 0 "Copying expect file"
|
||||
rlRun "pushd $TmpDir"
|
||||
OUTPUT_FILE="${TmpDir}/${OUTPUT_FILE}"
|
||||
rlFileBackup ${CONFIG_FILE} ~/.ssh
|
||||
id ${USER_NAME} && userdel -r ${USER_NAME}
|
||||
rlRun "useradd ${USER_NAME}"
|
||||
rlRun "echo ${USER_SECRET} | passwd --stdin ${USER_NAME}"
|
||||
rlRun "sed -i 's/^.*requiretty.*$//' ${CONFIG_FILE}"
|
||||
rlRun "sed -i 's/^.*lecture.*$//' ${CONFIG_FILE}"
|
||||
rlRun "echo \"Defaults !requiretty, !lecture\" >> ${CONFIG_FILE}"
|
||||
rlRun "echo \"${USER_NAME} ${HOSTNAME} = (root) `which id`\" >> ${CONFIG_FILE}"
|
||||
rlRun "> ~/.ssh/known_hosts"
|
||||
rlPhaseEnd
|
||||
|
||||
if rlIsRHEL 5; then
|
||||
rlPhaseStartTest
|
||||
rlRun "strings `which sudo` | grep fqdn"
|
||||
rlPhaseEnd
|
||||
fi
|
||||
|
||||
if echo ${HOSTNAME} | grep -q '^localhost'; then
|
||||
rlPhaseStartTest
|
||||
rlLogInfo "skipping fqdn option enabled tests, cannot run with local-only host name ${HOSTNAME}"
|
||||
rlPhaseEnd
|
||||
else
|
||||
rlPhaseStartTest "fqdn option is enabled, command is valid"
|
||||
rlRun "sed -i 's/^.*fqdn.*$//' ${CONFIG_FILE}"
|
||||
rlRun "echo \"Defaults fqdn\" >> ${CONFIG_FILE}"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost id 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertGrep "uid=0.*gid=0.*groups=0" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartTest "fqdn option is enabled, command is invalid"
|
||||
rlRun "sed -i 's/^.*fqdn.*$//' ${CONFIG_FILE}"
|
||||
rlRun "echo \"Defaults fqdn\" >> ${CONFIG_FILE}"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost w 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertGrep "user.*is not allowed to execute" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
fi
|
||||
|
||||
rlPhaseStartTest "fqdn option is disabled, command is valid"
|
||||
rlRun "sed -i 's/^.*fqdn.*$//' ${CONFIG_FILE}"
|
||||
rlRun "echo \"Defaults !fqdn\" >> ${CONFIG_FILE}"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost id 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertGrep "uid=0.*gid=0.*groups=0" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartTest "fqdn option is disabled, command is invalid"
|
||||
rlRun "sed -i 's/^.*fqdn.*$//' ${CONFIG_FILE}"
|
||||
rlRun "echo \"Defaults !fqdn\" >> ${CONFIG_FILE}"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost w 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertGrep "user.*is not allowed to execute" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
rlRun "userdel -rf ${USER_NAME}"
|
||||
rlFileRestore
|
||||
rlRun "popd"
|
||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
||||
rlPhaseEnd
|
||||
rlJournalPrintText
|
||||
rlJournalEnd
|
||||
|
20
tests/fully-qualified-hostnames/ssh-sudo.exp
Executable file
20
tests/fully-qualified-hostnames/ssh-sudo.exp
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/expect -f
|
||||
# usage:
|
||||
# ./ssh-sudo.exp username password hostname command
|
||||
set username [lrange $argv 0 0]
|
||||
set password [lrange $argv 1 1]
|
||||
set hostname [lrange $argv 2 2]
|
||||
set command [lrange $argv 3 3]
|
||||
set timeout 5
|
||||
spawn ssh -t $username@$hostname sudo $command
|
||||
expect "*yes/no*" {
|
||||
send -- "yes\r"
|
||||
}
|
||||
expect "*assword*" {
|
||||
send -- "$password\r"
|
||||
}
|
||||
expect "*assword*" {
|
||||
send -- "$password\r"
|
||||
}
|
||||
expect eof
|
||||
|
68
tests/run-as/Makefile
Normal file
68
tests/run-as/Makefile
Normal file
@ -0,0 +1,68 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /CoreOS/sudo/Sanity/run-as
|
||||
# Description: Test feature 'run as'. This means -u, -g options.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2017 Red Hat, Inc.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/CoreOS/sudo/Sanity/run-as
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Test feature 'run as'. This means -u, -g options." >> $(METADATA)
|
||||
@echo "Type: Sanity" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RunFor: sudo" >> $(METADATA)
|
||||
@echo "Requires: sudo" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/tcf)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Cleanup)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/testUser)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
@echo "Priority: Normal" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
@echo "Confidential: no" >> $(METADATA)
|
||||
@echo "Destructive: no" >> $(METADATA)
|
||||
@echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
3
tests/run-as/PURPOSE
Normal file
3
tests/run-as/PURPOSE
Normal file
@ -0,0 +1,3 @@
|
||||
PURPOSE of /CoreOS/sudo/Sanity/run-as
|
||||
Description: Test feature 'run as'. This means -u, -g options.
|
||||
Author: Dalibor Pospisil <dapospis@redhat.com>
|
59
tests/run-as/distribution/Library/Cleanup/Makefile
Normal file
59
tests/run-as/distribution/Library/Cleanup/Makefile
Normal file
@ -0,0 +1,59 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/Cleanup
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/Cleanup
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides function to define cleanup stack which can do its work at any time of the test run." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/Cleanup)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
314
tests/run-as/distribution/Library/Cleanup/lib.sh
Normal file
314
tests/run-as/distribution/Library/Cleanup/lib.sh
Normal file
@ -0,0 +1,314 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = Cleanup
|
||||
# library-version = 9
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_Cleanup_LIB_VERSION=9
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Cleanup
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This file contains functions which provides cleanup stack functionality.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/Cleanup and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/Cleanup)" >> $(METADATA)
|
||||
|
||||
B<Code example>
|
||||
|
||||
rlJournalStart
|
||||
rlPhaseStartSetup
|
||||
rlImport 'distribution/Cleanup'
|
||||
tmp=$(mktemp)
|
||||
CleanupRegister "
|
||||
rlLog 'Removing data'
|
||||
rlRun \"rm -f ${tmp}\"
|
||||
"
|
||||
rlLog 'Creating some data'
|
||||
rlRun "echo 'asdfalkjh' > $tmp"
|
||||
|
||||
CleanupRegister "
|
||||
rlLog 'just something to demonstrate unregistering'
|
||||
"
|
||||
ID1=$CleanupRegisterID
|
||||
CleanupUnregister $ID1
|
||||
|
||||
CleanupRegister "
|
||||
rlLog 'just something to demonstrate partial cleanup'
|
||||
"
|
||||
ID2=$CleanupRegisterID
|
||||
CleanupRegister "rlLog 'cleanup some more things'"
|
||||
# cleanup everything upto ID2
|
||||
CleanupDo $ID2
|
||||
|
||||
CleanupRegister --mark "
|
||||
rlLog 'yet another something to demonstrate partial cleanup using internal ID saving'
|
||||
"
|
||||
CleanupRegister "rlLog 'cleanup some more things'"
|
||||
# cleanup everything upto last mark
|
||||
CleanupDo --mark
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
CleanupDo
|
||||
rlPhaseEnd
|
||||
|
||||
rlJournalPrintText
|
||||
rlJournalEnd
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library Cleanup v$__INTERNAL_Cleanup_LIB_VERSION... "
|
||||
|
||||
__INTERNAL_Cleanup_stack_file="$BEAKERLIB_DIR/Cleanup_stack"
|
||||
touch "$__INTERNAL_Cleanup_stack_file"
|
||||
chmod ug+rw "$__INTERNAL_Cleanup_stack_file"
|
||||
|
||||
# CleanupRegister ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# CleanupRegister [--mark] CLEANUP_CODE
|
||||
# --mark - also mark this position
|
||||
CleanupRegister() {
|
||||
local mark=0
|
||||
[[ "$1" == "--mark" ]] && {
|
||||
mark=1
|
||||
shift
|
||||
}
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
CleanupRegisterID="${RANDOM}$(date +"%s%N")"
|
||||
echo -n "Registering cleanup ID=$CleanupRegisterID" >&2
|
||||
if [[ $mark -eq 1 ]]; then
|
||||
__INTERNAL_CleanupMark=( "$CleanupRegisterID" "${__INTERNAL_CleanupMark[@]}" )
|
||||
echo -n " with mark" >&2
|
||||
fi
|
||||
echo " '$1'" >&2
|
||||
rlLogDebug "prepending '$1'"
|
||||
local ID_tag="# ID='$CleanupRegisterID'"
|
||||
__INTERNAL_Cleanup_stack="$ID_tag
|
||||
$1
|
||||
$ID_tag
|
||||
$__INTERNAL_Cleanup_stack"
|
||||
if ! CleanupSetStack "$__INTERNAL_Cleanup_stack"; then
|
||||
rlLogError "an error occured while registering the cleanup '$1'"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}; # end of CleanupRegister }}}
|
||||
|
||||
|
||||
# __INTERNAL_Cleanup_get_stack_part ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# 1: ID
|
||||
# -ID - everything upto the ID
|
||||
# 2: '' - return ID only
|
||||
# 'rest' - return exact oposit
|
||||
__INTERNAL_Cleanup_get_stack_part() {
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): $* begin"
|
||||
local ID="$1"
|
||||
local n='1 0 1'
|
||||
local stack=''
|
||||
[[ "${ID:0:1}" == "-" ]] && {
|
||||
ID="${ID:1}"
|
||||
n='0 0 1'
|
||||
}
|
||||
[[ "$2" == "rest" ]] && {
|
||||
n="$(echo "${n//0/2}")"
|
||||
n="$(echo "${n//1/0}")"
|
||||
n="$(echo "${n//2/1}")"
|
||||
}
|
||||
n=($n)
|
||||
[[ -n "$DEBUG" ]] && rlLogDebug "$(set | grep ^n=)"
|
||||
local ID_tag="# ID='$ID'"
|
||||
while IFS= read -r line; do
|
||||
|
||||
[[ "$line" == "$ID_tag" ]] && {
|
||||
n=( "${n[@]:1}" )
|
||||
continue
|
||||
}
|
||||
if [[ $n -eq 0 ]]; then
|
||||
stack="$stack
|
||||
$line"
|
||||
fi
|
||||
done < <(echo "$__INTERNAL_Cleanup_stack")
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): cleanup stack part is '${stack:1}'"
|
||||
echo "${stack:1}"
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): $* end"
|
||||
}; # end of __INTERNAL_Cleanup_get_stack_part }}}
|
||||
|
||||
# CleanupUnregister ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupUnregister() {
|
||||
local ID="$1"
|
||||
rlLog "Unregistering cleanup ID='$ID'"
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
rlLogDebug "removing ID='$ID'"
|
||||
if ! CleanupSetStack "$(__INTERNAL_Cleanup_get_stack_part "$ID" 'rest')"; then
|
||||
rlLogError "an error occured while registering the cleanup '$1'"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}; # end of CleanupUnregister }}}
|
||||
|
||||
|
||||
# CleanupMark ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_CleanupMark=()
|
||||
CleanupMark() {
|
||||
echo -n "Setting cleanup mark" >&2
|
||||
CleanupRegister --mark '' 2>/dev/null
|
||||
local res=$?
|
||||
echo " ID='$CleanupRegisterID'" >&2
|
||||
return $res
|
||||
}; # end of CleanupMark }}}
|
||||
|
||||
|
||||
# CleanupDo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# 1: '' - cleanup all
|
||||
# ID - cleanup ID only
|
||||
# -ID - cleanup all upto ID, including
|
||||
# mark - cleanup all unto last mark, including
|
||||
CleanupDo() {
|
||||
local ID="$1"
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
local res tmp newstack=''
|
||||
tmp="$(mktemp)"
|
||||
if [[ "$ID" == "mark" || "$ID" == "--mark" ]]; then
|
||||
echo "execute cleanup upto mark='$__INTERNAL_CleanupMark'" >&2
|
||||
__INTERNAL_Cleanup_get_stack_part "-$__INTERNAL_CleanupMark" | grep -v "^# ID='" > "$tmp"
|
||||
newstack="$(__INTERNAL_Cleanup_get_stack_part "-$__INTERNAL_CleanupMark" 'rest')"
|
||||
__INTERNAL_CleanupMark=("${__INTERNAL_CleanupMark[@]:1}")
|
||||
elif [[ -n "$ID" ]]; then
|
||||
echo "execute cleanup for ID='$ID'" >&2
|
||||
__INTERNAL_Cleanup_get_stack_part "$ID" | grep -v "^# ID='" > "$tmp"
|
||||
newstack="$(__INTERNAL_Cleanup_get_stack_part "$ID" 'rest')"
|
||||
else
|
||||
CleanupTrapUnhook
|
||||
trap "echo 'temporarily blocking ctrl+c until cleanup is done' >&2" SIGINT
|
||||
cat "$__INTERNAL_Cleanup_stack_file" | grep -v "^# ID='" > "$tmp"
|
||||
echo "execute whole cleanup stack" >&2
|
||||
fi
|
||||
. "$tmp"
|
||||
res=$?
|
||||
[[ $res -ne 0 ]] && {
|
||||
echo "cleanup code:" >&2
|
||||
cat -n "$tmp" >&2
|
||||
}
|
||||
rm -f "$tmp"
|
||||
echo "cleanup execution done" >&2
|
||||
if [[ -z "$ID" ]]; then
|
||||
trap - SIGINT
|
||||
fi
|
||||
if ! CleanupSetStack "$newstack"; then
|
||||
rlLogError "an error occured while cleaning the stack"
|
||||
return 1
|
||||
fi
|
||||
return $res
|
||||
}; # end of CleanupDo }}}
|
||||
|
||||
|
||||
# CleanupGetStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupGetStack() {
|
||||
rlLogDebug "getting cleanup stack"
|
||||
if [[ -r "$__INTERNAL_Cleanup_stack_file" ]]; then
|
||||
if __INTERNAL_Cleanup_stack="$(cat "$__INTERNAL_Cleanup_stack_file")"; then
|
||||
rlLogDebug "cleanup stack is '$__INTERNAL_Cleanup_stack'"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
rlLogError "could not load cleanup stack"
|
||||
return 1
|
||||
}; # end of CleanupGetStack }}}
|
||||
|
||||
|
||||
# CleanupSetStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupSetStack() {
|
||||
rlLogDebug "setting cleanup stack to '$1'"
|
||||
__INTERNAL_Cleanup_stack="$1"
|
||||
if echo "$__INTERNAL_Cleanup_stack" > "$__INTERNAL_Cleanup_stack_file"; then
|
||||
rlLogDebug "cleanup stack is now '$__INTERNAL_Cleanup_stack'"
|
||||
return 0
|
||||
fi
|
||||
rlLogError "could not set cleanup stack"
|
||||
return 1
|
||||
}; # end of CleanupSetStack }}}
|
||||
|
||||
|
||||
__INTERNAL_Cleanup_signals=''
|
||||
__INTERNAL_Cleanup_trap_code='rlJournalStart; rlPhaseStartCleanup; CleanupDo; rlPhaseEnd; rlJournalPrintText; rlJournalEnd; exit'
|
||||
# CleanupTrapHook ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupTrapHook() {
|
||||
rlLog "register cleanup trap"
|
||||
__INTERNAL_Cleanup_signals="${1:-"SIGHUP SIGINT SIGTERM EXIT"}"
|
||||
eval "trap \"${__INTERNAL_Cleanup_trap_code}\" $__INTERNAL_Cleanup_signals"
|
||||
}; # end of CleanupTrapHook }}}
|
||||
|
||||
|
||||
# CleanupTrapUnhook ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupTrapUnhook() {
|
||||
if [[ -n "$__INTERNAL_Cleanup_signals" ]]; then
|
||||
rlLog "unregister cleanup trap"
|
||||
eval trap - $__INTERNAL_Cleanup_signals
|
||||
__INTERNAL_Cleanup_signals=''
|
||||
fi
|
||||
}; # end of CleanupTrapUnhook }}}
|
||||
|
||||
|
||||
# CleanupLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupLibraryLoaded() {
|
||||
CleanupTrapHook
|
||||
}; # end of CleanupLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
59
tests/run-as/distribution/Library/ConditionalPhases/Makefile
Normal file
59
tests/run-as/distribution/Library/ConditionalPhases/Makefile
Normal file
@ -0,0 +1,59 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/ConditionalPhases
|
||||
# Description: Implements conditional phases.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/ConditionalPhases
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Implements conditional phases." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
166
tests/run-as/distribution/Library/ConditionalPhases/lib.sh
Normal file
166
tests/run-as/distribution/Library/ConditionalPhases/lib.sh
Normal file
@ -0,0 +1,166 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = ConditionalPhases
|
||||
# library-version = 2
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_ConditionalPhases_LIB_VERSION=2
|
||||
__INTERNAL_ConditionalPhases_LIB_NAME='distribution/ConditionalPhases'
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library distribution/condpahses
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Implements conditional phases to eficiently select test phases to be execute
|
||||
using white and black lists.
|
||||
|
||||
To use this functionality you need to import library
|
||||
distribution/ConditionalPhases and add following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
=head2 Conditional phases
|
||||
|
||||
Each test phase can be conditionally skipped based on a bash regular expression
|
||||
given in CONDITIONAL_PHASES_BL and/or CONDITIONAL_PHASES_WL variables.
|
||||
|
||||
=over
|
||||
|
||||
=item CONDITIONAL_PHASES_BL
|
||||
|
||||
It is a black list. If match phase name the respective phase should be skipped.
|
||||
|
||||
=item CONDITIONAL_PHASES_WL
|
||||
|
||||
It is a white list. If does B<not> match phase name the respective phase should
|
||||
be skipped excluding phases contatning 'setup' or 'cleanup' in its name. Names
|
||||
'setup' and 'cleanup' are matched case insenitively.
|
||||
|
||||
=back
|
||||
|
||||
Actual skipping has to be done in the test case itself by using return code of
|
||||
functions I<rlPhaseStart>, I<rlPhaseStartSetup>, I<rlPhaseStartTest>, and
|
||||
I<rlPhaseStartCleanup>.
|
||||
|
||||
Example:
|
||||
|
||||
rlPhaseStartTest "phase name" && {
|
||||
...
|
||||
rlPhaseEnd; }
|
||||
|
||||
Evaluation of the phase relevancy works as follows:
|
||||
1. If CONDITIONAL_PHASES_BL is non-empty and matches phase name => return 2.
|
||||
2. If phase name contains word 'setup' or 'cleanup' or CONDITIONAL_PHASES_WL
|
||||
is empty => return 0.
|
||||
3. If CONDITIONAL_PHASES_WL is non-empty and matches phase name => return 0
|
||||
otherwise return 1.
|
||||
|
||||
Normaly Setup and Cleanup phases are not skipped unless hey are B<explicitly>
|
||||
black-listed.
|
||||
|
||||
To make the test work properly with conditional phases it is necessary to
|
||||
surround phase code with curly brackets and make it conditionally executed
|
||||
based on rlPhaseStart* function's exit code the same way as it is demostrated in
|
||||
the example above. To make the process easy you can use following command:
|
||||
|
||||
sed 's/rlPhaseStart[^{]*$/& \&\& {/;s/rlPhaseEnd[^}]*$/&; }/'
|
||||
|
||||
This code can be embedded in Makefile by modifying build target to following
|
||||
form:
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
grep -Eq 'rlPhase(Start[^{]*|End[^}]*)$' runtest.sh && sed -i 's/rlPhaseStart[^{]*$/& \&\& {/;s/rlPhaseEnd[^}]*$/&; }/' testrun.sh
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
|
||||
=cut
|
||||
#'
|
||||
echo -n "loading library $__INTERNAL_ConditionalPhases_LIB_NAME v$__INTERNAL_ConditionalPhases_LIB_VERSION... "
|
||||
|
||||
|
||||
# ConditionalPhasesLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
ConditionalPhasesLibraryLoaded() {
|
||||
if [[ -n "$CONDITIONAL_PHASES_BL" || -n "$CONDITIONAL_PHASES_WL" ]]; then
|
||||
__INTERNAL_ConditionalPhases_eval() {
|
||||
# check phases black-list
|
||||
[[ -n "$CONDITIONAL_PHASES_BL" && "$1" =~ $CONDITIONAL_PHASES_BL ]] && {
|
||||
rlLogWarning "phase '$1' should be skipped as it is defined in \$CONDITIONAL_PHASES_BL='$CONDITIONAL_PHASES_BL'"
|
||||
return 2
|
||||
}
|
||||
# always execute Setup, Cleanup and if no PHASES (white-list) specified
|
||||
[[ "$1" =~ $(echo "\<[Ss][Ee][Tt][Uu][Pp]\>") || "$1" =~ $(echo "\<[Cc][Ll][Ee][Aa][Nn][Uu][Pp]\>") ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as 'setup' and 'cleanup' phases are allowed by default, these can be black-listed"
|
||||
return 0
|
||||
}
|
||||
[[ -z "$CONDITIONAL_PHASES_WL" ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as there is no rule for it"
|
||||
return 0
|
||||
}
|
||||
[[ "$1" =~ $CONDITIONAL_PHASES_WL ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as it is defined in \$CONDITIONAL_PHASES_WL='$CONDITIONAL_PHASES_WL'"
|
||||
return 0
|
||||
} || {
|
||||
rlLogWarning "phase '$1' should be skipped as it is not defined in \$CONDITIONAL_PHASES_WL='$CONDITIONAL_PHASES_WL'"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
rlLogInfo "replacing rlPhaseStart by modified function with conditional phases implemented"
|
||||
:; rlPhaseStart() {
|
||||
if [ "x$1" = "xFAIL" -o "x$1" = "xWARN" ] ; then
|
||||
__INTERNAL_ConditionalPhases_eval "$2" && \
|
||||
rljAddPhase "$1" "$2"
|
||||
return $?
|
||||
else
|
||||
rlLogError "rlPhaseStart: Unknown phase type: $1"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
else
|
||||
rlLogInfo "Neither CONDITIONAL_PHASES_WL nor CONDITIONAL_PHASES_BL is defined, not applying modifications"
|
||||
fi
|
||||
}; # end of ConditionalPhasesLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
echo 'done.'
|
48
tests/run-as/distribution/Library/Log/Makefile
Normal file
48
tests/run-as/distribution/Library/Log/Makefile
Normal file
@ -0,0 +1,48 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/Log
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/Log
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides yet another logging facility that does not rely on beakerlib while it can integrate with it." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/opts)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
637
tests/run-as/distribution/Library/Log/lib.sh
Normal file
637
tests/run-as/distribution/Library/Log/lib.sh
Normal file
@ -0,0 +1,637 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = Log
|
||||
# library-version = 11
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_Log_LIB_VERSION=11
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Log
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provide logging capability which does not rely on beakerlib so it
|
||||
can be used standalone.
|
||||
|
||||
If it is used within beakerlib it automatically bypass all messages to the
|
||||
beakerlib.
|
||||
|
||||
Also this library provide journaling feature so the summary can be printed out
|
||||
at the end.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/Log and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library Log v$__INTERNAL_Log_LIB_VERSION... "
|
||||
|
||||
|
||||
__INTERNAL_Log_prefix=''
|
||||
__INTERNAL_Log_prefix2=''
|
||||
__INTERNAL_Log_postfix=''
|
||||
__INTERNAL_Log_default_level=3
|
||||
__INTERNAL_Log_level=$__INTERNAL_Log_default_level
|
||||
LogSetDebugLevel() {
|
||||
if [[ -n "$1" ]]; then
|
||||
if [[ "$1" =~ ^[0-9]+$ ]]; then
|
||||
let __INTERNAL_Log_level=$__INTERNAL_Log_default_level+$1;
|
||||
else
|
||||
__INTERNAL_Log_level=255
|
||||
fi
|
||||
else
|
||||
__INTERNAL_Log_level=$__INTERNAL_Log_default_level
|
||||
fi
|
||||
}
|
||||
LogSetDebugLevel "$DEBUG"
|
||||
let __INTERNAL_Log_level_LOG=0
|
||||
let __INTERNAL_Log_level_FATAL=0
|
||||
let __INTERNAL_Log_level_ERROR=1
|
||||
let __INTERNAL_Log_level_WARNING=2
|
||||
let __INTERNAL_Log_level_INFO=3
|
||||
let __INTERNAL_Log_level_DEBUG=4
|
||||
let __INTERNAL_Log_level_MORE=5
|
||||
let __INTERNAL_Log_level_MORE_=$__INTERNAL_Log_level_MORE+1
|
||||
let __INTERNAL_Log_level_MORE__=$__INTERNAL_Log_level_MORE_+1
|
||||
let __INTERNAL_Log_level_MORE___=$__INTERNAL_Log_level_MORE__+1
|
||||
|
||||
# Log ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
Log() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
local pri=$2 message="${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
if [[ -n "$pri" ]]; then
|
||||
LogPrintMessage "$pri" "$message"
|
||||
LogjAddMessage "$pri" "$message"
|
||||
else
|
||||
LogPrintMessage "$(date +%H:%M:%S)" "$message"
|
||||
LogjAddMessage "INFO" "$message"
|
||||
fi
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of Log }}}
|
||||
|
||||
|
||||
__INTERNAL_Log_condition() {
|
||||
cat <<EOF
|
||||
__INTERNAL_Log_level_do=$1
|
||||
if [[ \$__INTERNAL_Log_level -ge \$__INTERNAL_Log_level_do ]]; then
|
||||
[[ -z "$2" ]] && return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
# LogInfo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogInfo() {
|
||||
__INTERNAL_LogPrio='INFO'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_INFO \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='INFO'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogInfo }}}
|
||||
|
||||
|
||||
# LogWarn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogWarn() {
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_WARNING \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogWarn }}}
|
||||
|
||||
|
||||
# LogWarning ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogWarning() {
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_WARNING \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogWarning }}}
|
||||
|
||||
|
||||
# LogError ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogError() {
|
||||
__INTERNAL_LogPrio='ERROR'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_ERROR \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='ERROR'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogError }}}
|
||||
|
||||
|
||||
# LogFatal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFatal() {
|
||||
__INTERNAL_LogPrio='FATAL'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_FATAL \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='FATAL'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
exit 255
|
||||
LogMore___ -f "end"
|
||||
}; # end of LogFatal }}}
|
||||
|
||||
|
||||
# LogPASS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogPASS() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
Log "$1" PASS
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}
|
||||
LogPass() {
|
||||
LogPASS "$@"
|
||||
}; # end of LogPASS }}}
|
||||
|
||||
|
||||
# LogFAIL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFAIL() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
Log "$1" FAIL
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}
|
||||
LogFail() {
|
||||
LogFAIL "$@"
|
||||
}; # end of LogFAIL }}}
|
||||
|
||||
|
||||
# LogDo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogDo() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
local tmp=${BASH_REMATCH[1]:-1}
|
||||
pref="${FUNCNAME[$tmp]}(): "
|
||||
}
|
||||
LogPrintMessage "$__INTERNAL_LogPrio" "${__INTERNAL_Log_prefix}${pref}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
return 0
|
||||
}; # end of LogDo }}}
|
||||
|
||||
|
||||
# LogDebug ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogDebug() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
__INTERNAL_Log_level_do=${2:-$__INTERNAL_Log_level_DEBUG}
|
||||
__INTERNAL_LogPrio='DEBUG'
|
||||
[[ $__INTERNAL_Log_level_do -ge $__INTERNAL_Log_level_MORE ]] && __INTERNAL_LogPrio="${__INTERNAL_LogPrio}:$(($__INTERNAL_Log_level_do-$__INTERNAL_Log_level_DEBUG+1))"
|
||||
eval "$(__INTERNAL_Log_condition \${2:-\$__INTERNAL_Log_level_DEBUG} \"\$1\")"
|
||||
LogDo $pref "$1"
|
||||
return 0
|
||||
}; # end of LogDebug }}}
|
||||
|
||||
|
||||
# LogMore ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore() {
|
||||
# log if DEBUG does not containg a number
|
||||
# or the number is greater or equal to 2
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" ${2:-$__INTERNAL_Log_level_MORE}
|
||||
}; # end of LogMore }}}
|
||||
|
||||
|
||||
# LogMore_ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore_() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE_
|
||||
}; # end of LogMore_ }}}
|
||||
|
||||
|
||||
# LogMore__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore__() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE__
|
||||
}; # end of LogMore__ }}}
|
||||
|
||||
|
||||
# LogMore___ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore___() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE___
|
||||
}; # end of LogMore___ }}}
|
||||
|
||||
|
||||
# LogMoreLow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreLow_Obs=''
|
||||
LogMoreLow() {
|
||||
[[ -z "$__INTERNAL_LogMoreLow_Obs" ]] && {
|
||||
LogMore_ -f "LogMoreLow is obsoleted by LogMore_"
|
||||
__INTERNAL_LogMoreLow_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE_
|
||||
}; # end of LogMoreLow }}}
|
||||
|
||||
|
||||
# LogMoreMed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreMed_Obs=''
|
||||
LogMoreMed() {
|
||||
[[ -z "$__INTERNAL_LogMoreMed_Obs" ]] && {
|
||||
LogMore__ -f "LogMoreMed is obsoleted by LogMore__"
|
||||
__INTERNAL_LogMoreMed_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE__
|
||||
}; # end of LogMoreMed }}}
|
||||
|
||||
|
||||
# LogMoreHigh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreHigh_Obs=''
|
||||
LogMoreHigh() {
|
||||
[[ -z "$__INTERNAL_LogMoreHigh_Obs" ]] && {
|
||||
LogMore___ -f "LogMoreHigh is obsoleted by LogMore___"
|
||||
__INTERNAL_LogMoreHigh_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE___
|
||||
}; # end of LogMoreHigh }}}
|
||||
|
||||
|
||||
# LogjAddMessage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogjAddMessage() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
__INTERNAL_Log_journal=("${__INTERNAL_Log_journal[@]}" "$1" "$2")
|
||||
LogMore__ -f "end"
|
||||
true;
|
||||
}; # end of LogjAddMessage }}}
|
||||
|
||||
# __INTERNAL_LogCenterText ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogCenterText() {
|
||||
local spaces=' '
|
||||
# strip colors
|
||||
local log_pri_strip=$(echo -en "$1" | sed -r "s:\x1B\[[0-9;]*[mK]::g")
|
||||
local log_pri_strip_count=${#log_pri_strip}
|
||||
local left_spaces=$(( ($2 - $log_pri_strip_count) / 2 ))
|
||||
local right_spaces=$(( $2 - $log_pri_strip_count - $left_spaces ))
|
||||
echo -en "${spaces:0:$left_spaces}${1}${spaces:0:$right_spaces}"
|
||||
}; # end of __INTERNAL_LogCenterText }}}
|
||||
|
||||
|
||||
# LogPrintMessage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogPrintMessage() {
|
||||
echo -e ":: [$(__INTERNAL_LogCenterText "$1" 10)] :: $2" >&2
|
||||
return 0
|
||||
}; # end of LogPrintMessage }}}
|
||||
|
||||
|
||||
# LogReport ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 LogReport
|
||||
|
||||
Prints final report similar to breakerlib's rlJournalPrintText. This is useful
|
||||
mainly if you use TCF without beakerlib.
|
||||
|
||||
LogReport
|
||||
|
||||
=cut
|
||||
#'
|
||||
|
||||
LogReport() {
|
||||
echo -e "\n ====== Summary report begin ======"
|
||||
local a p l i
|
||||
for i in $(seq 0 2 $((${#__INTERNAL_Log_journal[@]}-1)) ); do
|
||||
LogPrintMessage "${__INTERNAL_Log_journal[$i]}" "${__INTERNAL_Log_journal[$((++i))]}"
|
||||
done
|
||||
echo " ======= Summary report end ======="
|
||||
__INTERNAL_Log_journal=()
|
||||
}; # end of LogReport }}}
|
||||
|
||||
|
||||
# LogFile ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFile() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
cat $1 | while IFS= read line; do
|
||||
Log "$line" "${prio:-$2}"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogText ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogText() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
{
|
||||
if [[ "$1" == "-" ]]; then
|
||||
cat -
|
||||
else
|
||||
echo "$1"
|
||||
fi
|
||||
} | while IFS= read line; do
|
||||
Log "$line" "${prio:-$2}"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogStrippedDiff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogStrippedDiff() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
{
|
||||
if [[ -n "$2" ]]; then
|
||||
diff -U0 "$1" "$2"
|
||||
else
|
||||
cat $1
|
||||
fi
|
||||
} | grep -v -e '^@@ ' -e '^--- ' -e '^+++ ' | while IFS= read line; do
|
||||
Log "$line" "$prio"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogRun ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogRun() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogMore
|
||||
local dolog=$?
|
||||
[[ $dolog -eq 0 ]] || {
|
||||
local param params blacklist="[[:space:]]|>|<|\|"
|
||||
[[ "${#@}" -eq 1 ]] && params="$1" || {
|
||||
for param in "$@"; do
|
||||
if [[ "$param" =~ $blacklist ]]; then
|
||||
params="$params \"${param//\"/\\\"}\""
|
||||
else
|
||||
params="$params $param"
|
||||
fi
|
||||
done
|
||||
params="${params:1}"
|
||||
}
|
||||
LogDo $pref "executing >>>>> ${params} <<<<<"
|
||||
}
|
||||
eval "$@"
|
||||
ret=$?
|
||||
[[ $dolog -eq 0 ]] || LogMore $pref "execution >>>>> ${params} <<<<< returned '$ret'"
|
||||
return $ret
|
||||
}; # end of LogRun }}}
|
||||
|
||||
|
||||
# LogDebugNext ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugNext() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebug '' ${1:-$__INTERNAL_Log_level_DEBUG} || {
|
||||
__INTERNAL_Log_DEBUGING=0
|
||||
trap "
|
||||
__INTERNAL_Log_DEBUGING_res=\$?
|
||||
let __INTERNAL_Log_DEBUGING++
|
||||
if [[ \$__INTERNAL_Log_DEBUGING -eq 1 ]]; then
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
else
|
||||
trap - DEBUG
|
||||
LogDebug $pref \"execution >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<< returned \$__INTERNAL_Log_DEBUGING_res\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
fi" DEBUG
|
||||
}
|
||||
}; # end of LogDebugNext }}}
|
||||
|
||||
|
||||
# LogMoreNext ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogMoreNext() {
|
||||
LogMore || {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebugNext $pref ${1:-$__INTERNAL_Log_level_MORE}
|
||||
}
|
||||
}; # end of LogMoreNext }}}
|
||||
LogNext() {
|
||||
LogMoreNext "$@"
|
||||
}
|
||||
|
||||
|
||||
# LogDebugOn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugOn() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebug '' ${1:-$__INTERNAL_Log_level_DEBUG} || {
|
||||
trap "
|
||||
__INTERNAL_Log_DEBUGING_res=\$?
|
||||
let __INTERNAL_Log_DEBUGING++
|
||||
if [[ -z \"\$__INTERNAL_Log_DEBUGING_cmd\" ]]; then
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
else
|
||||
LogDebug $pref \"execution >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<< returned \$__INTERNAL_Log_DEBUGING_res\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
if [[ \"\$__INTERNAL_Log_DEBUGING_cmd\" =~ LogDebugOff ]]; then
|
||||
trap - DEBUG
|
||||
else
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
fi
|
||||
fi" DEBUG
|
||||
}
|
||||
}; # end of LogDebugOn }}}
|
||||
|
||||
|
||||
# LogMoreOn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogMoreOn() {
|
||||
LogMore || {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebugOn $pref ${1:-$__INTERNAL_Log_level_MORE}
|
||||
}
|
||||
}; # end of LogMoreOn }}}
|
||||
|
||||
|
||||
# LogDebugOff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugOff() {
|
||||
__INTERNAL_Log_DEBUGING_cmd=''
|
||||
}; # end of LogDebugOff }}}
|
||||
|
||||
|
||||
# LogVar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogVar() {
|
||||
[[ -n "$DEBUG" ]] && {
|
||||
echo -n 'eval '
|
||||
while [[ -n "$1" ]]; do
|
||||
echo -n "LogDebug -f \"\$(set | grep -P '^$1=')\";"
|
||||
shift
|
||||
done
|
||||
}
|
||||
}; # end of LogVar }}}
|
||||
|
||||
|
||||
# __INTERNAL_LogRedirectToBeakerlib ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogRedirectToBeakerlib() {
|
||||
echo -e "\nrunning inside the beakerlib - redirect own logging functions to beakerlib ones"
|
||||
true; LogjAddMessage() {
|
||||
LogMore___ -f "begin $*"
|
||||
rljAddMessage "$2" "$1"
|
||||
LogMore___ -f "end $*"
|
||||
}
|
||||
true; Log() {
|
||||
LogMore___ -f "begin $*"
|
||||
case ${2} in
|
||||
INFO)
|
||||
LogjAddMessage "INFO" "$1"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
BEGIN)
|
||||
LogjAddMessage "INFO" "$*:"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
WARNING|WARN|ERROR|FATAL)
|
||||
LogjAddMessage "WARNING" "$1"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
SKIP|SKIPPING)
|
||||
LogjAddMessage "WARNING" "$*:"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
FAIL)
|
||||
rlFail "$*"
|
||||
return $?
|
||||
;;
|
||||
PASS)
|
||||
rlPass "$*"
|
||||
return $?
|
||||
;;
|
||||
*)
|
||||
rlLog "$*"
|
||||
;;
|
||||
esac
|
||||
LogMore___ -f "end $*"
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
# end of __INTERNAL_LogRedirectToBeakerlib }}}
|
||||
|
||||
|
||||
# LogLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogLibraryLoaded() {
|
||||
declare -F rlDie > /dev/null && __INTERNAL_LogRedirectToBeakerlib
|
||||
return 0
|
||||
}; # end of LogLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
48
tests/run-as/distribution/Library/opts/Makefile
Normal file
48
tests/run-as/distribution/Library/opts/Makefile
Normal file
@ -0,0 +1,48 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/opts
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/opts
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides simple way for defining script's or function's options including help" >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/opts)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
338
tests/run-as/distribution/Library/opts/lib.sh
Normal file
338
tests/run-as/distribution/Library/opts/lib.sh
Normal file
@ -0,0 +1,338 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = opts
|
||||
# library-version = 4
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_opts_LIB_VERSION=4
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library opts
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provides simple way for defining script's or function's option
|
||||
agruments including help.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/opts and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/opts)" >> $(METADATA)
|
||||
|
||||
B<Code example>
|
||||
|
||||
testfunction() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
optsAdd 'flag1' --flag
|
||||
optsAdd 'optional1|o' --optional
|
||||
optsAdd 'Optional2|O' "echo opt \$1" --optional --long --var-name opt
|
||||
optsAdd 'mandatory1|m' "echo man \$1" --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
echo "$optional1"
|
||||
echo "$opt"
|
||||
echo "$mandatory1"
|
||||
}
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library opts v$__INTERNAL_opts_LIB_VERSION... "
|
||||
|
||||
# optsAdd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsAdd() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
local GETOPT=$(getopt -q -o fomv:d:lh:l -l flag,opt,optional,mandatory,varname:,default:,local,help:,long -- "$@")
|
||||
eval set -- "$GETOPT"
|
||||
local type='f' var_name var_name_set default help long
|
||||
while [[ -n "$@" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
-h|--help)
|
||||
shift
|
||||
help="$1"
|
||||
;;
|
||||
-l|--long)
|
||||
long=1
|
||||
;;
|
||||
-d|--default)
|
||||
shift
|
||||
default="$1"
|
||||
;;
|
||||
-v|--varname|--var-name)
|
||||
shift
|
||||
var_name="$1"
|
||||
var_name_set=1
|
||||
;;
|
||||
-f|--flag)
|
||||
type='f'
|
||||
;;
|
||||
-o|--opt|--optional)
|
||||
type='o'
|
||||
;;
|
||||
-m|--mandatory)
|
||||
type='m'
|
||||
;;
|
||||
*)
|
||||
echo "unknown option '$1'"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
[ -z "$var_name" ] && {
|
||||
var_name=$(echo -n "$1" | cut -d '|' -f 1 | sed -e 's/-//g;s/^[0-9]/_\0/')
|
||||
LogMoreHigh -f "constructing variable name '$var_name'"
|
||||
}
|
||||
local opts='' opts_help='' optsi=''
|
||||
for optsi in $(echo -n "$1" | tr '|' ' '); do
|
||||
if [[ ${#optsi} -ge 2 || $long -eq 1 ]]; then
|
||||
opts="$opts|--$optsi"
|
||||
opts_help="$opts_help|--$optsi[=ARG]"
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long},${optsi}"
|
||||
LogMoreHigh -f "adding long option '$optsi'"
|
||||
case $type in
|
||||
m)
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long}:"
|
||||
;;
|
||||
o)
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long}::"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
opts="$opts|-$optsi"
|
||||
opts_help="$opts_help|-${optsi}[ARG]"
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}${optsi}"
|
||||
LogMoreHigh -f "adding short option '$optsi'"
|
||||
case $type in
|
||||
m)
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}:"
|
||||
;;
|
||||
o)
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}::"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
optsCode="${optsCode}
|
||||
${opts:1})
|
||||
optsPresent=\"\${optsPresent}$var_name \""
|
||||
LogMoreHigh -f "adding code for processing option '${opts:1}'"
|
||||
__INTERNAL_opts_init_var="$__INTERNAL_opts_init_var
|
||||
${__INTERNAL_opts_local}$var_name=()"
|
||||
__INTERNAL_opts_default="$__INTERNAL_opts_default
|
||||
[[ \"\$optsPresent\" =~ \$(echo \"\<${var_name}\>\") ]] || ${__INTERNAL_opts_local}$var_name='$default'"
|
||||
case $type in
|
||||
f)
|
||||
[[ -z "$2" || -n "$var_name_set" ]] && {
|
||||
local val=1
|
||||
[[ -n "$default" ]] && val=''
|
||||
optsCode="$optsCode
|
||||
$var_name+=( '$val' )"
|
||||
}
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts:1}"
|
||||
;;
|
||||
o|m)
|
||||
optsCode="$optsCode
|
||||
shift"
|
||||
[[ -z "$2" || -n "$var_name_set" ]] && optsCode="$optsCode
|
||||
$var_name+=( \"\$1\" )"
|
||||
if [[ "$type" == "o" ]]; then
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts_help:1}"
|
||||
else
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts:1} ARG"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
[[ -n "$2" ]] && {
|
||||
optsCode="$optsCode
|
||||
$2"
|
||||
}
|
||||
optsCode="$optsCode
|
||||
;;"
|
||||
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}${help:+
|
||||
$help
|
||||
}"
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsAdd }}}
|
||||
|
||||
|
||||
# optsBegin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsBegin() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
optsCode=''
|
||||
optsPresent=' '
|
||||
__INTERNAL_opts_short='.'
|
||||
__INTERNAL_opts_long='help'
|
||||
__INTERNAL_opts_help=''
|
||||
__INTERNAL_opts_local=''
|
||||
__INTERNAL_opts_default=''
|
||||
__INTERNAL_opts_init_var=''
|
||||
[[ "${FUNCNAME[1]}" != "main" ]] && __INTERNAL_opts_local='local '
|
||||
while [[ -n "$1" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
-h|--help)
|
||||
shift
|
||||
__INTERNAL_opts_help="$1"
|
||||
;;
|
||||
*)
|
||||
echo "unknown option '$1'"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsBegin }}}
|
||||
|
||||
|
||||
# optsDone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsDone() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
optsCode="${__INTERNAL_opts_local}GETOPT=\$(getopt -o ${__INTERNAL_opts_short} -l ${__INTERNAL_opts_long} -- \"\$@\")
|
||||
[[ \$? -ne 0 ]] && {
|
||||
echo 'Exiting'
|
||||
return 1 >& /dev/null
|
||||
exit 1
|
||||
}
|
||||
eval set -- \"\$GETOPT\"
|
||||
${__INTERNAL_opts_init_var:1}
|
||||
while [[ -n \"\$1\" ]]; do
|
||||
case \$1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
${optsCode}
|
||||
|
||||
--help)
|
||||
echo \"\$__INTERNAL_opts_help\"
|
||||
return >& /dev/null
|
||||
exit
|
||||
;;
|
||||
*)
|
||||
echo \"unknown option '\$1'\"
|
||||
return 1 >& /dev/null
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
${__INTERNAL_opts_default:1}
|
||||
unset optsCode __INTERNAL_opts_help __INTERNAL_opts_short __INTERNAL_opts_long __INTERNAL_opts_default __INTERNAL_opts_init_var __INTERNAL_opts_local
|
||||
"
|
||||
if ! echo "$optsCode" | grep -q -- '--help$'; then
|
||||
__INTERNAL_opts_help="$__INTERNAL_opts_help
|
||||
--help
|
||||
Show this help."
|
||||
fi
|
||||
LogMoreHigh -f "optsCode:\n$optsCode"
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsDone }}}
|
||||
|
||||
|
||||
# optsSelfCheck ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsSelfCheck() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
# optsAdd 'help' -f 'echo help'
|
||||
optsAdd 'flag' -f 'echo f'
|
||||
optsAdd 'optional|o' -o "echo opt \$1"
|
||||
optsAdd 'Optional|O' -o "echo opt \$1" --long
|
||||
optsAdd 'mandatory|m' -m "echo man \$1"
|
||||
optsDone
|
||||
|
||||
echo "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
eval "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
fce() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
# optsAdd 'help' -f 'echo help'
|
||||
optsAdd 'flag' -f
|
||||
optsAdd 'optional|o' -o "echo opt \$1"
|
||||
optsAdd 'Optional|O' -o "echo opt \$1" --long
|
||||
optsAdd 'mandatory|m' -m "echo man \$1"
|
||||
optsDone
|
||||
echo "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
eval "${optsCode}"
|
||||
|
||||
echo ...
|
||||
}
|
||||
|
||||
echo -e 'test for opts in function\n========================='
|
||||
fce --help
|
||||
}; # end of optsSelfCheck }}}
|
||||
|
||||
|
||||
# optsLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsLibraryLoaded() {
|
||||
return 0
|
||||
}; # end of LogLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
60
tests/run-as/distribution/Library/tcf/Makefile
Normal file
60
tests/run-as/distribution/Library/tcf/Makefile
Normal file
@ -0,0 +1,60 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/tcf
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/tcf
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Block style coding with ability of skipping parts." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/tcf)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
903
tests/run-as/distribution/Library/tcf/lib.sh
Normal file
903
tests/run-as/distribution/Library/tcf/lib.sh
Normal file
@ -0,0 +1,903 @@
|
||||
#!/bin/bash
|
||||
# try-check-final.sh
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = tcf
|
||||
# library-version = 14
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_tcf_LIB_VERSION=14
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Try-Check-Final
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This file contains functions which gives user the ability to define blocks of
|
||||
code where some of the blocks can be automatically skipped if some of preceeding
|
||||
blocks failed.
|
||||
|
||||
ATTENTION
|
||||
This plugin modifies some beakerlib functions! If you suspect that it breakes
|
||||
some functionality set the environment variable TCF_NOHACK to nonempty value.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/tcf and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/tcf)" >> $(METADATA)
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library try-check-final v$__INTERNAL_tcf_LIB_VERSION... "
|
||||
|
||||
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_LOW=3
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_MED=$__INTERNAL_tcf_DEBUG_LEVEL_LOW+1
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_HIGH=$__INTERNAL_tcf_DEBUG_LEVEL_LOW+2
|
||||
|
||||
# global variables {{{
|
||||
__INTERNAL_tcf_result=0
|
||||
__INTERNAL_tcf_result_file="${BEAKERLIB_DIR:-"/var/tmp"}/tcf.result"
|
||||
echo -n "$__INTERNAL_tcf_result" > "$__INTERNAL_tcf_result_file"
|
||||
__INTERNAL_tcf_current_level_data=()
|
||||
__INTERNAL_tcf_current_level_val=0
|
||||
__INTERNAL_tcf_journal=()
|
||||
#}}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_colorize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_colorize() {
|
||||
local a
|
||||
case $1 in
|
||||
PASS)
|
||||
a="${__INTERNAL_tcf_color_green}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
FAIL)
|
||||
a="${__INTERNAL_tcf_color_red}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
SKIPPING|WARNING)
|
||||
a="${__INTERNAL_tcf_color_yellow}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
BEGIN|INFO)
|
||||
a="${__INTERNAL_tcf_color_blue}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
*)
|
||||
a=$1
|
||||
esac
|
||||
echo -n "$a"
|
||||
}; # end of __INTERNAL_tcf_colorize }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_colors_setup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_colors_setup(){
|
||||
T="$TERM"
|
||||
[[ -t 1 ]] || T=""
|
||||
[[ -t 2 ]] || T=""
|
||||
[[ "$1" == "--force" ]] && T="xterm"
|
||||
case $T in
|
||||
xterm|screen)
|
||||
__INTERNAL_tcf_color_black="\e[0;30m"
|
||||
__INTERNAL_tcf_color_dark_gray="\e[1;30m"
|
||||
__INTERNAL_tcf_color_blue="\e[0;34m"
|
||||
__INTERNAL_tcf_color_light_blue="\e[1;34m"
|
||||
__INTERNAL_tcf_color_green="\e[0;32m"
|
||||
__INTERNAL_tcf_color_light_green="\e[1;32m"
|
||||
__INTERNAL_tcf_color_cyan="\e[0;36m"
|
||||
__INTERNAL_tcf_color_light_cyan="\e[1;36m"
|
||||
__INTERNAL_tcf_color_red="\e[0;31m"
|
||||
__INTERNAL_tcf_color_light_red="\e[1;31m"
|
||||
__INTERNAL_tcf_color_purple="\e[0;35m"
|
||||
__INTERNAL_tcf_color_light_purple="\e[1;35m"
|
||||
__INTERNAL_tcf_color_brown="\e[0;33m"
|
||||
__INTERNAL_tcf_color_yellow="\e[1;33m"
|
||||
__INTERNAL_tcf_color_light_gray="\e[0;37m"
|
||||
__INTERNAL_tcf_color_white="\e[1;37m"
|
||||
__INTERNAL_tcf_color_reset="\e[00m"
|
||||
;;
|
||||
* )
|
||||
__INTERNAL_tcf_color_black=""
|
||||
__INTERNAL_tcf_color_dark_gray=""
|
||||
__INTERNAL_tcf_color_blue=""
|
||||
__INTERNAL_tcf_color_light_blue=""
|
||||
__INTERNAL_tcf_color_green=""
|
||||
__INTERNAL_tcf_color_light_green=""
|
||||
__INTERNAL_tcf_color_cyan=""
|
||||
__INTERNAL_tcf_color_light_cyan=""
|
||||
__INTERNAL_tcf_color_red=""
|
||||
__INTERNAL_tcf_color_light_red=""
|
||||
__INTERNAL_tcf_color_purple=""
|
||||
__INTERNAL_tcf_color_light_purple=""
|
||||
__INTERNAL_tcf_color_brown=""
|
||||
__INTERNAL_tcf_color_yellow=""
|
||||
__INTERNAL_tcf_color_light_gray=""
|
||||
__INTERNAL_tcf_color_white=""
|
||||
__INTERNAL_tcf_color_reset=""
|
||||
;;
|
||||
esac
|
||||
}; # end of __INTERNAL_tcf_colors_setup
|
||||
__INTERNAL_tcf_colors_setup; # }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_copy_function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_copy_function() {
|
||||
declare -F $1 > /dev/null || return 1
|
||||
eval "$(echo -n "${2}() "; declare -f ${1} | tail -n +2)"
|
||||
}; # end of __INTERNAL_tcf_copy_function }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_addE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_addE2R() {
|
||||
__INTERNAL_tcf_copy_function $1 TCF_orig_$1
|
||||
eval "${1}() { TCF_orig_${1} \"\$@\"; tcfE2R; }"
|
||||
}; # end of __INTERNAL_tcf_addE2R }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_insertE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_insertE2R() {
|
||||
__INTERNAL_tcf_copy_function $1 TCF_orig_$1
|
||||
eval "$(echo -n "${1}() "; declare -f ${1} | tail -n +2 | sed -e 's/\(.*__INTERNAL_ConditionalAssert.*\)/\1\ntcfE2R;/')"
|
||||
}; # end of __INTERNAL_tcf_insertE2R }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_get_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_get_current_level() {
|
||||
local l=$__INTERNAL_tcf_current_level_val
|
||||
if [[ $1 ]]; then
|
||||
l=$(($l+$1))
|
||||
fi
|
||||
local i
|
||||
for i in $(seq 1 $(($l*2)) ); do echo -n " "; done
|
||||
return $l
|
||||
}; # end of __INTERNAL_tcf_get_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_incr_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_incr_current_level() {
|
||||
let __INTERNAL_tcf_current_level_val++
|
||||
__INTERNAL_Log_prefix=$(__INTERNAL_tcf_get_current_level)
|
||||
}; # end of __INTERNAL_tcf_incr_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_decr_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_decr_current_level() {
|
||||
let __INTERNAL_tcf_current_level_val--
|
||||
__INTERNAL_Log_prefix=$(__INTERNAL_tcf_get_current_level)
|
||||
}; # end of __INTERNAL_tcf_decr_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_do_hack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_do_hack() {
|
||||
LogDebug "TCF_NOHACK='$TCF_NOHACK'"
|
||||
if [[ -z "$TCF_NOHACK" ]]; then
|
||||
tcfChk "Apply TCF beakerlib hacks" && {
|
||||
rlLog " injecting tcf hacks into the beakerlib functions"
|
||||
echo -n "patching rlLog"
|
||||
local rlL=$(declare -f rlLog | sed -e 's|\] ::|\0${__INTERNAL_Log_prefix}|;s|$3 $1"|${3:+"$3 "}$1"|')
|
||||
eval "$rlL"
|
||||
|
||||
echo -n ", rljAddTest"
|
||||
__INTERNAL_tcf_copy_function rljAddTest __INTERNAL_tcf_orig_rljAddTest
|
||||
true; rljAddTest() {
|
||||
local a="${__INTERNAL_Log_prefix}$1"; shift
|
||||
[[ "$1" != "FAIL" ]]; tcfE2R
|
||||
__INTERNAL_tcf_journal=("${__INTERNAL_tcf_journal[@]}" "$1" "$a")
|
||||
__INTERNAL_tcf_orig_rljAddTest "$a" "$@"
|
||||
}
|
||||
echo -n ", rljAddMessage"
|
||||
__INTERNAL_tcf_copy_function rljAddMessage __INTERNAL_tcf_orig_rljAddMessage
|
||||
true; rljAddMessage() {
|
||||
local a="${__INTERNAL_Log_prefix}$1"; shift
|
||||
__INTERNAL_tcf_journal=("${__INTERNAL_tcf_journal[@]}" "$1" "$a")
|
||||
__INTERNAL_tcf_orig_rljAddMessage "$a" "$@"
|
||||
}
|
||||
echo -n ", __INTERNAL_LogAndJournalFail"
|
||||
__INTERNAL_tcf_copy_function __INTERNAL_LogAndJournalFail __INTERNAL_tcf_orig___INTERNAL_LogAndJournalFail
|
||||
true; __INTERNAL_LogAndJournalFail() {
|
||||
tcfNOK
|
||||
__INTERNAL_tcf_orig___INTERNAL_LogAndJournalFail "$@"
|
||||
}
|
||||
echo "."
|
||||
tcfFin --no-assert --ignore; }
|
||||
else
|
||||
Log "skip hacking beakerlib functions"
|
||||
fi
|
||||
}; # end of __INTERNAL_tcf_do_hack }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_kill_old_plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_kill_old_plugin() {
|
||||
tcfChk "Get rid of the old TCF implementation. removing" && {
|
||||
local comma='' i
|
||||
for i in Try Chk Fin E2R RES OK NOK NEG TCFcheckFinal TCFreport; do
|
||||
echo -n "${comma}rl$i"
|
||||
unset -f rl$i
|
||||
comma=', '
|
||||
done
|
||||
echo '.'
|
||||
tcfFin --no-assert; }
|
||||
}; # end of __INTERNAL_tcf_kill_old_plugin }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Block functions
|
||||
|
||||
=cut
|
||||
|
||||
# __INTERNAL_tcf_parse_params ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_parse_params() {
|
||||
local GETOPT=$(getopt -q -o if: -l ignore,no-assert,fail-tag: -- "$@")
|
||||
eval set -- "$GETOPT"
|
||||
echo "local ignore noass title fail_tag"
|
||||
echo "[ -z \"\$ignore\" ] && ignore=0"
|
||||
echo "[ -z \"\$noass\" ] && noass=0"
|
||||
echo "[ -z \"\$fail_tag\" ] && fail_tag='FAIL'"
|
||||
while [[ -n "$@" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
--ignore|-i)
|
||||
echo "ignore=1"
|
||||
echo "noass=1"
|
||||
;;
|
||||
--no-assert|-n)
|
||||
echo "noass=1"
|
||||
;;
|
||||
--fail-tag|-f)
|
||||
shift
|
||||
echo "fail_tag='$1'"
|
||||
;;
|
||||
*)
|
||||
echo "unknown option $1"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
[[ -n "$1" ]] && echo "title=\"${1}\""
|
||||
echo "eval set -- \"$(echo "$GETOPT" | sed -e 's/.*-- //')\""
|
||||
}; # end of __INTERNAL_tcf_parse_params }}}
|
||||
|
||||
|
||||
# tcfTry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfTry
|
||||
|
||||
Starting function of block which will be skipped if an error has been detected
|
||||
by tcfFin function occurent before.
|
||||
|
||||
tcfTry ["title"] [-i|--ignore] [--no-assert] [--fail-tag TAG] && {
|
||||
<some code>
|
||||
tcfFin; }
|
||||
|
||||
If title is omitted than noting is printed out so no error will be reported (no
|
||||
Assert is executed) thus at least the very top level tcfTry should have title.
|
||||
|
||||
tcfTry and tcfChk blocks are stackable so you can organize them into a hierarchy
|
||||
structure.
|
||||
|
||||
Note that tcfFin has to be used otherwise the overall result will not be
|
||||
accurate.
|
||||
|
||||
=over
|
||||
|
||||
=item title
|
||||
|
||||
Text which will be displayed and logged at the beginning and the end (in tcfFin
|
||||
function) of the block.
|
||||
|
||||
=item -i, --ignore
|
||||
|
||||
Do not propagate the actual result to the higher level result.
|
||||
|
||||
=item -n, --no-assert
|
||||
|
||||
Do not log error into the journal.
|
||||
|
||||
=item -f, --fail-tag TAG
|
||||
|
||||
If the result of the block is FAIL, use TAG instead ie. INFO or WARNING.
|
||||
|
||||
=back
|
||||
|
||||
Returns 1 if and error occured before, otherwise returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfTry() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
local vars=$(__INTERNAL_tcf_parse_params "$@") || { Log "$vars" FAIL; return 1; }
|
||||
LogMoreMed -f "vars:\n$vars"
|
||||
LogMoreLow -f "evaluating options start"
|
||||
eval "$vars"
|
||||
LogMoreLow -f "evaluating options end"
|
||||
local incr=
|
||||
local pp="SKIPPING"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
LogMoreLow -f "result was $__INTERNAL_tcf_result"
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 ]]; then
|
||||
__INTERNAL_tcf_current_level_data=("$__INTERNAL_tcf_result" "$vars" "${__INTERNAL_tcf_current_level_data[@]}")
|
||||
pp="BEGIN"
|
||||
incr=1
|
||||
fi
|
||||
if [[ -n "$title" ]]; then
|
||||
Log "$title" "$pp"
|
||||
[[ -n "$incr" ]] && {
|
||||
LogMoreLow -f "increment indentation level"
|
||||
__INTERNAL_tcf_incr_current_level
|
||||
}
|
||||
fi
|
||||
LogMoreLow -f "end"
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfTry }}}
|
||||
|
||||
|
||||
# tcfChk ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfChk
|
||||
|
||||
Starting function of block which will be always executed.
|
||||
|
||||
tcfChk ["title"] [-i|--ignore] [--no-assert] [--fail-tag TAG] && {
|
||||
<some code>
|
||||
tcfFin; }
|
||||
|
||||
If title is omitted than noting is printed out so no error will be reported (no
|
||||
Assert is executed) thus at least the very top level tcfChk should have title.
|
||||
|
||||
tcfTry and tcfChk blocks are stackable so you can organize them into a hierarchy
|
||||
structure.
|
||||
|
||||
Note that tcfFin has to be used otherwise the overall result will not be
|
||||
accurate.
|
||||
|
||||
For details about arguments see tcfTry.
|
||||
|
||||
Returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfChk() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
local res=$__INTERNAL_tcf_result
|
||||
tcfRES 0
|
||||
tcfTry "$@"
|
||||
__INTERNAL_tcf_current_level_data[0]=$res
|
||||
LogMoreLow -f "end"
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfChk }}}
|
||||
|
||||
|
||||
# tcfFin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfFin
|
||||
|
||||
Ending function of block. It does some evaluation of previous local and global
|
||||
results and puts it into the global result.
|
||||
|
||||
tcfTry ["title"] && {
|
||||
<some code>
|
||||
tcfFin [-i|--ignore] [--no-assert] [--fail-tag TAG]; }
|
||||
|
||||
Local result is actualy exit code of the last command int the body.
|
||||
|
||||
Global result is an internal varibale hodning previous local results.
|
||||
Respectively last error or 0.
|
||||
|
||||
For details about arguments see tcfTry.
|
||||
|
||||
Returns local result of the preceeding block.
|
||||
|
||||
=cut
|
||||
|
||||
tcfFin() {
|
||||
local RES=$?
|
||||
LogMoreLow -f "begin '$*'"
|
||||
LogMoreMed -f "previous exit code was '$RES'"
|
||||
local vars=$(__INTERNAL_tcf_parse_params "$@") || { Log "$vars" FAIL; return 1; }
|
||||
LogMoreMed -f "vars:\n$vars"
|
||||
LogMoreLow -f "evaluating options start"
|
||||
eval "$vars"
|
||||
LogMoreLow -f "evaluating options end"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
[[ $RES -ne 0 ]] && tcfRES $RES
|
||||
RES=$__INTERNAL_tcf_result
|
||||
LogMoreMed -f "overall result is '$RES'"
|
||||
LogMoreMed -f "data:\n${__INTERNAL_tcf_current_level_data[1]}"
|
||||
LogMoreLow -f "evaluating data start"
|
||||
eval "${__INTERNAL_tcf_current_level_data[1]}"
|
||||
LogMoreLow -f "evaluating data end"
|
||||
if [[ -n "$title" ]]; then
|
||||
__INTERNAL_tcf_decr_current_level
|
||||
if [[ $ignore -eq 1 ]]; then
|
||||
RES=0
|
||||
[[ $__INTERNAL_tcf_result -ne 0 ]] && title="$title - ignored"
|
||||
fi
|
||||
if [[ $noass -eq 0 ]]; then
|
||||
tcfAssert0 "$title" $__INTERNAL_tcf_result "$fail_tag"
|
||||
else
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 ]]; then
|
||||
local pp="PASS"
|
||||
LogInfo "$title - $pp"
|
||||
else
|
||||
local pp="${fail_tag:-FAIL}"
|
||||
LogWarn "$title - $pp"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 || $ignore -eq 1 ]]; then
|
||||
tcfRES ${__INTERNAL_tcf_current_level_data[0]}
|
||||
fi
|
||||
local i
|
||||
for i in 0 1; do unset __INTERNAL_tcf_current_level_data[$i]; done
|
||||
__INTERNAL_tcf_current_level_data=("${__INTERNAL_tcf_current_level_data[@]}")
|
||||
LogMoreLow -f "end"
|
||||
return $RES
|
||||
}; # end of tcfFin }}}
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for manipulation with the results
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfRES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfRES
|
||||
|
||||
Sets and return the global result.
|
||||
|
||||
tcfRES [-p|--print] [number]
|
||||
|
||||
=over
|
||||
|
||||
=item -p --print
|
||||
|
||||
Also print the result value.
|
||||
|
||||
=item number
|
||||
|
||||
If present the global result is set to this value.
|
||||
|
||||
=back
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfRES() {
|
||||
local p=0
|
||||
while [[ -n "$1" ]]; do
|
||||
case $1 in
|
||||
--print|-p)
|
||||
p=1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
if [[ -n "$1" ]]; then
|
||||
__INTERNAL_tcf_result=$1
|
||||
echo -n "$__INTERNAL_tcf_result" > "$__INTERNAL_tcf_result_file"
|
||||
else
|
||||
__INTERNAL_tcf_result="$(cat "$__INTERNAL_tcf_result_file")"
|
||||
fi
|
||||
[[ $p -eq 1 ]] && echo $__INTERNAL_tcf_result
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfRES }}}
|
||||
|
||||
|
||||
# tcfOK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfOK
|
||||
|
||||
Sets the global result to 0.
|
||||
|
||||
tcfOK
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfOK() {
|
||||
tcfRES 0
|
||||
}; # end of tcfOK }}}
|
||||
|
||||
|
||||
# tcfNOK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfNOK
|
||||
|
||||
Sets the global result to 1 or given number.
|
||||
|
||||
tcfNOK [number]
|
||||
|
||||
=over
|
||||
|
||||
=item number
|
||||
|
||||
If present the global result is set to this value.
|
||||
|
||||
=back
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfNOK() {
|
||||
if [[ -n "$1" ]]; then
|
||||
[[ $1 -eq 0 ]] && echo "You have requested result '0'. You should use tcfOK instead."
|
||||
tcfRES $1
|
||||
else
|
||||
tcfRES 1
|
||||
fi
|
||||
}; # end of tcfNOK }}}
|
||||
|
||||
|
||||
# tcfE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfE2R
|
||||
|
||||
Converts exit code of previous command to local result if the exit code is not 0
|
||||
(zero).
|
||||
|
||||
<some command>
|
||||
tcfE2R [number]
|
||||
|
||||
=over
|
||||
|
||||
=item number
|
||||
|
||||
If present use it instead of exit code.
|
||||
|
||||
=back
|
||||
|
||||
Returns original exit code or given number.
|
||||
|
||||
=cut
|
||||
|
||||
tcfE2R() {
|
||||
local res=$?
|
||||
[[ -n "$1" ]] && res=$1
|
||||
[[ $res -ne 0 ]] && tcfRES $res
|
||||
return $res
|
||||
}; # end of tcfE2R }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for manipulation with the exit codes
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfNEG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfNEG
|
||||
|
||||
Negates exit code of previous command.
|
||||
|
||||
<some command>
|
||||
tcfNEG
|
||||
|
||||
Returns 1 if original exit code was 0, otherwise returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfNEG() {
|
||||
[[ $? -eq 0 ]] && return 1 || return 0
|
||||
}; # end of tcfNEG }}}
|
||||
|
||||
|
||||
# tcfRun ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfRun
|
||||
|
||||
Simmilar to rlRun but it also annouces the beginnign of the command.
|
||||
|
||||
tcfRun [--fail-tag|-f TAG] command [exp_result [title]]
|
||||
|
||||
Moreover if 'command not found' appears on STDERR it should produce WARNING.
|
||||
|
||||
=over
|
||||
|
||||
=item command
|
||||
|
||||
Command to execute.
|
||||
|
||||
=item exp_result
|
||||
|
||||
Specification of expect resutl.
|
||||
|
||||
It can be a list of values or intervals or * for any result. Also negation (!) can be used.
|
||||
|
||||
Example:
|
||||
|
||||
<=2,7,10-12,>252,!254 means following values 0,1,2,7,10,11,12,253,255
|
||||
|
||||
=item title
|
||||
|
||||
Text which will be displayed and logged at the beginning and the end of command execution.
|
||||
|
||||
=item --fail-tag | -f
|
||||
|
||||
If the command fails use TAG instead of FAIL.
|
||||
|
||||
=back
|
||||
|
||||
Returns exit code of the executed command.
|
||||
|
||||
=cut
|
||||
|
||||
tcfRun() {
|
||||
LogMore_ -f "begin $*"
|
||||
optsBegin
|
||||
optsAdd 'fail-tag|f' --mandatory
|
||||
optsAdd 'timeout' --optional 'timeout="${1:-10}"'
|
||||
optsAdd 'kill-timeout|kt' --mandatory --default 5
|
||||
optsAdd 'signal' --mandatory --default TERM
|
||||
optsAdd 'check-code' --mandatory --default 'kill -0 $cmdpid >&/dev/null'
|
||||
optsAdd 'kill-code' --mandatory --default '/bin/kill -$signal -- $cmdpid'
|
||||
optsAdd 'allow-skip|as' --flag
|
||||
optsAdd 'no-assert|n' --flag
|
||||
optsDone; eval "${optsCode}"
|
||||
LogMore_ -f "after opts $*"
|
||||
[[ -z "$allowskip" ]] && tcfChk
|
||||
local orig_expecode="${2:-0}"
|
||||
local expecode="$orig_expecode"
|
||||
[[ "$expecode" == "*" ]] && expecode="0-255"
|
||||
local command="$1"
|
||||
local comment="Running command '$command'"
|
||||
[[ -n "$3" ]] && comment="$3"
|
||||
[[ -n "$expecode" ]] && {
|
||||
expecode=$(echo "$expecode" | tr ',-' '\n ' | sed -e 's/^!=/!/;s/^=//;s/^<=\(.\+\)$/0 \1/;s/^>=\(.\+\)$/\1 255/;s/^<\(.\+\)$/0 \$(( \1 - 1 ))/;s/^>\(.\+\)$/\$(( \1 + 1 )) 255/' | while read line; do [[ "$line" =~ ^[^\ ]+$ ]] && echo "$line" || eval seq $line; done; )
|
||||
tcfE2R
|
||||
LogMoreLow -f "orig_expecode='$orig_expecode'"
|
||||
LogMoreLow -f "expecode='$expecode'"
|
||||
}
|
||||
tcfTry ${noassert:+--no-assert} "$comment" && {
|
||||
local errout=$(mktemp)
|
||||
LogMoreLow -f "executing '$command'"
|
||||
if [[ "$optsPresent" =~ $(echo "\<timeout\>") ]]; then
|
||||
LogDebug -f "using watchdog feature"
|
||||
local ec="$(mktemp)"
|
||||
eval "$command; echo $? > $ec 2> >(tee $errout)" &
|
||||
local cmdpid=$!
|
||||
local time_start=$(date +%s)
|
||||
local timeout_t=$(( $time_start + $timeout ))
|
||||
while true; do
|
||||
if ! eval "$checkcode"; then
|
||||
Log "command finished in $(($(date +%s) - $time_start )) seconds"
|
||||
local res="$(cat $ec)"
|
||||
break
|
||||
elif [[ $(date +%s) -ge $timeout_t ]]; then
|
||||
echo
|
||||
Log "command is still running, sending $signal signal"
|
||||
eval "$killcode"
|
||||
tcfNOK 255
|
||||
echo 255 > $ec
|
||||
let timeout_t+=killtimeout
|
||||
signal=KILL
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
rm -f $ec
|
||||
else
|
||||
eval "$command" 2> >(tee $errout)
|
||||
local res=$?
|
||||
fi
|
||||
LogMoreLow -f "got '$res'"
|
||||
local resmatch=$(echo "$expecode" | grep "^\!\?${res}$")
|
||||
LogMoreLow -f "resmatch='$resmatch'"
|
||||
[[ -n "$resmatch" && ! "$resmatch" =~ '!' ]]
|
||||
if tcfE2R; then
|
||||
! grep -iq "command not found" $errout || { failtag='WARNING'; tcfNOK; }
|
||||
else
|
||||
Log "Expected result was '$orig_expecode', got '$res'!"
|
||||
fi
|
||||
tcfFin ${failtag:+--fail-tag "$failtag"}; }
|
||||
rm -f $errout
|
||||
[[ -z "$allowskip" ]] && tcfFin
|
||||
LogMore_ -f "end $*"
|
||||
return $res
|
||||
}; # end of tcfRun }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for logging
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfAssert0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
tcfAssert0() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
local RES="${3:-FAIL}"
|
||||
[[ $2 -eq 0 ]] && RES='PASS'
|
||||
Log "$1" $RES
|
||||
LogMoreLow -f "end"
|
||||
}; # end of tcfAssert0 }}}
|
||||
|
||||
|
||||
# tcfCheckFinal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfCheckFinal
|
||||
|
||||
Check that all tcfTry / tcfChk functions have been close by tcfFin.
|
||||
|
||||
tcfCheckFinal
|
||||
|
||||
=cut
|
||||
|
||||
tcfCheckFinal() {
|
||||
tcfAssert0 "Check that TCF block cache is empty" ${#__INTERNAL_tcf_current_level_data[@]}
|
||||
tcfAssert0 "Check that TCF current level is 0" $__INTERNAL_tcf_current_level_val
|
||||
}; # end of tcfCheckFinal }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Self check functions
|
||||
|
||||
=cut
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# tcfSelfCheck {{{
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfSelfCheck
|
||||
|
||||
Does some basic functionality tests.
|
||||
|
||||
tcfSelfCheck
|
||||
|
||||
The function is called also by the following command:
|
||||
|
||||
./lib.sh selfcheck
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
tcfSelfCheck() {
|
||||
tcfChk "check 1" &&{
|
||||
tcfTry "try 1.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 1.2 - false" &&{
|
||||
false
|
||||
tcfFin;}
|
||||
tcfTry "try 1.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfChk "check 2" &&{
|
||||
tcfTry "try 2.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 2.2 - true - ignore" &&{
|
||||
true
|
||||
tcfFin -i;}
|
||||
tcfTry "try 2.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfChk "check 3" &&{
|
||||
tcfTry "try 3.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 3.2 - false - ignore" &&{
|
||||
false
|
||||
tcfFin -i;}
|
||||
tcfTry "try 3.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfCheckFinal
|
||||
tcfAssert0 "Overall result" $(tcfRES -p)
|
||||
LogReport
|
||||
}
|
||||
if [[ "$1" == "selfcheck" ]]; then
|
||||
tcfSelfCheck
|
||||
fi; # end of tcfSelfCheck }}}
|
||||
|
||||
|
||||
# tcfLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
tcfLibraryLoaded() {
|
||||
rlImport distribution/Log
|
||||
declare -F rlDie > /dev/null && {
|
||||
#rlJournalStart
|
||||
#rlPhaseStartSetup "TCF"
|
||||
echo -e "\nrunning inside the beakerlib - using rlAssert0"
|
||||
true; tcfAssert0() {
|
||||
local text="$1"
|
||||
[[ "$3" != "FAIL" && "$3" != "PASS" ]] && text="$text - $3"
|
||||
__INTERNAL_ConditionalAssert "$text" "$2"
|
||||
}
|
||||
__INTERNAL_tcf_do_hack
|
||||
#rlPhaseEnd
|
||||
#rlJournalEnd
|
||||
};
|
||||
if declare -F rlE2R >& /dev/null; then
|
||||
__INTERNAL_tcf_kill_old_plugin
|
||||
fi
|
||||
true
|
||||
}; # end of tcfLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
|
60
tests/run-as/distribution/Library/testUser/Makefile
Normal file
60
tests/run-as/distribution/Library/testUser/Makefile
Normal file
@ -0,0 +1,60 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/testUser
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/testUser
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Setup/cleanup standard testing user." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/testUser)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
234
tests/run-as/distribution/Library/testUser/lib.sh
Normal file
234
tests/run-as/distribution/Library/testUser/lib.sh
Normal file
@ -0,0 +1,234 @@
|
||||
#!/bin/bash
|
||||
# try-check-final.sh
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = testUser
|
||||
# library-version = 7
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library testUser
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provide s function for maintaining testing users.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/testUser and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/testUser)" >> $(METADATA)
|
||||
|
||||
=head1 VARIABLES
|
||||
|
||||
=over
|
||||
|
||||
=item testUser
|
||||
|
||||
Array of testing user login names.
|
||||
|
||||
=item testUserPasswd
|
||||
|
||||
Array of testing users passwords.
|
||||
|
||||
=item testUserUID
|
||||
|
||||
Array of testing users UIDs.
|
||||
|
||||
=item testUserGID
|
||||
|
||||
Array of testing users primary GIDs.
|
||||
|
||||
=item testUserGroup
|
||||
|
||||
Array of testing users primary group names.
|
||||
|
||||
=item testUserGIDs
|
||||
|
||||
Array of space separated testing users all GIDs.
|
||||
|
||||
=item testUserGroups
|
||||
|
||||
Array of space separated testing users all group names.
|
||||
|
||||
=item testUserGecos
|
||||
|
||||
Array of testing users gecos fields.
|
||||
|
||||
=item testUserHomeDir
|
||||
|
||||
Array of testing users home directories.
|
||||
|
||||
=item testUserShell
|
||||
|
||||
Array of testing users default shells.
|
||||
|
||||
=back
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library testUser... "
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 testUserSetup, testUserCleanup
|
||||
|
||||
Creates/removes testing user(s).
|
||||
|
||||
rlPhaseStartSetup
|
||||
testUserSetup [NUM]
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
testUserCleanup
|
||||
rlPhaseEnd
|
||||
|
||||
=over
|
||||
|
||||
=item NUM
|
||||
|
||||
Optional number of user to be created. If not specified one user is created.
|
||||
|
||||
=back
|
||||
|
||||
Returns 0 if success.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
testUserSetup() {
|
||||
# parameter dictates how many users should be created, defaults to 1
|
||||
local res=0
|
||||
local count_created=0
|
||||
local count_wanted=${1:-"1"}
|
||||
local index=0
|
||||
(( $count_wanted < 1 )) && return 1
|
||||
|
||||
while (( $count_created != $count_wanted ));do
|
||||
let index++
|
||||
local newUser="testuser${index}"
|
||||
local newUserPasswd="redhat"
|
||||
id "$newUser" &> /dev/null && continue # if user with the name exists, try again
|
||||
|
||||
# create
|
||||
useradd -m $newUser >&2 || ((res++))
|
||||
echo "$newUserPasswd" | passwd --stdin $newUser || ((res++))
|
||||
|
||||
# save the users array
|
||||
testUser+=($newUser)
|
||||
testUserPasswd+=($newUserPasswd)
|
||||
set | grep "^testUser=" > $__INTERNAL_testUser_users_file
|
||||
set | grep "^testUserPasswd=" >> $__INTERNAL_testUser_users_file
|
||||
((count_created++))
|
||||
done
|
||||
__INTERNAL_testUserRefillInfo || ((res++))
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
__INTERNAL_testUserRefillInfo() {
|
||||
local res=0
|
||||
local user
|
||||
testUserUID=()
|
||||
testUserGID=()
|
||||
testUserGroup=()
|
||||
testUserGIDs=()
|
||||
testUserGroups=()
|
||||
testUserGecos=()
|
||||
testUserHomeDir=()
|
||||
testUserShell=()
|
||||
|
||||
for user in ${testUser[@]}; do
|
||||
local ent_passwd=$(getent passwd ${user}) || ((res++))
|
||||
local users_id="$(id ${user})" || ((res++))
|
||||
# testUser is filled during user creation - already present
|
||||
# testUserPasswd is saved same way as testUser - already present
|
||||
testUserUID+=("$(echo "$ent_passwd" | cut -d ':' -f 3)")
|
||||
testUserGID+=("$(echo "$ent_passwd" | cut -d ':' -f 4)")
|
||||
testUserGroup+=("$(echo "$users_id" | sed -r 's/.*gid=(\S+).*/\1/;s/[[:digit:]]+\(//g;s/\)//g;s/,/ /g')")
|
||||
testUserGIDs+=("$(echo "$users_id" | sed -r 's/.*groups=(\S+).*/\1/;s/\([^\)]+\)//g;s/\)//g;s/,/ /g')")
|
||||
testUserGroups+=("$(echo "$users_id" | sed -r 's/.*groups=(\S+).*/\1/;s/[[:digit:]]+\(//g;s/\)//g;s/,/ /g')")
|
||||
testUserGecos+=("$(echo "$ent_passwd" | cut -d ':' -f 5)")
|
||||
testUserHomeDir+=("$(echo "$ent_passwd" | cut -d ':' -f 6)")
|
||||
testUserShell+=("$(echo "$ent_passwd" | cut -d ':' -f 7)")
|
||||
done
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
testUserCleanup() {
|
||||
local res=0
|
||||
for user in ${testUser[@]}; do
|
||||
userdel -rf "$user" >&2 || ((res++))
|
||||
done
|
||||
unset testUser
|
||||
__INTERNAL_testUserRefillInfo
|
||||
rm -f $__INTERNAL_testUser_users_file >&2 || ((res++))
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
|
||||
# testUserLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
testUserLibraryLoaded() {
|
||||
local res=0
|
||||
# necessary init steps
|
||||
__INTERNAL_testUser_users_file="$BEAKERLIB_DIR/users"
|
||||
|
||||
# try to fill in users array with previous data
|
||||
[[ -f ${__INTERNAL_testUser_users_file} ]] && . ${__INTERNAL_testUser_users_file} >&2
|
||||
__INTERNAL_testUserRefillInfo >&2 || ((res++))
|
||||
|
||||
[[ $res -eq 0 ]]
|
||||
}; # end of testUserLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
echo "done."
|
||||
|
163
tests/run-as/runtest.sh
Executable file
163
tests/run-as/runtest.sh
Executable file
@ -0,0 +1,163 @@
|
||||
#!/bin/bash
|
||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# runtest.sh of /CoreOS/sudo/Sanity/run-as
|
||||
# Description: Test feature 'run as'. This means -u, -g options.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2017 Red Hat, Inc.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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-1151, USA.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
# Include Beaker environment
|
||||
. /usr/bin/rhts-environment.sh || exit 1
|
||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||||
|
||||
PACKAGE="sudo"
|
||||
|
||||
rlJournalStart && {
|
||||
rlPhaseStartSetup && {
|
||||
[[ -z "$BEAKERLIB_LIBRARY_PATH" ]] && BEAKERLIB_LIBRARY_PATH="`dirname "$(readlink -f "$0")"`"
|
||||
rlRun "rlImport --all" 0 "Import libraries" || rlDie "cannot continue"
|
||||
tcfRun "rlCheckMakefileRequires"
|
||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
||||
CleanupRegister "rlRun 'rm -r $TmpDir' 0 'Removing tmp directory'"
|
||||
CleanupRegister 'rlRun "popd"'
|
||||
rlRun "pushd $TmpDir"
|
||||
CleanupRegister 'tcfRun "testUserCleanup"'
|
||||
tcfRun "testUserSetup 5"
|
||||
CleanupRegister 'rlRun "rlFileRestore"'
|
||||
rlRun "rlFileBackup --clean /etc/sudoers.d"
|
||||
cat > /etc/sudoers.d/testing << EOF
|
||||
Defaults !requiretty
|
||||
$testUser ALL = (ALL:ALL) NOPASSWD: ALL
|
||||
${testUser[1]} ALL = ( ${testUser[0]} ) NOPASSWD: ALL
|
||||
${testUser[2]} ALL = ( ${testUser[0]}, ${testUser[1]} ) NOPASSWD: ALL
|
||||
${testUser[3]} ALL = ( : ${testUserGroup[1]}, ${testUser[0]} ) NOPASSWD: ALL
|
||||
${testUser[4]} ALL = ( ${testUser[0]} : ${testUserGroup[2]} ) NOPASSWD: ALL
|
||||
EOF
|
||||
rlRun "cat /etc/sudoers.d/testing"
|
||||
rlPhaseEnd; }
|
||||
|
||||
CMD='bash -c "ps -o user:15,group:15,ruser:15,rgroup:15,args --ppid $$"'
|
||||
|
||||
tcfTry "Tests" --no-assert && {
|
||||
test() {
|
||||
local who="$1" as="$2" as_grp="$3" exp_res="$4"
|
||||
if [[ -z "$exp_res" || "$exp_res" == "0" ]]; then
|
||||
rlRun -s "su -l $who -c 'sudo ${as:+-u $as} ${as_grp:+-g $as_grp} $CMD'"
|
||||
[[ -n "$as_grp" && -z "$as" ]] && as="$who"
|
||||
as="${as:-root}"
|
||||
as_grp="${as_grp:-$as}"
|
||||
rlAssertGrep "$as\s+$as_grp\s+$as\s+$as_grp\s+" $rlRun_LOG -Eq
|
||||
rm -f $rlRun_LOG
|
||||
else
|
||||
rlRun -s "su -l $who -c 'sudo ${as:+-u $as} ${as_grp:+-g $as_grp} $CMD'" 1
|
||||
[[ -n "$as_grp" && -z "$as" ]] && as="$who"
|
||||
as="${as:-root}"
|
||||
as_grp="${as_grp:-$as}"
|
||||
rlAssertNotGrep "$as\s+$as_grp\s+$as\s+$as_grp\s+" $rlRun_LOG -Eq
|
||||
rm -f $rlRun_LOG
|
||||
fi
|
||||
}
|
||||
rlPhaseStartTest "run as a default user" && {
|
||||
tcfChk "Test phase" && {
|
||||
tcfChk "$testUser can run as all" && {
|
||||
test $testUser "" "" "" 0
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[1]} cannot run as anyone" && {
|
||||
test ${testUser[1]} "" "" 1
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[2]} cannot run as anyone" && {
|
||||
test ${testUser[2]} "" "" 1
|
||||
tcfFin; }
|
||||
tcfFin; }
|
||||
rlPhaseEnd; }
|
||||
|
||||
rlPhaseStartTest "run as a user (-u)" && {
|
||||
tcfChk "Test phase" && {
|
||||
tcfChk "$testUser can run as all" && {
|
||||
test $testUser "root" "" 0
|
||||
test $testUser "${testUser[1]}" "" 0
|
||||
test $testUser "${testUser[2]}" "" 0
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[1]} can run as $testUser" && {
|
||||
test ${testUser[1]} "root" "" 1
|
||||
test ${testUser[1]} "${testUser[0]}" "" 0
|
||||
test ${testUser[1]} "${testUser[2]}" "" 1
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[2]} can run as $testUser and ${testUser[1]}" && {
|
||||
test ${testUser[2]} "root" "" 1
|
||||
test ${testUser[2]} "${testUser[0]}" "" 0
|
||||
test ${testUser[2]} "${testUser[1]}" "" 0
|
||||
tcfFin; }
|
||||
tcfFin; }
|
||||
rlPhaseEnd; }
|
||||
|
||||
rlPhaseStartTest "run as a group (-g)" && {
|
||||
tcfChk "Test phase" && {
|
||||
tcfChk "$testUser can run as all" && {
|
||||
test $testUser "" "root" 0
|
||||
test $testUser "" "${testUserGroup[1]}" 0
|
||||
test $testUser "" "${testUserGroup[2]}" 0
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[4]} can run as ${testUserGroup[2]}" && {
|
||||
test ${testUser[4]} "" "root" 1
|
||||
test ${testUser[4]} "" "${testUserGroup[0]}" 1
|
||||
test ${testUser[4]} "" "${testUserGroup[2]}" 0
|
||||
tcfFin; }
|
||||
#tcfChk "${testUser[2]} can run as ${testUserGroup[1]}" && {
|
||||
# test ${testUser[2]} "" "root" 1
|
||||
# test ${testUser[2]} "" "${testUserGroup[1]}" 1
|
||||
# test ${testUser[2]} "" "${testUserGroup[2]}" 1
|
||||
#tcfFin; }
|
||||
#tcfChk "${testUser[3]}" && {
|
||||
# test ${testUser[2]} "" "root" 1
|
||||
# test ${testUser[2]} "" "${testUserGroup[1]}" 0
|
||||
# test ${testUser[2]} "" "${testUserGroup[2]}" 0
|
||||
#tcfFin; }
|
||||
tcfFin; }
|
||||
rlPhaseEnd; }
|
||||
|
||||
rlPhaseStartTest "run as both user (-u) and group (-g)" && {
|
||||
tcfChk "Test phase" && {
|
||||
tcfChk "$testUser can run as all" && {
|
||||
test $testUser "${testUser[1]}" "root" 0
|
||||
test $testUser "${testUser[2]}" "${testUserGroup[1]}" 0
|
||||
test $testUser "${testUser[1]}" "${testUserGroup[2]}" 0
|
||||
tcfFin; }
|
||||
tcfChk "${testUser[4]} can run as ${testUser[0]} ${testUserGroup[2]}" && {
|
||||
test ${testUser[4]} "${testUser[0]}" "root" 1
|
||||
test ${testUser[4]} "${testUser[0]}" "${testUserGroup[0]}" 0
|
||||
#test ${testUser[4]} "${testUser[0]}" "${testUserGroup[4]}" 0
|
||||
test ${testUser[4]} "${testUser[4]}" "${testUserGroup[4]}" 0
|
||||
test ${testUser[4]} "${testUser[0]}" "${testUserGroup[3]}" 1
|
||||
test ${testUser[4]} "${testUser[0]}" "${testUserGroup[2]}" 0
|
||||
tcfFin; }
|
||||
tcfFin; }
|
||||
rlPhaseEnd; }
|
||||
tcfFin; }
|
||||
|
||||
rlPhaseStartCleanup && {
|
||||
CleanupDo
|
||||
tcfCheckFinal
|
||||
rlPhaseEnd; }
|
||||
rlJournalPrintText
|
||||
rlJournalEnd; }
|
67
tests/sudoers-options-sanity-test/Makefile
Normal file
67
tests/sudoers-options-sanity-test/Makefile
Normal file
@ -0,0 +1,67 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /CoreOS/sudo/Sanity/sudoers-options-sanity-test
|
||||
# Description: This sanity test checks pre-defined (some are commented) options (examples) in sudoers file.
|
||||
# Author: Ales Marecek <amarecek@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/CoreOS/sudo/Sanity/sudoers-options-sanity-test
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Ales Marecek <amarecek@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/tcf)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Cleanup)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/testUser)" >> $(METADATA)
|
||||
@echo "Description: This sanity test checks pre-defined (some are commented) options (examples) in sudoers file." >> $(METADATA)
|
||||
@echo "Type: Sanity" >> $(METADATA)
|
||||
@echo "TestTime: 30m" >> $(METADATA)
|
||||
@echo "RunFor: sudo" >> $(METADATA)
|
||||
@echo "Requires: sudo grep coreutils" >> $(METADATA)
|
||||
@echo "Priority: Normal" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
@echo "Confidential: no" >> $(METADATA)
|
||||
@echo "Destructive: no" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
3
tests/sudoers-options-sanity-test/PURPOSE
Normal file
3
tests/sudoers-options-sanity-test/PURPOSE
Normal file
@ -0,0 +1,3 @@
|
||||
PURPOSE of /CoreOS/sudo/Sanity/sudoers-options-sanity-test
|
||||
Description: This sanity test checks pre-defined (some are commented) options (examples) in sudoers file.
|
||||
Author: Ales Marecek <amarecek@redhat.com>
|
@ -0,0 +1,59 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/Cleanup
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/Cleanup
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides function to define cleanup stack which can do its work at any time of the test run." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/Cleanup)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,314 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = Cleanup
|
||||
# library-version = 9
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_Cleanup_LIB_VERSION=9
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Cleanup
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This file contains functions which provides cleanup stack functionality.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/Cleanup and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/Cleanup)" >> $(METADATA)
|
||||
|
||||
B<Code example>
|
||||
|
||||
rlJournalStart
|
||||
rlPhaseStartSetup
|
||||
rlImport 'distribution/Cleanup'
|
||||
tmp=$(mktemp)
|
||||
CleanupRegister "
|
||||
rlLog 'Removing data'
|
||||
rlRun \"rm -f ${tmp}\"
|
||||
"
|
||||
rlLog 'Creating some data'
|
||||
rlRun "echo 'asdfalkjh' > $tmp"
|
||||
|
||||
CleanupRegister "
|
||||
rlLog 'just something to demonstrate unregistering'
|
||||
"
|
||||
ID1=$CleanupRegisterID
|
||||
CleanupUnregister $ID1
|
||||
|
||||
CleanupRegister "
|
||||
rlLog 'just something to demonstrate partial cleanup'
|
||||
"
|
||||
ID2=$CleanupRegisterID
|
||||
CleanupRegister "rlLog 'cleanup some more things'"
|
||||
# cleanup everything upto ID2
|
||||
CleanupDo $ID2
|
||||
|
||||
CleanupRegister --mark "
|
||||
rlLog 'yet another something to demonstrate partial cleanup using internal ID saving'
|
||||
"
|
||||
CleanupRegister "rlLog 'cleanup some more things'"
|
||||
# cleanup everything upto last mark
|
||||
CleanupDo --mark
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
CleanupDo
|
||||
rlPhaseEnd
|
||||
|
||||
rlJournalPrintText
|
||||
rlJournalEnd
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library Cleanup v$__INTERNAL_Cleanup_LIB_VERSION... "
|
||||
|
||||
__INTERNAL_Cleanup_stack_file="$BEAKERLIB_DIR/Cleanup_stack"
|
||||
touch "$__INTERNAL_Cleanup_stack_file"
|
||||
chmod ug+rw "$__INTERNAL_Cleanup_stack_file"
|
||||
|
||||
# CleanupRegister ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# CleanupRegister [--mark] CLEANUP_CODE
|
||||
# --mark - also mark this position
|
||||
CleanupRegister() {
|
||||
local mark=0
|
||||
[[ "$1" == "--mark" ]] && {
|
||||
mark=1
|
||||
shift
|
||||
}
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
CleanupRegisterID="${RANDOM}$(date +"%s%N")"
|
||||
echo -n "Registering cleanup ID=$CleanupRegisterID" >&2
|
||||
if [[ $mark -eq 1 ]]; then
|
||||
__INTERNAL_CleanupMark=( "$CleanupRegisterID" "${__INTERNAL_CleanupMark[@]}" )
|
||||
echo -n " with mark" >&2
|
||||
fi
|
||||
echo " '$1'" >&2
|
||||
rlLogDebug "prepending '$1'"
|
||||
local ID_tag="# ID='$CleanupRegisterID'"
|
||||
__INTERNAL_Cleanup_stack="$ID_tag
|
||||
$1
|
||||
$ID_tag
|
||||
$__INTERNAL_Cleanup_stack"
|
||||
if ! CleanupSetStack "$__INTERNAL_Cleanup_stack"; then
|
||||
rlLogError "an error occured while registering the cleanup '$1'"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}; # end of CleanupRegister }}}
|
||||
|
||||
|
||||
# __INTERNAL_Cleanup_get_stack_part ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# 1: ID
|
||||
# -ID - everything upto the ID
|
||||
# 2: '' - return ID only
|
||||
# 'rest' - return exact oposit
|
||||
__INTERNAL_Cleanup_get_stack_part() {
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): $* begin"
|
||||
local ID="$1"
|
||||
local n='1 0 1'
|
||||
local stack=''
|
||||
[[ "${ID:0:1}" == "-" ]] && {
|
||||
ID="${ID:1}"
|
||||
n='0 0 1'
|
||||
}
|
||||
[[ "$2" == "rest" ]] && {
|
||||
n="$(echo "${n//0/2}")"
|
||||
n="$(echo "${n//1/0}")"
|
||||
n="$(echo "${n//2/1}")"
|
||||
}
|
||||
n=($n)
|
||||
[[ -n "$DEBUG" ]] && rlLogDebug "$(set | grep ^n=)"
|
||||
local ID_tag="# ID='$ID'"
|
||||
while IFS= read -r line; do
|
||||
|
||||
[[ "$line" == "$ID_tag" ]] && {
|
||||
n=( "${n[@]:1}" )
|
||||
continue
|
||||
}
|
||||
if [[ $n -eq 0 ]]; then
|
||||
stack="$stack
|
||||
$line"
|
||||
fi
|
||||
done < <(echo "$__INTERNAL_Cleanup_stack")
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): cleanup stack part is '${stack:1}'"
|
||||
echo "${stack:1}"
|
||||
rlLogDebug "__INTERNAL_Cleanup_get_stack_part(): $* end"
|
||||
}; # end of __INTERNAL_Cleanup_get_stack_part }}}
|
||||
|
||||
# CleanupUnregister ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupUnregister() {
|
||||
local ID="$1"
|
||||
rlLog "Unregistering cleanup ID='$ID'"
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
rlLogDebug "removing ID='$ID'"
|
||||
if ! CleanupSetStack "$(__INTERNAL_Cleanup_get_stack_part "$ID" 'rest')"; then
|
||||
rlLogError "an error occured while registering the cleanup '$1'"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}; # end of CleanupUnregister }}}
|
||||
|
||||
|
||||
# CleanupMark ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_CleanupMark=()
|
||||
CleanupMark() {
|
||||
echo -n "Setting cleanup mark" >&2
|
||||
CleanupRegister --mark '' 2>/dev/null
|
||||
local res=$?
|
||||
echo " ID='$CleanupRegisterID'" >&2
|
||||
return $res
|
||||
}; # end of CleanupMark }}}
|
||||
|
||||
|
||||
# CleanupDo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# 1: '' - cleanup all
|
||||
# ID - cleanup ID only
|
||||
# -ID - cleanup all upto ID, including
|
||||
# mark - cleanup all unto last mark, including
|
||||
CleanupDo() {
|
||||
local ID="$1"
|
||||
if ! CleanupGetStack; then
|
||||
rlLogError "cannot continue, could not get cleanup stack"
|
||||
return 1
|
||||
fi
|
||||
local res tmp newstack=''
|
||||
tmp="$(mktemp)"
|
||||
if [[ "$ID" == "mark" || "$ID" == "--mark" ]]; then
|
||||
echo "execute cleanup upto mark='$__INTERNAL_CleanupMark'" >&2
|
||||
__INTERNAL_Cleanup_get_stack_part "-$__INTERNAL_CleanupMark" | grep -v "^# ID='" > "$tmp"
|
||||
newstack="$(__INTERNAL_Cleanup_get_stack_part "-$__INTERNAL_CleanupMark" 'rest')"
|
||||
__INTERNAL_CleanupMark=("${__INTERNAL_CleanupMark[@]:1}")
|
||||
elif [[ -n "$ID" ]]; then
|
||||
echo "execute cleanup for ID='$ID'" >&2
|
||||
__INTERNAL_Cleanup_get_stack_part "$ID" | grep -v "^# ID='" > "$tmp"
|
||||
newstack="$(__INTERNAL_Cleanup_get_stack_part "$ID" 'rest')"
|
||||
else
|
||||
CleanupTrapUnhook
|
||||
trap "echo 'temporarily blocking ctrl+c until cleanup is done' >&2" SIGINT
|
||||
cat "$__INTERNAL_Cleanup_stack_file" | grep -v "^# ID='" > "$tmp"
|
||||
echo "execute whole cleanup stack" >&2
|
||||
fi
|
||||
. "$tmp"
|
||||
res=$?
|
||||
[[ $res -ne 0 ]] && {
|
||||
echo "cleanup code:" >&2
|
||||
cat -n "$tmp" >&2
|
||||
}
|
||||
rm -f "$tmp"
|
||||
echo "cleanup execution done" >&2
|
||||
if [[ -z "$ID" ]]; then
|
||||
trap - SIGINT
|
||||
fi
|
||||
if ! CleanupSetStack "$newstack"; then
|
||||
rlLogError "an error occured while cleaning the stack"
|
||||
return 1
|
||||
fi
|
||||
return $res
|
||||
}; # end of CleanupDo }}}
|
||||
|
||||
|
||||
# CleanupGetStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupGetStack() {
|
||||
rlLogDebug "getting cleanup stack"
|
||||
if [[ -r "$__INTERNAL_Cleanup_stack_file" ]]; then
|
||||
if __INTERNAL_Cleanup_stack="$(cat "$__INTERNAL_Cleanup_stack_file")"; then
|
||||
rlLogDebug "cleanup stack is '$__INTERNAL_Cleanup_stack'"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
rlLogError "could not load cleanup stack"
|
||||
return 1
|
||||
}; # end of CleanupGetStack }}}
|
||||
|
||||
|
||||
# CleanupSetStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupSetStack() {
|
||||
rlLogDebug "setting cleanup stack to '$1'"
|
||||
__INTERNAL_Cleanup_stack="$1"
|
||||
if echo "$__INTERNAL_Cleanup_stack" > "$__INTERNAL_Cleanup_stack_file"; then
|
||||
rlLogDebug "cleanup stack is now '$__INTERNAL_Cleanup_stack'"
|
||||
return 0
|
||||
fi
|
||||
rlLogError "could not set cleanup stack"
|
||||
return 1
|
||||
}; # end of CleanupSetStack }}}
|
||||
|
||||
|
||||
__INTERNAL_Cleanup_signals=''
|
||||
__INTERNAL_Cleanup_trap_code='rlJournalStart; rlPhaseStartCleanup; CleanupDo; rlPhaseEnd; rlJournalPrintText; rlJournalEnd; exit'
|
||||
# CleanupTrapHook ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupTrapHook() {
|
||||
rlLog "register cleanup trap"
|
||||
__INTERNAL_Cleanup_signals="${1:-"SIGHUP SIGINT SIGTERM EXIT"}"
|
||||
eval "trap \"${__INTERNAL_Cleanup_trap_code}\" $__INTERNAL_Cleanup_signals"
|
||||
}; # end of CleanupTrapHook }}}
|
||||
|
||||
|
||||
# CleanupTrapUnhook ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupTrapUnhook() {
|
||||
if [[ -n "$__INTERNAL_Cleanup_signals" ]]; then
|
||||
rlLog "unregister cleanup trap"
|
||||
eval trap - $__INTERNAL_Cleanup_signals
|
||||
__INTERNAL_Cleanup_signals=''
|
||||
fi
|
||||
}; # end of CleanupTrapUnhook }}}
|
||||
|
||||
|
||||
# CleanupLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
CleanupLibraryLoaded() {
|
||||
CleanupTrapHook
|
||||
}; # end of CleanupLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
@ -0,0 +1,59 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/ConditionalPhases
|
||||
# Description: Implements conditional phases.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/ConditionalPhases
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Implements conditional phases." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,166 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = ConditionalPhases
|
||||
# library-version = 2
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_ConditionalPhases_LIB_VERSION=2
|
||||
__INTERNAL_ConditionalPhases_LIB_NAME='distribution/ConditionalPhases'
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library distribution/condpahses
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Implements conditional phases to eficiently select test phases to be execute
|
||||
using white and black lists.
|
||||
|
||||
To use this functionality you need to import library
|
||||
distribution/ConditionalPhases and add following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/ConditionalPhases)" >> $(METADATA)
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
=head2 Conditional phases
|
||||
|
||||
Each test phase can be conditionally skipped based on a bash regular expression
|
||||
given in CONDITIONAL_PHASES_BL and/or CONDITIONAL_PHASES_WL variables.
|
||||
|
||||
=over
|
||||
|
||||
=item CONDITIONAL_PHASES_BL
|
||||
|
||||
It is a black list. If match phase name the respective phase should be skipped.
|
||||
|
||||
=item CONDITIONAL_PHASES_WL
|
||||
|
||||
It is a white list. If does B<not> match phase name the respective phase should
|
||||
be skipped excluding phases contatning 'setup' or 'cleanup' in its name. Names
|
||||
'setup' and 'cleanup' are matched case insenitively.
|
||||
|
||||
=back
|
||||
|
||||
Actual skipping has to be done in the test case itself by using return code of
|
||||
functions I<rlPhaseStart>, I<rlPhaseStartSetup>, I<rlPhaseStartTest>, and
|
||||
I<rlPhaseStartCleanup>.
|
||||
|
||||
Example:
|
||||
|
||||
rlPhaseStartTest "phase name" && {
|
||||
...
|
||||
rlPhaseEnd; }
|
||||
|
||||
Evaluation of the phase relevancy works as follows:
|
||||
1. If CONDITIONAL_PHASES_BL is non-empty and matches phase name => return 2.
|
||||
2. If phase name contains word 'setup' or 'cleanup' or CONDITIONAL_PHASES_WL
|
||||
is empty => return 0.
|
||||
3. If CONDITIONAL_PHASES_WL is non-empty and matches phase name => return 0
|
||||
otherwise return 1.
|
||||
|
||||
Normaly Setup and Cleanup phases are not skipped unless hey are B<explicitly>
|
||||
black-listed.
|
||||
|
||||
To make the test work properly with conditional phases it is necessary to
|
||||
surround phase code with curly brackets and make it conditionally executed
|
||||
based on rlPhaseStart* function's exit code the same way as it is demostrated in
|
||||
the example above. To make the process easy you can use following command:
|
||||
|
||||
sed 's/rlPhaseStart[^{]*$/& \&\& {/;s/rlPhaseEnd[^}]*$/&; }/'
|
||||
|
||||
This code can be embedded in Makefile by modifying build target to following
|
||||
form:
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
grep -Eq 'rlPhase(Start[^{]*|End[^}]*)$' runtest.sh && sed -i 's/rlPhaseStart[^{]*$/& \&\& {/;s/rlPhaseEnd[^}]*$/&; }/' testrun.sh
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
|
||||
=cut
|
||||
#'
|
||||
echo -n "loading library $__INTERNAL_ConditionalPhases_LIB_NAME v$__INTERNAL_ConditionalPhases_LIB_VERSION... "
|
||||
|
||||
|
||||
# ConditionalPhasesLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
ConditionalPhasesLibraryLoaded() {
|
||||
if [[ -n "$CONDITIONAL_PHASES_BL" || -n "$CONDITIONAL_PHASES_WL" ]]; then
|
||||
__INTERNAL_ConditionalPhases_eval() {
|
||||
# check phases black-list
|
||||
[[ -n "$CONDITIONAL_PHASES_BL" && "$1" =~ $CONDITIONAL_PHASES_BL ]] && {
|
||||
rlLogWarning "phase '$1' should be skipped as it is defined in \$CONDITIONAL_PHASES_BL='$CONDITIONAL_PHASES_BL'"
|
||||
return 2
|
||||
}
|
||||
# always execute Setup, Cleanup and if no PHASES (white-list) specified
|
||||
[[ "$1" =~ $(echo "\<[Ss][Ee][Tt][Uu][Pp]\>") || "$1" =~ $(echo "\<[Cc][Ll][Ee][Aa][Nn][Uu][Pp]\>") ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as 'setup' and 'cleanup' phases are allowed by default, these can be black-listed"
|
||||
return 0
|
||||
}
|
||||
[[ -z "$CONDITIONAL_PHASES_WL" ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as there is no rule for it"
|
||||
return 0
|
||||
}
|
||||
[[ "$1" =~ $CONDITIONAL_PHASES_WL ]] && {
|
||||
rlLogInfo "phase '$1' will be executed as it is defined in \$CONDITIONAL_PHASES_WL='$CONDITIONAL_PHASES_WL'"
|
||||
return 0
|
||||
} || {
|
||||
rlLogWarning "phase '$1' should be skipped as it is not defined in \$CONDITIONAL_PHASES_WL='$CONDITIONAL_PHASES_WL'"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
rlLogInfo "replacing rlPhaseStart by modified function with conditional phases implemented"
|
||||
:; rlPhaseStart() {
|
||||
if [ "x$1" = "xFAIL" -o "x$1" = "xWARN" ] ; then
|
||||
__INTERNAL_ConditionalPhases_eval "$2" && \
|
||||
rljAddPhase "$1" "$2"
|
||||
return $?
|
||||
else
|
||||
rlLogError "rlPhaseStart: Unknown phase type: $1"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
else
|
||||
rlLogInfo "Neither CONDITIONAL_PHASES_WL nor CONDITIONAL_PHASES_BL is defined, not applying modifications"
|
||||
fi
|
||||
}; # end of ConditionalPhasesLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
echo 'done.'
|
@ -0,0 +1,48 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/Log
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/Log
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides yet another logging facility that does not rely on beakerlib while it can integrate with it." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/opts)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,637 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = Log
|
||||
# library-version = 11
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_Log_LIB_VERSION=11
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Log
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provide logging capability which does not rely on beakerlib so it
|
||||
can be used standalone.
|
||||
|
||||
If it is used within beakerlib it automatically bypass all messages to the
|
||||
beakerlib.
|
||||
|
||||
Also this library provide journaling feature so the summary can be printed out
|
||||
at the end.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/Log and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library Log v$__INTERNAL_Log_LIB_VERSION... "
|
||||
|
||||
|
||||
__INTERNAL_Log_prefix=''
|
||||
__INTERNAL_Log_prefix2=''
|
||||
__INTERNAL_Log_postfix=''
|
||||
__INTERNAL_Log_default_level=3
|
||||
__INTERNAL_Log_level=$__INTERNAL_Log_default_level
|
||||
LogSetDebugLevel() {
|
||||
if [[ -n "$1" ]]; then
|
||||
if [[ "$1" =~ ^[0-9]+$ ]]; then
|
||||
let __INTERNAL_Log_level=$__INTERNAL_Log_default_level+$1;
|
||||
else
|
||||
__INTERNAL_Log_level=255
|
||||
fi
|
||||
else
|
||||
__INTERNAL_Log_level=$__INTERNAL_Log_default_level
|
||||
fi
|
||||
}
|
||||
LogSetDebugLevel "$DEBUG"
|
||||
let __INTERNAL_Log_level_LOG=0
|
||||
let __INTERNAL_Log_level_FATAL=0
|
||||
let __INTERNAL_Log_level_ERROR=1
|
||||
let __INTERNAL_Log_level_WARNING=2
|
||||
let __INTERNAL_Log_level_INFO=3
|
||||
let __INTERNAL_Log_level_DEBUG=4
|
||||
let __INTERNAL_Log_level_MORE=5
|
||||
let __INTERNAL_Log_level_MORE_=$__INTERNAL_Log_level_MORE+1
|
||||
let __INTERNAL_Log_level_MORE__=$__INTERNAL_Log_level_MORE_+1
|
||||
let __INTERNAL_Log_level_MORE___=$__INTERNAL_Log_level_MORE__+1
|
||||
|
||||
# Log ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
Log() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
local pri=$2 message="${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
if [[ -n "$pri" ]]; then
|
||||
LogPrintMessage "$pri" "$message"
|
||||
LogjAddMessage "$pri" "$message"
|
||||
else
|
||||
LogPrintMessage "$(date +%H:%M:%S)" "$message"
|
||||
LogjAddMessage "INFO" "$message"
|
||||
fi
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of Log }}}
|
||||
|
||||
|
||||
__INTERNAL_Log_condition() {
|
||||
cat <<EOF
|
||||
__INTERNAL_Log_level_do=$1
|
||||
if [[ \$__INTERNAL_Log_level -ge \$__INTERNAL_Log_level_do ]]; then
|
||||
[[ -z "$2" ]] && return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
# LogInfo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogInfo() {
|
||||
__INTERNAL_LogPrio='INFO'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_INFO \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='INFO'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogInfo }}}
|
||||
|
||||
|
||||
# LogWarn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogWarn() {
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_WARNING \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogWarn }}}
|
||||
|
||||
|
||||
# LogWarning ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogWarning() {
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_WARNING \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='WARNING'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogWarning }}}
|
||||
|
||||
|
||||
# LogError ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogError() {
|
||||
__INTERNAL_LogPrio='ERROR'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_ERROR \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='ERROR'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}; # end of LogError }}}
|
||||
|
||||
|
||||
# LogFatal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFatal() {
|
||||
__INTERNAL_LogPrio='FATAL'
|
||||
eval "$(__INTERNAL_Log_condition \$__INTERNAL_Log_level_FATAL \"\$1\")"
|
||||
LogMore___ -f "begin '$*'"
|
||||
__INTERNAL_LogPrio='FATAL'
|
||||
Log "$1" $__INTERNAL_LogPrio
|
||||
exit 255
|
||||
LogMore___ -f "end"
|
||||
}; # end of LogFatal }}}
|
||||
|
||||
|
||||
# LogPASS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogPASS() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
Log "$1" PASS
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}
|
||||
LogPass() {
|
||||
LogPASS "$@"
|
||||
}; # end of LogPASS }}}
|
||||
|
||||
|
||||
# LogFAIL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFAIL() {
|
||||
LogMore___ -f "begin '$*'"
|
||||
Log "$1" FAIL
|
||||
LogMore___ -f "end"
|
||||
return 0
|
||||
}
|
||||
LogFail() {
|
||||
LogFAIL "$@"
|
||||
}; # end of LogFAIL }}}
|
||||
|
||||
|
||||
# LogDo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogDo() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
local tmp=${BASH_REMATCH[1]:-1}
|
||||
pref="${FUNCNAME[$tmp]}(): "
|
||||
}
|
||||
LogPrintMessage "$__INTERNAL_LogPrio" "${__INTERNAL_Log_prefix}${pref}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
return 0
|
||||
}; # end of LogDo }}}
|
||||
|
||||
|
||||
# LogDebug ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogDebug() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
__INTERNAL_Log_level_do=${2:-$__INTERNAL_Log_level_DEBUG}
|
||||
__INTERNAL_LogPrio='DEBUG'
|
||||
[[ $__INTERNAL_Log_level_do -ge $__INTERNAL_Log_level_MORE ]] && __INTERNAL_LogPrio="${__INTERNAL_LogPrio}:$(($__INTERNAL_Log_level_do-$__INTERNAL_Log_level_DEBUG+1))"
|
||||
eval "$(__INTERNAL_Log_condition \${2:-\$__INTERNAL_Log_level_DEBUG} \"\$1\")"
|
||||
LogDo $pref "$1"
|
||||
return 0
|
||||
}; # end of LogDebug }}}
|
||||
|
||||
|
||||
# LogMore ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore() {
|
||||
# log if DEBUG does not containg a number
|
||||
# or the number is greater or equal to 2
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" ${2:-$__INTERNAL_Log_level_MORE}
|
||||
}; # end of LogMore }}}
|
||||
|
||||
|
||||
# LogMore_ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore_() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE_
|
||||
}; # end of LogMore_ }}}
|
||||
|
||||
|
||||
# LogMore__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore__() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE__
|
||||
}; # end of LogMore__ }}}
|
||||
|
||||
|
||||
# LogMore___ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogMore___() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE___
|
||||
}; # end of LogMore___ }}}
|
||||
|
||||
|
||||
# LogMoreLow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreLow_Obs=''
|
||||
LogMoreLow() {
|
||||
[[ -z "$__INTERNAL_LogMoreLow_Obs" ]] && {
|
||||
LogMore_ -f "LogMoreLow is obsoleted by LogMore_"
|
||||
__INTERNAL_LogMoreLow_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE_
|
||||
}; # end of LogMoreLow }}}
|
||||
|
||||
|
||||
# LogMoreMed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreMed_Obs=''
|
||||
LogMoreMed() {
|
||||
[[ -z "$__INTERNAL_LogMoreMed_Obs" ]] && {
|
||||
LogMore__ -f "LogMoreMed is obsoleted by LogMore__"
|
||||
__INTERNAL_LogMoreMed_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE__
|
||||
}; # end of LogMoreMed }}}
|
||||
|
||||
|
||||
# LogMoreHigh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogMoreHigh_Obs=''
|
||||
LogMoreHigh() {
|
||||
[[ -z "$__INTERNAL_LogMoreHigh_Obs" ]] && {
|
||||
LogMore___ -f "LogMoreHigh is obsoleted by LogMore___"
|
||||
__INTERNAL_LogMoreHigh_Obs=1
|
||||
}
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogDebug $pref "$1" $__INTERNAL_Log_level_MORE___
|
||||
}; # end of LogMoreHigh }}}
|
||||
|
||||
|
||||
# LogjAddMessage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogjAddMessage() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
__INTERNAL_Log_journal=("${__INTERNAL_Log_journal[@]}" "$1" "$2")
|
||||
LogMore__ -f "end"
|
||||
true;
|
||||
}; # end of LogjAddMessage }}}
|
||||
|
||||
# __INTERNAL_LogCenterText ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogCenterText() {
|
||||
local spaces=' '
|
||||
# strip colors
|
||||
local log_pri_strip=$(echo -en "$1" | sed -r "s:\x1B\[[0-9;]*[mK]::g")
|
||||
local log_pri_strip_count=${#log_pri_strip}
|
||||
local left_spaces=$(( ($2 - $log_pri_strip_count) / 2 ))
|
||||
local right_spaces=$(( $2 - $log_pri_strip_count - $left_spaces ))
|
||||
echo -en "${spaces:0:$left_spaces}${1}${spaces:0:$right_spaces}"
|
||||
}; # end of __INTERNAL_LogCenterText }}}
|
||||
|
||||
|
||||
# LogPrintMessage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogPrintMessage() {
|
||||
echo -e ":: [$(__INTERNAL_LogCenterText "$1" 10)] :: $2" >&2
|
||||
return 0
|
||||
}; # end of LogPrintMessage }}}
|
||||
|
||||
|
||||
# LogReport ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 LogReport
|
||||
|
||||
Prints final report similar to breakerlib's rlJournalPrintText. This is useful
|
||||
mainly if you use TCF without beakerlib.
|
||||
|
||||
LogReport
|
||||
|
||||
=cut
|
||||
#'
|
||||
|
||||
LogReport() {
|
||||
echo -e "\n ====== Summary report begin ======"
|
||||
local a p l i
|
||||
for i in $(seq 0 2 $((${#__INTERNAL_Log_journal[@]}-1)) ); do
|
||||
LogPrintMessage "${__INTERNAL_Log_journal[$i]}" "${__INTERNAL_Log_journal[$((++i))]}"
|
||||
done
|
||||
echo " ======= Summary report end ======="
|
||||
__INTERNAL_Log_journal=()
|
||||
}; # end of LogReport }}}
|
||||
|
||||
|
||||
# LogFile ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogFile() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
cat $1 | while IFS= read line; do
|
||||
Log "$line" "${prio:-$2}"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogText ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogText() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
{
|
||||
if [[ "$1" == "-" ]]; then
|
||||
cat -
|
||||
else
|
||||
echo "$1"
|
||||
fi
|
||||
} | while IFS= read line; do
|
||||
Log "$line" "${prio:-$2}"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogStrippedDiff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogStrippedDiff() {
|
||||
LogMore__ -f "begin '$*'"
|
||||
local prio=''
|
||||
[[ $# -ge 3 ]] && {
|
||||
optsBegin
|
||||
optsAdd 'prio|tag|p|t' --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
}
|
||||
{
|
||||
if [[ -n "$2" ]]; then
|
||||
diff -U0 "$1" "$2"
|
||||
else
|
||||
cat $1
|
||||
fi
|
||||
} | grep -v -e '^@@ ' -e '^--- ' -e '^+++ ' | while IFS= read line; do
|
||||
Log "$line" "$prio"
|
||||
done
|
||||
LogMore__ -f "end"
|
||||
}; #}}}
|
||||
|
||||
|
||||
# LogRun ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogRun() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}+1))"
|
||||
}
|
||||
LogMore
|
||||
local dolog=$?
|
||||
[[ $dolog -eq 0 ]] || {
|
||||
local param params blacklist="[[:space:]]|>|<|\|"
|
||||
[[ "${#@}" -eq 1 ]] && params="$1" || {
|
||||
for param in "$@"; do
|
||||
if [[ "$param" =~ $blacklist ]]; then
|
||||
params="$params \"${param//\"/\\\"}\""
|
||||
else
|
||||
params="$params $param"
|
||||
fi
|
||||
done
|
||||
params="${params:1}"
|
||||
}
|
||||
LogDo $pref "executing >>>>> ${params} <<<<<"
|
||||
}
|
||||
eval "$@"
|
||||
ret=$?
|
||||
[[ $dolog -eq 0 ]] || LogMore $pref "execution >>>>> ${params} <<<<< returned '$ret'"
|
||||
return $ret
|
||||
}; # end of LogRun }}}
|
||||
|
||||
|
||||
# LogDebugNext ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugNext() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebug '' ${1:-$__INTERNAL_Log_level_DEBUG} || {
|
||||
__INTERNAL_Log_DEBUGING=0
|
||||
trap "
|
||||
__INTERNAL_Log_DEBUGING_res=\$?
|
||||
let __INTERNAL_Log_DEBUGING++
|
||||
if [[ \$__INTERNAL_Log_DEBUGING -eq 1 ]]; then
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
else
|
||||
trap - DEBUG
|
||||
LogDebug $pref \"execution >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<< returned \$__INTERNAL_Log_DEBUGING_res\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
fi" DEBUG
|
||||
}
|
||||
}; # end of LogDebugNext }}}
|
||||
|
||||
|
||||
# LogMoreNext ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogMoreNext() {
|
||||
LogMore || {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebugNext $pref ${1:-$__INTERNAL_Log_level_MORE}
|
||||
}
|
||||
}; # end of LogMoreNext }}}
|
||||
LogNext() {
|
||||
LogMoreNext "$@"
|
||||
}
|
||||
|
||||
|
||||
# LogDebugOn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugOn() {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebug '' ${1:-$__INTERNAL_Log_level_DEBUG} || {
|
||||
trap "
|
||||
__INTERNAL_Log_DEBUGING_res=\$?
|
||||
let __INTERNAL_Log_DEBUGING++
|
||||
if [[ -z \"\$__INTERNAL_Log_DEBUGING_cmd\" ]]; then
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
else
|
||||
LogDebug $pref \"execution >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<< returned \$__INTERNAL_Log_DEBUGING_res\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
__INTERNAL_Log_DEBUGING_cmd=\"\$BASH_COMMAND\"
|
||||
if [[ \"\$__INTERNAL_Log_DEBUGING_cmd\" =~ LogDebugOff ]]; then
|
||||
trap - DEBUG
|
||||
else
|
||||
LogDebug $pref \"executing >>>>> \$__INTERNAL_Log_DEBUGING_cmd <<<<<\" ${1:-$__INTERNAL_Log_level_DEBUG}
|
||||
fi
|
||||
fi" DEBUG
|
||||
}
|
||||
}; # end of LogDebugOn }}}
|
||||
|
||||
|
||||
# LogMoreOn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogMoreOn() {
|
||||
LogMore || {
|
||||
local pref=''
|
||||
[[ "$1" =~ ^-f([0-9]*) ]] && {
|
||||
shift
|
||||
pref="-f$((${BASH_REMATCH[1]:-1}))"
|
||||
}
|
||||
LogDebugOn $pref ${1:-$__INTERNAL_Log_level_MORE}
|
||||
}
|
||||
}; # end of LogMoreOn }}}
|
||||
|
||||
|
||||
# LogDebugOff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
# log info about execution to Debug level
|
||||
LogDebugOff() {
|
||||
__INTERNAL_Log_DEBUGING_cmd=''
|
||||
}; # end of LogDebugOff }}}
|
||||
|
||||
|
||||
# LogVar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogVar() {
|
||||
[[ -n "$DEBUG" ]] && {
|
||||
echo -n 'eval '
|
||||
while [[ -n "$1" ]]; do
|
||||
echo -n "LogDebug -f \"\$(set | grep -P '^$1=')\";"
|
||||
shift
|
||||
done
|
||||
}
|
||||
}; # end of LogVar }}}
|
||||
|
||||
|
||||
# __INTERNAL_LogRedirectToBeakerlib ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_LogRedirectToBeakerlib() {
|
||||
echo -e "\nrunning inside the beakerlib - redirect own logging functions to beakerlib ones"
|
||||
true; LogjAddMessage() {
|
||||
LogMore___ -f "begin $*"
|
||||
rljAddMessage "$2" "$1"
|
||||
LogMore___ -f "end $*"
|
||||
}
|
||||
true; Log() {
|
||||
LogMore___ -f "begin $*"
|
||||
case ${2} in
|
||||
INFO)
|
||||
LogjAddMessage "INFO" "$1"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
BEGIN)
|
||||
LogjAddMessage "INFO" "$*:"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
WARNING|WARN|ERROR|FATAL)
|
||||
LogjAddMessage "WARNING" "$1"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
SKIP|SKIPPING)
|
||||
LogjAddMessage "WARNING" "$*:"
|
||||
LogPrintMessage "$2" "${__INTERNAL_Log_prefix}${__INTERNAL_Log_prefix2}${1}${__INTERNAL_Log_postfix}"
|
||||
;;
|
||||
FAIL)
|
||||
rlFail "$*"
|
||||
return $?
|
||||
;;
|
||||
PASS)
|
||||
rlPass "$*"
|
||||
return $?
|
||||
;;
|
||||
*)
|
||||
rlLog "$*"
|
||||
;;
|
||||
esac
|
||||
LogMore___ -f "end $*"
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
# end of __INTERNAL_LogRedirectToBeakerlib }}}
|
||||
|
||||
|
||||
# LogLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
LogLibraryLoaded() {
|
||||
declare -F rlDie > /dev/null && __INTERNAL_LogRedirectToBeakerlib
|
||||
return 0
|
||||
}; # end of LogLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
@ -0,0 +1,48 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/opts
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/opts
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Provides simple way for defining script's or function's options including help" >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/opts)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,338 @@
|
||||
#!/bin/bash
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = opts
|
||||
# library-version = 4
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_opts_LIB_VERSION=4
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library opts
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provides simple way for defining script's or function's option
|
||||
agruments including help.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/opts and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/opts)" >> $(METADATA)
|
||||
|
||||
B<Code example>
|
||||
|
||||
testfunction() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
optsAdd 'flag1' --flag
|
||||
optsAdd 'optional1|o' --optional
|
||||
optsAdd 'Optional2|O' "echo opt \$1" --optional --long --var-name opt
|
||||
optsAdd 'mandatory1|m' "echo man \$1" --mandatory
|
||||
optsDone; eval "${optsCode}"
|
||||
echo "$optional1"
|
||||
echo "$opt"
|
||||
echo "$mandatory1"
|
||||
}
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library opts v$__INTERNAL_opts_LIB_VERSION... "
|
||||
|
||||
# optsAdd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsAdd() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
local GETOPT=$(getopt -q -o fomv:d:lh:l -l flag,opt,optional,mandatory,varname:,default:,local,help:,long -- "$@")
|
||||
eval set -- "$GETOPT"
|
||||
local type='f' var_name var_name_set default help long
|
||||
while [[ -n "$@" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
-h|--help)
|
||||
shift
|
||||
help="$1"
|
||||
;;
|
||||
-l|--long)
|
||||
long=1
|
||||
;;
|
||||
-d|--default)
|
||||
shift
|
||||
default="$1"
|
||||
;;
|
||||
-v|--varname|--var-name)
|
||||
shift
|
||||
var_name="$1"
|
||||
var_name_set=1
|
||||
;;
|
||||
-f|--flag)
|
||||
type='f'
|
||||
;;
|
||||
-o|--opt|--optional)
|
||||
type='o'
|
||||
;;
|
||||
-m|--mandatory)
|
||||
type='m'
|
||||
;;
|
||||
*)
|
||||
echo "unknown option '$1'"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
[ -z "$var_name" ] && {
|
||||
var_name=$(echo -n "$1" | cut -d '|' -f 1 | sed -e 's/-//g;s/^[0-9]/_\0/')
|
||||
LogMoreHigh -f "constructing variable name '$var_name'"
|
||||
}
|
||||
local opts='' opts_help='' optsi=''
|
||||
for optsi in $(echo -n "$1" | tr '|' ' '); do
|
||||
if [[ ${#optsi} -ge 2 || $long -eq 1 ]]; then
|
||||
opts="$opts|--$optsi"
|
||||
opts_help="$opts_help|--$optsi[=ARG]"
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long},${optsi}"
|
||||
LogMoreHigh -f "adding long option '$optsi'"
|
||||
case $type in
|
||||
m)
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long}:"
|
||||
;;
|
||||
o)
|
||||
__INTERNAL_opts_long="${__INTERNAL_opts_long}::"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
opts="$opts|-$optsi"
|
||||
opts_help="$opts_help|-${optsi}[ARG]"
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}${optsi}"
|
||||
LogMoreHigh -f "adding short option '$optsi'"
|
||||
case $type in
|
||||
m)
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}:"
|
||||
;;
|
||||
o)
|
||||
__INTERNAL_opts_short="${__INTERNAL_opts_short}::"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
optsCode="${optsCode}
|
||||
${opts:1})
|
||||
optsPresent=\"\${optsPresent}$var_name \""
|
||||
LogMoreHigh -f "adding code for processing option '${opts:1}'"
|
||||
__INTERNAL_opts_init_var="$__INTERNAL_opts_init_var
|
||||
${__INTERNAL_opts_local}$var_name=()"
|
||||
__INTERNAL_opts_default="$__INTERNAL_opts_default
|
||||
[[ \"\$optsPresent\" =~ \$(echo \"\<${var_name}\>\") ]] || ${__INTERNAL_opts_local}$var_name='$default'"
|
||||
case $type in
|
||||
f)
|
||||
[[ -z "$2" || -n "$var_name_set" ]] && {
|
||||
local val=1
|
||||
[[ -n "$default" ]] && val=''
|
||||
optsCode="$optsCode
|
||||
$var_name+=( '$val' )"
|
||||
}
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts:1}"
|
||||
;;
|
||||
o|m)
|
||||
optsCode="$optsCode
|
||||
shift"
|
||||
[[ -z "$2" || -n "$var_name_set" ]] && optsCode="$optsCode
|
||||
$var_name+=( \"\$1\" )"
|
||||
if [[ "$type" == "o" ]]; then
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts_help:1}"
|
||||
else
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}
|
||||
${opts:1} ARG"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
[[ -n "$2" ]] && {
|
||||
optsCode="$optsCode
|
||||
$2"
|
||||
}
|
||||
optsCode="$optsCode
|
||||
;;"
|
||||
|
||||
__INTERNAL_opts_help="${__INTERNAL_opts_help}${help:+
|
||||
$help
|
||||
}"
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsAdd }}}
|
||||
|
||||
|
||||
# optsBegin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsBegin() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
optsCode=''
|
||||
optsPresent=' '
|
||||
__INTERNAL_opts_short='.'
|
||||
__INTERNAL_opts_long='help'
|
||||
__INTERNAL_opts_help=''
|
||||
__INTERNAL_opts_local=''
|
||||
__INTERNAL_opts_default=''
|
||||
__INTERNAL_opts_init_var=''
|
||||
[[ "${FUNCNAME[1]}" != "main" ]] && __INTERNAL_opts_local='local '
|
||||
while [[ -n "$1" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
-h|--help)
|
||||
shift
|
||||
__INTERNAL_opts_help="$1"
|
||||
;;
|
||||
*)
|
||||
echo "unknown option '$1'"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsBegin }}}
|
||||
|
||||
|
||||
# optsDone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsDone() {
|
||||
LogMoreMed -f "begin '$*'"
|
||||
optsCode="${__INTERNAL_opts_local}GETOPT=\$(getopt -o ${__INTERNAL_opts_short} -l ${__INTERNAL_opts_long} -- \"\$@\")
|
||||
[[ \$? -ne 0 ]] && {
|
||||
echo 'Exiting'
|
||||
return 1 >& /dev/null
|
||||
exit 1
|
||||
}
|
||||
eval set -- \"\$GETOPT\"
|
||||
${__INTERNAL_opts_init_var:1}
|
||||
while [[ -n \"\$1\" ]]; do
|
||||
case \$1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
${optsCode}
|
||||
|
||||
--help)
|
||||
echo \"\$__INTERNAL_opts_help\"
|
||||
return >& /dev/null
|
||||
exit
|
||||
;;
|
||||
*)
|
||||
echo \"unknown option '\$1'\"
|
||||
return 1 >& /dev/null
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
${__INTERNAL_opts_default:1}
|
||||
unset optsCode __INTERNAL_opts_help __INTERNAL_opts_short __INTERNAL_opts_long __INTERNAL_opts_default __INTERNAL_opts_init_var __INTERNAL_opts_local
|
||||
"
|
||||
if ! echo "$optsCode" | grep -q -- '--help$'; then
|
||||
__INTERNAL_opts_help="$__INTERNAL_opts_help
|
||||
--help
|
||||
Show this help."
|
||||
fi
|
||||
LogMoreHigh -f "optsCode:\n$optsCode"
|
||||
LogMoreMed -f "end"
|
||||
}; # end of optsDone }}}
|
||||
|
||||
|
||||
# optsSelfCheck ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsSelfCheck() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
# optsAdd 'help' -f 'echo help'
|
||||
optsAdd 'flag' -f 'echo f'
|
||||
optsAdd 'optional|o' -o "echo opt \$1"
|
||||
optsAdd 'Optional|O' -o "echo opt \$1" --long
|
||||
optsAdd 'mandatory|m' -m "echo man \$1"
|
||||
optsDone
|
||||
|
||||
echo "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
eval "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
fce() {
|
||||
optsBegin -h "Usage: $0 [options]
|
||||
|
||||
options:
|
||||
"
|
||||
# optsAdd 'help' -f 'echo help'
|
||||
optsAdd 'flag' -f
|
||||
optsAdd 'optional|o' -o "echo opt \$1"
|
||||
optsAdd 'Optional|O' -o "echo opt \$1" --long
|
||||
optsAdd 'mandatory|m' -m "echo man \$1"
|
||||
optsDone
|
||||
echo "${optsCode}"
|
||||
|
||||
echo ...
|
||||
|
||||
eval "${optsCode}"
|
||||
|
||||
echo ...
|
||||
}
|
||||
|
||||
echo -e 'test for opts in function\n========================='
|
||||
fce --help
|
||||
}; # end of optsSelfCheck }}}
|
||||
|
||||
|
||||
# optsLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
optsLibraryLoaded() {
|
||||
return 0
|
||||
}; # end of LogLibraryLoaded }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
@ -0,0 +1,60 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/tcf
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/tcf
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Block style coding with ability of skipping parts." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/tcf)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,903 @@
|
||||
#!/bin/bash
|
||||
# try-check-final.sh
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = tcf
|
||||
# library-version = 14
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
__INTERNAL_tcf_LIB_VERSION=14
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library Try-Check-Final
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This file contains functions which gives user the ability to define blocks of
|
||||
code where some of the blocks can be automatically skipped if some of preceeding
|
||||
blocks failed.
|
||||
|
||||
ATTENTION
|
||||
This plugin modifies some beakerlib functions! If you suspect that it breakes
|
||||
some functionality set the environment variable TCF_NOHACK to nonempty value.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/tcf and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/tcf)" >> $(METADATA)
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library try-check-final v$__INTERNAL_tcf_LIB_VERSION... "
|
||||
|
||||
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_LOW=3
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_MED=$__INTERNAL_tcf_DEBUG_LEVEL_LOW+1
|
||||
let __INTERNAL_tcf_DEBUG_LEVEL_HIGH=$__INTERNAL_tcf_DEBUG_LEVEL_LOW+2
|
||||
|
||||
# global variables {{{
|
||||
__INTERNAL_tcf_result=0
|
||||
__INTERNAL_tcf_result_file="${BEAKERLIB_DIR:-"/var/tmp"}/tcf.result"
|
||||
echo -n "$__INTERNAL_tcf_result" > "$__INTERNAL_tcf_result_file"
|
||||
__INTERNAL_tcf_current_level_data=()
|
||||
__INTERNAL_tcf_current_level_val=0
|
||||
__INTERNAL_tcf_journal=()
|
||||
#}}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_colorize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_colorize() {
|
||||
local a
|
||||
case $1 in
|
||||
PASS)
|
||||
a="${__INTERNAL_tcf_color_green}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
FAIL)
|
||||
a="${__INTERNAL_tcf_color_red}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
SKIPPING|WARNING)
|
||||
a="${__INTERNAL_tcf_color_yellow}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
BEGIN|INFO)
|
||||
a="${__INTERNAL_tcf_color_blue}${1}${__INTERNAL_tcf_color_reset}"
|
||||
;;
|
||||
*)
|
||||
a=$1
|
||||
esac
|
||||
echo -n "$a"
|
||||
}; # end of __INTERNAL_tcf_colorize }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_colors_setup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_colors_setup(){
|
||||
T="$TERM"
|
||||
[[ -t 1 ]] || T=""
|
||||
[[ -t 2 ]] || T=""
|
||||
[[ "$1" == "--force" ]] && T="xterm"
|
||||
case $T in
|
||||
xterm|screen)
|
||||
__INTERNAL_tcf_color_black="\e[0;30m"
|
||||
__INTERNAL_tcf_color_dark_gray="\e[1;30m"
|
||||
__INTERNAL_tcf_color_blue="\e[0;34m"
|
||||
__INTERNAL_tcf_color_light_blue="\e[1;34m"
|
||||
__INTERNAL_tcf_color_green="\e[0;32m"
|
||||
__INTERNAL_tcf_color_light_green="\e[1;32m"
|
||||
__INTERNAL_tcf_color_cyan="\e[0;36m"
|
||||
__INTERNAL_tcf_color_light_cyan="\e[1;36m"
|
||||
__INTERNAL_tcf_color_red="\e[0;31m"
|
||||
__INTERNAL_tcf_color_light_red="\e[1;31m"
|
||||
__INTERNAL_tcf_color_purple="\e[0;35m"
|
||||
__INTERNAL_tcf_color_light_purple="\e[1;35m"
|
||||
__INTERNAL_tcf_color_brown="\e[0;33m"
|
||||
__INTERNAL_tcf_color_yellow="\e[1;33m"
|
||||
__INTERNAL_tcf_color_light_gray="\e[0;37m"
|
||||
__INTERNAL_tcf_color_white="\e[1;37m"
|
||||
__INTERNAL_tcf_color_reset="\e[00m"
|
||||
;;
|
||||
* )
|
||||
__INTERNAL_tcf_color_black=""
|
||||
__INTERNAL_tcf_color_dark_gray=""
|
||||
__INTERNAL_tcf_color_blue=""
|
||||
__INTERNAL_tcf_color_light_blue=""
|
||||
__INTERNAL_tcf_color_green=""
|
||||
__INTERNAL_tcf_color_light_green=""
|
||||
__INTERNAL_tcf_color_cyan=""
|
||||
__INTERNAL_tcf_color_light_cyan=""
|
||||
__INTERNAL_tcf_color_red=""
|
||||
__INTERNAL_tcf_color_light_red=""
|
||||
__INTERNAL_tcf_color_purple=""
|
||||
__INTERNAL_tcf_color_light_purple=""
|
||||
__INTERNAL_tcf_color_brown=""
|
||||
__INTERNAL_tcf_color_yellow=""
|
||||
__INTERNAL_tcf_color_light_gray=""
|
||||
__INTERNAL_tcf_color_white=""
|
||||
__INTERNAL_tcf_color_reset=""
|
||||
;;
|
||||
esac
|
||||
}; # end of __INTERNAL_tcf_colors_setup
|
||||
__INTERNAL_tcf_colors_setup; # }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_copy_function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_copy_function() {
|
||||
declare -F $1 > /dev/null || return 1
|
||||
eval "$(echo -n "${2}() "; declare -f ${1} | tail -n +2)"
|
||||
}; # end of __INTERNAL_tcf_copy_function }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_addE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_addE2R() {
|
||||
__INTERNAL_tcf_copy_function $1 TCF_orig_$1
|
||||
eval "${1}() { TCF_orig_${1} \"\$@\"; tcfE2R; }"
|
||||
}; # end of __INTERNAL_tcf_addE2R }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_insertE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_insertE2R() {
|
||||
__INTERNAL_tcf_copy_function $1 TCF_orig_$1
|
||||
eval "$(echo -n "${1}() "; declare -f ${1} | tail -n +2 | sed -e 's/\(.*__INTERNAL_ConditionalAssert.*\)/\1\ntcfE2R;/')"
|
||||
}; # end of __INTERNAL_tcf_insertE2R }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_get_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_get_current_level() {
|
||||
local l=$__INTERNAL_tcf_current_level_val
|
||||
if [[ $1 ]]; then
|
||||
l=$(($l+$1))
|
||||
fi
|
||||
local i
|
||||
for i in $(seq 1 $(($l*2)) ); do echo -n " "; done
|
||||
return $l
|
||||
}; # end of __INTERNAL_tcf_get_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_incr_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_incr_current_level() {
|
||||
let __INTERNAL_tcf_current_level_val++
|
||||
__INTERNAL_Log_prefix=$(__INTERNAL_tcf_get_current_level)
|
||||
}; # end of __INTERNAL_tcf_incr_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_decr_current_level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_decr_current_level() {
|
||||
let __INTERNAL_tcf_current_level_val--
|
||||
__INTERNAL_Log_prefix=$(__INTERNAL_tcf_get_current_level)
|
||||
}; # end of __INTERNAL_tcf_decr_current_level }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_do_hack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_do_hack() {
|
||||
LogDebug "TCF_NOHACK='$TCF_NOHACK'"
|
||||
if [[ -z "$TCF_NOHACK" ]]; then
|
||||
tcfChk "Apply TCF beakerlib hacks" && {
|
||||
rlLog " injecting tcf hacks into the beakerlib functions"
|
||||
echo -n "patching rlLog"
|
||||
local rlL=$(declare -f rlLog | sed -e 's|\] ::|\0${__INTERNAL_Log_prefix}|;s|$3 $1"|${3:+"$3 "}$1"|')
|
||||
eval "$rlL"
|
||||
|
||||
echo -n ", rljAddTest"
|
||||
__INTERNAL_tcf_copy_function rljAddTest __INTERNAL_tcf_orig_rljAddTest
|
||||
true; rljAddTest() {
|
||||
local a="${__INTERNAL_Log_prefix}$1"; shift
|
||||
[[ "$1" != "FAIL" ]]; tcfE2R
|
||||
__INTERNAL_tcf_journal=("${__INTERNAL_tcf_journal[@]}" "$1" "$a")
|
||||
__INTERNAL_tcf_orig_rljAddTest "$a" "$@"
|
||||
}
|
||||
echo -n ", rljAddMessage"
|
||||
__INTERNAL_tcf_copy_function rljAddMessage __INTERNAL_tcf_orig_rljAddMessage
|
||||
true; rljAddMessage() {
|
||||
local a="${__INTERNAL_Log_prefix}$1"; shift
|
||||
__INTERNAL_tcf_journal=("${__INTERNAL_tcf_journal[@]}" "$1" "$a")
|
||||
__INTERNAL_tcf_orig_rljAddMessage "$a" "$@"
|
||||
}
|
||||
echo -n ", __INTERNAL_LogAndJournalFail"
|
||||
__INTERNAL_tcf_copy_function __INTERNAL_LogAndJournalFail __INTERNAL_tcf_orig___INTERNAL_LogAndJournalFail
|
||||
true; __INTERNAL_LogAndJournalFail() {
|
||||
tcfNOK
|
||||
__INTERNAL_tcf_orig___INTERNAL_LogAndJournalFail "$@"
|
||||
}
|
||||
echo "."
|
||||
tcfFin --no-assert --ignore; }
|
||||
else
|
||||
Log "skip hacking beakerlib functions"
|
||||
fi
|
||||
}; # end of __INTERNAL_tcf_do_hack }}}
|
||||
|
||||
|
||||
# __INTERNAL_tcf_kill_old_plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_kill_old_plugin() {
|
||||
tcfChk "Get rid of the old TCF implementation. removing" && {
|
||||
local comma='' i
|
||||
for i in Try Chk Fin E2R RES OK NOK NEG TCFcheckFinal TCFreport; do
|
||||
echo -n "${comma}rl$i"
|
||||
unset -f rl$i
|
||||
comma=', '
|
||||
done
|
||||
echo '.'
|
||||
tcfFin --no-assert; }
|
||||
}; # end of __INTERNAL_tcf_kill_old_plugin }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Block functions
|
||||
|
||||
=cut
|
||||
|
||||
# __INTERNAL_tcf_parse_params ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
__INTERNAL_tcf_parse_params() {
|
||||
local GETOPT=$(getopt -q -o if: -l ignore,no-assert,fail-tag: -- "$@")
|
||||
eval set -- "$GETOPT"
|
||||
echo "local ignore noass title fail_tag"
|
||||
echo "[ -z \"\$ignore\" ] && ignore=0"
|
||||
echo "[ -z \"\$noass\" ] && noass=0"
|
||||
echo "[ -z \"\$fail_tag\" ] && fail_tag='FAIL'"
|
||||
while [[ -n "$@" ]]; do
|
||||
case $1 in
|
||||
--)
|
||||
shift; break
|
||||
;;
|
||||
--ignore|-i)
|
||||
echo "ignore=1"
|
||||
echo "noass=1"
|
||||
;;
|
||||
--no-assert|-n)
|
||||
echo "noass=1"
|
||||
;;
|
||||
--fail-tag|-f)
|
||||
shift
|
||||
echo "fail_tag='$1'"
|
||||
;;
|
||||
*)
|
||||
echo "unknown option $1"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done
|
||||
[[ -n "$1" ]] && echo "title=\"${1}\""
|
||||
echo "eval set -- \"$(echo "$GETOPT" | sed -e 's/.*-- //')\""
|
||||
}; # end of __INTERNAL_tcf_parse_params }}}
|
||||
|
||||
|
||||
# tcfTry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfTry
|
||||
|
||||
Starting function of block which will be skipped if an error has been detected
|
||||
by tcfFin function occurent before.
|
||||
|
||||
tcfTry ["title"] [-i|--ignore] [--no-assert] [--fail-tag TAG] && {
|
||||
<some code>
|
||||
tcfFin; }
|
||||
|
||||
If title is omitted than noting is printed out so no error will be reported (no
|
||||
Assert is executed) thus at least the very top level tcfTry should have title.
|
||||
|
||||
tcfTry and tcfChk blocks are stackable so you can organize them into a hierarchy
|
||||
structure.
|
||||
|
||||
Note that tcfFin has to be used otherwise the overall result will not be
|
||||
accurate.
|
||||
|
||||
=over
|
||||
|
||||
=item title
|
||||
|
||||
Text which will be displayed and logged at the beginning and the end (in tcfFin
|
||||
function) of the block.
|
||||
|
||||
=item -i, --ignore
|
||||
|
||||
Do not propagate the actual result to the higher level result.
|
||||
|
||||
=item -n, --no-assert
|
||||
|
||||
Do not log error into the journal.
|
||||
|
||||
=item -f, --fail-tag TAG
|
||||
|
||||
If the result of the block is FAIL, use TAG instead ie. INFO or WARNING.
|
||||
|
||||
=back
|
||||
|
||||
Returns 1 if and error occured before, otherwise returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfTry() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
local vars=$(__INTERNAL_tcf_parse_params "$@") || { Log "$vars" FAIL; return 1; }
|
||||
LogMoreMed -f "vars:\n$vars"
|
||||
LogMoreLow -f "evaluating options start"
|
||||
eval "$vars"
|
||||
LogMoreLow -f "evaluating options end"
|
||||
local incr=
|
||||
local pp="SKIPPING"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
LogMoreLow -f "result was $__INTERNAL_tcf_result"
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 ]]; then
|
||||
__INTERNAL_tcf_current_level_data=("$__INTERNAL_tcf_result" "$vars" "${__INTERNAL_tcf_current_level_data[@]}")
|
||||
pp="BEGIN"
|
||||
incr=1
|
||||
fi
|
||||
if [[ -n "$title" ]]; then
|
||||
Log "$title" "$pp"
|
||||
[[ -n "$incr" ]] && {
|
||||
LogMoreLow -f "increment indentation level"
|
||||
__INTERNAL_tcf_incr_current_level
|
||||
}
|
||||
fi
|
||||
LogMoreLow -f "end"
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfTry }}}
|
||||
|
||||
|
||||
# tcfChk ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfChk
|
||||
|
||||
Starting function of block which will be always executed.
|
||||
|
||||
tcfChk ["title"] [-i|--ignore] [--no-assert] [--fail-tag TAG] && {
|
||||
<some code>
|
||||
tcfFin; }
|
||||
|
||||
If title is omitted than noting is printed out so no error will be reported (no
|
||||
Assert is executed) thus at least the very top level tcfChk should have title.
|
||||
|
||||
tcfTry and tcfChk blocks are stackable so you can organize them into a hierarchy
|
||||
structure.
|
||||
|
||||
Note that tcfFin has to be used otherwise the overall result will not be
|
||||
accurate.
|
||||
|
||||
For details about arguments see tcfTry.
|
||||
|
||||
Returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfChk() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
local res=$__INTERNAL_tcf_result
|
||||
tcfRES 0
|
||||
tcfTry "$@"
|
||||
__INTERNAL_tcf_current_level_data[0]=$res
|
||||
LogMoreLow -f "end"
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfChk }}}
|
||||
|
||||
|
||||
# tcfFin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfFin
|
||||
|
||||
Ending function of block. It does some evaluation of previous local and global
|
||||
results and puts it into the global result.
|
||||
|
||||
tcfTry ["title"] && {
|
||||
<some code>
|
||||
tcfFin [-i|--ignore] [--no-assert] [--fail-tag TAG]; }
|
||||
|
||||
Local result is actualy exit code of the last command int the body.
|
||||
|
||||
Global result is an internal varibale hodning previous local results.
|
||||
Respectively last error or 0.
|
||||
|
||||
For details about arguments see tcfTry.
|
||||
|
||||
Returns local result of the preceeding block.
|
||||
|
||||
=cut
|
||||
|
||||
tcfFin() {
|
||||
local RES=$?
|
||||
LogMoreLow -f "begin '$*'"
|
||||
LogMoreMed -f "previous exit code was '$RES'"
|
||||
local vars=$(__INTERNAL_tcf_parse_params "$@") || { Log "$vars" FAIL; return 1; }
|
||||
LogMoreMed -f "vars:\n$vars"
|
||||
LogMoreLow -f "evaluating options start"
|
||||
eval "$vars"
|
||||
LogMoreLow -f "evaluating options end"
|
||||
tcfRES; # to set __INTERNAL_tcf_result
|
||||
[[ $RES -ne 0 ]] && tcfRES $RES
|
||||
RES=$__INTERNAL_tcf_result
|
||||
LogMoreMed -f "overall result is '$RES'"
|
||||
LogMoreMed -f "data:\n${__INTERNAL_tcf_current_level_data[1]}"
|
||||
LogMoreLow -f "evaluating data start"
|
||||
eval "${__INTERNAL_tcf_current_level_data[1]}"
|
||||
LogMoreLow -f "evaluating data end"
|
||||
if [[ -n "$title" ]]; then
|
||||
__INTERNAL_tcf_decr_current_level
|
||||
if [[ $ignore -eq 1 ]]; then
|
||||
RES=0
|
||||
[[ $__INTERNAL_tcf_result -ne 0 ]] && title="$title - ignored"
|
||||
fi
|
||||
if [[ $noass -eq 0 ]]; then
|
||||
tcfAssert0 "$title" $__INTERNAL_tcf_result "$fail_tag"
|
||||
else
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 ]]; then
|
||||
local pp="PASS"
|
||||
LogInfo "$title - $pp"
|
||||
else
|
||||
local pp="${fail_tag:-FAIL}"
|
||||
LogWarn "$title - $pp"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [[ $__INTERNAL_tcf_result -eq 0 || $ignore -eq 1 ]]; then
|
||||
tcfRES ${__INTERNAL_tcf_current_level_data[0]}
|
||||
fi
|
||||
local i
|
||||
for i in 0 1; do unset __INTERNAL_tcf_current_level_data[$i]; done
|
||||
__INTERNAL_tcf_current_level_data=("${__INTERNAL_tcf_current_level_data[@]}")
|
||||
LogMoreLow -f "end"
|
||||
return $RES
|
||||
}; # end of tcfFin }}}
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for manipulation with the results
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfRES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfRES
|
||||
|
||||
Sets and return the global result.
|
||||
|
||||
tcfRES [-p|--print] [number]
|
||||
|
||||
=over
|
||||
|
||||
=item -p --print
|
||||
|
||||
Also print the result value.
|
||||
|
||||
=item number
|
||||
|
||||
If present the global result is set to this value.
|
||||
|
||||
=back
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfRES() {
|
||||
local p=0
|
||||
while [[ -n "$1" ]]; do
|
||||
case $1 in
|
||||
--print|-p)
|
||||
p=1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
if [[ -n "$1" ]]; then
|
||||
__INTERNAL_tcf_result=$1
|
||||
echo -n "$__INTERNAL_tcf_result" > "$__INTERNAL_tcf_result_file"
|
||||
else
|
||||
__INTERNAL_tcf_result="$(cat "$__INTERNAL_tcf_result_file")"
|
||||
fi
|
||||
[[ $p -eq 1 ]] && echo $__INTERNAL_tcf_result
|
||||
return $__INTERNAL_tcf_result
|
||||
}; # end of tcfRES }}}
|
||||
|
||||
|
||||
# tcfOK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfOK
|
||||
|
||||
Sets the global result to 0.
|
||||
|
||||
tcfOK
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfOK() {
|
||||
tcfRES 0
|
||||
}; # end of tcfOK }}}
|
||||
|
||||
|
||||
# tcfNOK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfNOK
|
||||
|
||||
Sets the global result to 1 or given number.
|
||||
|
||||
tcfNOK [number]
|
||||
|
||||
=over
|
||||
|
||||
=item number
|
||||
|
||||
If present the global result is set to this value.
|
||||
|
||||
=back
|
||||
|
||||
Returns global result.
|
||||
|
||||
=cut
|
||||
|
||||
tcfNOK() {
|
||||
if [[ -n "$1" ]]; then
|
||||
[[ $1 -eq 0 ]] && echo "You have requested result '0'. You should use tcfOK instead."
|
||||
tcfRES $1
|
||||
else
|
||||
tcfRES 1
|
||||
fi
|
||||
}; # end of tcfNOK }}}
|
||||
|
||||
|
||||
# tcfE2R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfE2R
|
||||
|
||||
Converts exit code of previous command to local result if the exit code is not 0
|
||||
(zero).
|
||||
|
||||
<some command>
|
||||
tcfE2R [number]
|
||||
|
||||
=over
|
||||
|
||||
=item number
|
||||
|
||||
If present use it instead of exit code.
|
||||
|
||||
=back
|
||||
|
||||
Returns original exit code or given number.
|
||||
|
||||
=cut
|
||||
|
||||
tcfE2R() {
|
||||
local res=$?
|
||||
[[ -n "$1" ]] && res=$1
|
||||
[[ $res -ne 0 ]] && tcfRES $res
|
||||
return $res
|
||||
}; # end of tcfE2R }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for manipulation with the exit codes
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfNEG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfNEG
|
||||
|
||||
Negates exit code of previous command.
|
||||
|
||||
<some command>
|
||||
tcfNEG
|
||||
|
||||
Returns 1 if original exit code was 0, otherwise returns 0.
|
||||
|
||||
=cut
|
||||
|
||||
tcfNEG() {
|
||||
[[ $? -eq 0 ]] && return 1 || return 0
|
||||
}; # end of tcfNEG }}}
|
||||
|
||||
|
||||
# tcfRun ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfRun
|
||||
|
||||
Simmilar to rlRun but it also annouces the beginnign of the command.
|
||||
|
||||
tcfRun [--fail-tag|-f TAG] command [exp_result [title]]
|
||||
|
||||
Moreover if 'command not found' appears on STDERR it should produce WARNING.
|
||||
|
||||
=over
|
||||
|
||||
=item command
|
||||
|
||||
Command to execute.
|
||||
|
||||
=item exp_result
|
||||
|
||||
Specification of expect resutl.
|
||||
|
||||
It can be a list of values or intervals or * for any result. Also negation (!) can be used.
|
||||
|
||||
Example:
|
||||
|
||||
<=2,7,10-12,>252,!254 means following values 0,1,2,7,10,11,12,253,255
|
||||
|
||||
=item title
|
||||
|
||||
Text which will be displayed and logged at the beginning and the end of command execution.
|
||||
|
||||
=item --fail-tag | -f
|
||||
|
||||
If the command fails use TAG instead of FAIL.
|
||||
|
||||
=back
|
||||
|
||||
Returns exit code of the executed command.
|
||||
|
||||
=cut
|
||||
|
||||
tcfRun() {
|
||||
LogMore_ -f "begin $*"
|
||||
optsBegin
|
||||
optsAdd 'fail-tag|f' --mandatory
|
||||
optsAdd 'timeout' --optional 'timeout="${1:-10}"'
|
||||
optsAdd 'kill-timeout|kt' --mandatory --default 5
|
||||
optsAdd 'signal' --mandatory --default TERM
|
||||
optsAdd 'check-code' --mandatory --default 'kill -0 $cmdpid >&/dev/null'
|
||||
optsAdd 'kill-code' --mandatory --default '/bin/kill -$signal -- $cmdpid'
|
||||
optsAdd 'allow-skip|as' --flag
|
||||
optsAdd 'no-assert|n' --flag
|
||||
optsDone; eval "${optsCode}"
|
||||
LogMore_ -f "after opts $*"
|
||||
[[ -z "$allowskip" ]] && tcfChk
|
||||
local orig_expecode="${2:-0}"
|
||||
local expecode="$orig_expecode"
|
||||
[[ "$expecode" == "*" ]] && expecode="0-255"
|
||||
local command="$1"
|
||||
local comment="Running command '$command'"
|
||||
[[ -n "$3" ]] && comment="$3"
|
||||
[[ -n "$expecode" ]] && {
|
||||
expecode=$(echo "$expecode" | tr ',-' '\n ' | sed -e 's/^!=/!/;s/^=//;s/^<=\(.\+\)$/0 \1/;s/^>=\(.\+\)$/\1 255/;s/^<\(.\+\)$/0 \$(( \1 - 1 ))/;s/^>\(.\+\)$/\$(( \1 + 1 )) 255/' | while read line; do [[ "$line" =~ ^[^\ ]+$ ]] && echo "$line" || eval seq $line; done; )
|
||||
tcfE2R
|
||||
LogMoreLow -f "orig_expecode='$orig_expecode'"
|
||||
LogMoreLow -f "expecode='$expecode'"
|
||||
}
|
||||
tcfTry ${noassert:+--no-assert} "$comment" && {
|
||||
local errout=$(mktemp)
|
||||
LogMoreLow -f "executing '$command'"
|
||||
if [[ "$optsPresent" =~ $(echo "\<timeout\>") ]]; then
|
||||
LogDebug -f "using watchdog feature"
|
||||
local ec="$(mktemp)"
|
||||
eval "$command; echo $? > $ec 2> >(tee $errout)" &
|
||||
local cmdpid=$!
|
||||
local time_start=$(date +%s)
|
||||
local timeout_t=$(( $time_start + $timeout ))
|
||||
while true; do
|
||||
if ! eval "$checkcode"; then
|
||||
Log "command finished in $(($(date +%s) - $time_start )) seconds"
|
||||
local res="$(cat $ec)"
|
||||
break
|
||||
elif [[ $(date +%s) -ge $timeout_t ]]; then
|
||||
echo
|
||||
Log "command is still running, sending $signal signal"
|
||||
eval "$killcode"
|
||||
tcfNOK 255
|
||||
echo 255 > $ec
|
||||
let timeout_t+=killtimeout
|
||||
signal=KILL
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
rm -f $ec
|
||||
else
|
||||
eval "$command" 2> >(tee $errout)
|
||||
local res=$?
|
||||
fi
|
||||
LogMoreLow -f "got '$res'"
|
||||
local resmatch=$(echo "$expecode" | grep "^\!\?${res}$")
|
||||
LogMoreLow -f "resmatch='$resmatch'"
|
||||
[[ -n "$resmatch" && ! "$resmatch" =~ '!' ]]
|
||||
if tcfE2R; then
|
||||
! grep -iq "command not found" $errout || { failtag='WARNING'; tcfNOK; }
|
||||
else
|
||||
Log "Expected result was '$orig_expecode', got '$res'!"
|
||||
fi
|
||||
tcfFin ${failtag:+--fail-tag "$failtag"}; }
|
||||
rm -f $errout
|
||||
[[ -z "$allowskip" ]] && tcfFin
|
||||
LogMore_ -f "end $*"
|
||||
return $res
|
||||
}; # end of tcfRun }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Functions for logging
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# tcfAssert0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
tcfAssert0() {
|
||||
LogMoreLow -f "begin '$*'"
|
||||
local RES="${3:-FAIL}"
|
||||
[[ $2 -eq 0 ]] && RES='PASS'
|
||||
Log "$1" $RES
|
||||
LogMoreLow -f "end"
|
||||
}; # end of tcfAssert0 }}}
|
||||
|
||||
|
||||
# tcfCheckFinal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfCheckFinal
|
||||
|
||||
Check that all tcfTry / tcfChk functions have been close by tcfFin.
|
||||
|
||||
tcfCheckFinal
|
||||
|
||||
=cut
|
||||
|
||||
tcfCheckFinal() {
|
||||
tcfAssert0 "Check that TCF block cache is empty" ${#__INTERNAL_tcf_current_level_data[@]}
|
||||
tcfAssert0 "Check that TCF current level is 0" $__INTERNAL_tcf_current_level_val
|
||||
}; # end of tcfCheckFinal }}}
|
||||
|
||||
|
||||
echo "done."
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head2 Self check functions
|
||||
|
||||
=cut
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# tcfSelfCheck {{{
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 tcfSelfCheck
|
||||
|
||||
Does some basic functionality tests.
|
||||
|
||||
tcfSelfCheck
|
||||
|
||||
The function is called also by the following command:
|
||||
|
||||
./lib.sh selfcheck
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
tcfSelfCheck() {
|
||||
tcfChk "check 1" &&{
|
||||
tcfTry "try 1.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 1.2 - false" &&{
|
||||
false
|
||||
tcfFin;}
|
||||
tcfTry "try 1.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfChk "check 2" &&{
|
||||
tcfTry "try 2.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 2.2 - true - ignore" &&{
|
||||
true
|
||||
tcfFin -i;}
|
||||
tcfTry "try 2.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfChk "check 3" &&{
|
||||
tcfTry "try 3.1 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfTry "try 3.2 - false - ignore" &&{
|
||||
false
|
||||
tcfFin -i;}
|
||||
tcfTry "try 3.3 - true" &&{
|
||||
true
|
||||
tcfFin;}
|
||||
tcfFin;}
|
||||
tcfCheckFinal
|
||||
tcfAssert0 "Overall result" $(tcfRES -p)
|
||||
LogReport
|
||||
}
|
||||
if [[ "$1" == "selfcheck" ]]; then
|
||||
tcfSelfCheck
|
||||
fi; # end of tcfSelfCheck }}}
|
||||
|
||||
|
||||
# tcfLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
tcfLibraryLoaded() {
|
||||
rlImport distribution/Log
|
||||
declare -F rlDie > /dev/null && {
|
||||
#rlJournalStart
|
||||
#rlPhaseStartSetup "TCF"
|
||||
echo -e "\nrunning inside the beakerlib - using rlAssert0"
|
||||
true; tcfAssert0() {
|
||||
local text="$1"
|
||||
[[ "$3" != "FAIL" && "$3" != "PASS" ]] && text="$text - $3"
|
||||
__INTERNAL_ConditionalAssert "$text" "$2"
|
||||
}
|
||||
__INTERNAL_tcf_do_hack
|
||||
#rlPhaseEnd
|
||||
#rlJournalEnd
|
||||
};
|
||||
if declare -F rlE2R >& /dev/null; then
|
||||
__INTERNAL_tcf_kill_old_plugin
|
||||
fi
|
||||
true
|
||||
}; # end of tcfLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
|
@ -0,0 +1,60 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /distribution/Library/testUser
|
||||
# Description: Block style coding with ability of skipping parts.
|
||||
# Author: Dalibor Pospisil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/distribution/Library/testUser
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) lib.sh Makefile
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Dalibor Pospisil <dapospis@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: Setup/cleanup standard testing user." >> $(METADATA)
|
||||
@echo "Type: Library" >> $(METADATA)
|
||||
@echo "TestTime: 5m" >> $(METADATA)
|
||||
@echo "RhtsRequires: library(distribution/Log)" >> $(METADATA)
|
||||
@echo "Provides: library(distribution/testUser)" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,234 @@
|
||||
#!/bin/bash
|
||||
# try-check-final.sh
|
||||
# Authors: Dalibor Pospíšil <dapospis@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# library-prefix = testUser
|
||||
# library-version = 7
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BeakerLib library testUser
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This library provide s function for maintaining testing users.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use this functionality you need to import library distribution/testUser and add
|
||||
following line to Makefile.
|
||||
|
||||
@echo "RhtsRequires: library(distribution/testUser)" >> $(METADATA)
|
||||
|
||||
=head1 VARIABLES
|
||||
|
||||
=over
|
||||
|
||||
=item testUser
|
||||
|
||||
Array of testing user login names.
|
||||
|
||||
=item testUserPasswd
|
||||
|
||||
Array of testing users passwords.
|
||||
|
||||
=item testUserUID
|
||||
|
||||
Array of testing users UIDs.
|
||||
|
||||
=item testUserGID
|
||||
|
||||
Array of testing users primary GIDs.
|
||||
|
||||
=item testUserGroup
|
||||
|
||||
Array of testing users primary group names.
|
||||
|
||||
=item testUserGIDs
|
||||
|
||||
Array of space separated testing users all GIDs.
|
||||
|
||||
=item testUserGroups
|
||||
|
||||
Array of space separated testing users all group names.
|
||||
|
||||
=item testUserGecos
|
||||
|
||||
Array of testing users gecos fields.
|
||||
|
||||
=item testUserHomeDir
|
||||
|
||||
Array of testing users home directories.
|
||||
|
||||
=item testUserShell
|
||||
|
||||
Array of testing users default shells.
|
||||
|
||||
=back
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=cut
|
||||
|
||||
echo -n "loading library testUser... "
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head3 testUserSetup, testUserCleanup
|
||||
|
||||
Creates/removes testing user(s).
|
||||
|
||||
rlPhaseStartSetup
|
||||
testUserSetup [NUM]
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
testUserCleanup
|
||||
rlPhaseEnd
|
||||
|
||||
=over
|
||||
|
||||
=item NUM
|
||||
|
||||
Optional number of user to be created. If not specified one user is created.
|
||||
|
||||
=back
|
||||
|
||||
Returns 0 if success.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
testUserSetup() {
|
||||
# parameter dictates how many users should be created, defaults to 1
|
||||
local res=0
|
||||
local count_created=0
|
||||
local count_wanted=${1:-"1"}
|
||||
local index=0
|
||||
(( $count_wanted < 1 )) && return 1
|
||||
|
||||
while (( $count_created != $count_wanted ));do
|
||||
let index++
|
||||
local newUser="testuser${index}"
|
||||
local newUserPasswd="redhat"
|
||||
id "$newUser" &> /dev/null && continue # if user with the name exists, try again
|
||||
|
||||
# create
|
||||
useradd -m $newUser >&2 || ((res++))
|
||||
echo "$newUserPasswd" | passwd --stdin $newUser || ((res++))
|
||||
|
||||
# save the users array
|
||||
testUser+=($newUser)
|
||||
testUserPasswd+=($newUserPasswd)
|
||||
set | grep "^testUser=" > $__INTERNAL_testUser_users_file
|
||||
set | grep "^testUserPasswd=" >> $__INTERNAL_testUser_users_file
|
||||
((count_created++))
|
||||
done
|
||||
__INTERNAL_testUserRefillInfo || ((res++))
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
__INTERNAL_testUserRefillInfo() {
|
||||
local res=0
|
||||
local user
|
||||
testUserUID=()
|
||||
testUserGID=()
|
||||
testUserGroup=()
|
||||
testUserGIDs=()
|
||||
testUserGroups=()
|
||||
testUserGecos=()
|
||||
testUserHomeDir=()
|
||||
testUserShell=()
|
||||
|
||||
for user in ${testUser[@]}; do
|
||||
local ent_passwd=$(getent passwd ${user}) || ((res++))
|
||||
local users_id="$(id ${user})" || ((res++))
|
||||
# testUser is filled during user creation - already present
|
||||
# testUserPasswd is saved same way as testUser - already present
|
||||
testUserUID+=("$(echo "$ent_passwd" | cut -d ':' -f 3)")
|
||||
testUserGID+=("$(echo "$ent_passwd" | cut -d ':' -f 4)")
|
||||
testUserGroup+=("$(echo "$users_id" | sed -r 's/.*gid=(\S+).*/\1/;s/[[:digit:]]+\(//g;s/\)//g;s/,/ /g')")
|
||||
testUserGIDs+=("$(echo "$users_id" | sed -r 's/.*groups=(\S+).*/\1/;s/\([^\)]+\)//g;s/\)//g;s/,/ /g')")
|
||||
testUserGroups+=("$(echo "$users_id" | sed -r 's/.*groups=(\S+).*/\1/;s/[[:digit:]]+\(//g;s/\)//g;s/,/ /g')")
|
||||
testUserGecos+=("$(echo "$ent_passwd" | cut -d ':' -f 5)")
|
||||
testUserHomeDir+=("$(echo "$ent_passwd" | cut -d ':' -f 6)")
|
||||
testUserShell+=("$(echo "$ent_passwd" | cut -d ':' -f 7)")
|
||||
done
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
testUserCleanup() {
|
||||
local res=0
|
||||
for user in ${testUser[@]}; do
|
||||
userdel -rf "$user" >&2 || ((res++))
|
||||
done
|
||||
unset testUser
|
||||
__INTERNAL_testUserRefillInfo
|
||||
rm -f $__INTERNAL_testUser_users_file >&2 || ((res++))
|
||||
|
||||
echo ${res}
|
||||
[[ $res -eq 0 ]]
|
||||
}
|
||||
|
||||
|
||||
|
||||
# testUserLibraryLoaded ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {{{
|
||||
testUserLibraryLoaded() {
|
||||
local res=0
|
||||
# necessary init steps
|
||||
__INTERNAL_testUser_users_file="$BEAKERLIB_DIR/users"
|
||||
|
||||
# try to fill in users array with previous data
|
||||
[[ -f ${__INTERNAL_testUser_users_file} ]] && . ${__INTERNAL_testUser_users_file} >&2
|
||||
__INTERNAL_testUserRefillInfo >&2 || ((res++))
|
||||
|
||||
[[ $res -eq 0 ]]
|
||||
}; # end of testUserLibraryLoaded }}}
|
||||
|
||||
|
||||
: <<'=cut'
|
||||
=pod
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
Dalibor Pospisil <dapospis@redhat.com>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
echo "done."
|
||||
|
379
tests/sudoers-options-sanity-test/runtest.sh
Executable file
379
tests/sudoers-options-sanity-test/runtest.sh
Executable file
File diff suppressed because one or more lines are too long
53
tests/tests.yml
Normal file
53
tests/tests.yml
Normal file
@ -0,0 +1,53 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tags: [ always ]
|
||||
tasks:
|
||||
- set_fact:
|
||||
our_required_packages:
|
||||
- sudo
|
||||
- passwd # sudoers-options-sanity-test needs passwd command
|
||||
- postfix # sudoers-options-sanity-test needs mailq command
|
||||
- wget # upstream-testsuite-execution-and-rebuild-test needs wget command
|
||||
- yum-utils # upstream-testsuite-execution-and-rebuild-test needs yum-builddep command
|
||||
- rpm-build # upstream-testsuite-execution-and-rebuild-test needs rpmbuild command
|
||||
- openssh-clients # use_pty-option needs ssh command
|
||||
- expect # use_pty-option needs expect command
|
||||
- procps # run-as needs ps command
|
||||
|
||||
- hosts: localhost
|
||||
tags:
|
||||
- classic
|
||||
roles:
|
||||
- role: standard-test-beakerlib
|
||||
tests:
|
||||
- sudoers-options-sanity-test
|
||||
- upstream-testsuite-execution-and-rebuild-test
|
||||
#- use_pty-option # test logic is currently broken; maintainer is looking into it
|
||||
- run-as
|
||||
- fully-qualified-hostnames
|
||||
required_packages: "{{ our_required_packages }}"
|
||||
|
||||
- hosts: localhost
|
||||
tags:
|
||||
- container
|
||||
roles:
|
||||
- role: standard-test-beakerlib
|
||||
tests:
|
||||
- sudoers-options-sanity-test
|
||||
- upstream-testsuite-execution-and-rebuild-test
|
||||
#- use_pty-option # cannot run (needs sshd configured and running)
|
||||
- run-as
|
||||
#- fully-qualified-hostnames # cannot run (needs sshd configured and running)
|
||||
required_packages: "{{ our_required_packages }}"
|
||||
|
||||
- hosts: localhost
|
||||
tags:
|
||||
- atomic
|
||||
roles:
|
||||
- role: standard-test-beakerlib
|
||||
tests:
|
||||
- run-as
|
||||
# - sudoers-options-sanity-test # cannot run (needs to re-install package)
|
||||
# - upstream-testsuite-execution-and-rebuild-test # cannot run (needs compiler suite)
|
||||
# - use_pty-option # cannot run (needs expect)
|
||||
# - fully-qualified-hostnames # cannot run (needs expect)
|
70
tests/upstream-testsuite-execution-and-rebuild-test/Makefile
Normal file
70
tests/upstream-testsuite-execution-and-rebuild-test/Makefile
Normal file
@ -0,0 +1,70 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /CoreOS/sudo/Sanity/upstream-testsuite-execution-and-rebuild-test
|
||||
# Description: This test rebuild sudo source rpm and checks that rebuild is OK. The second - main - part is about upstream testsuite execution.
|
||||
# Author: Ales Marecek <amarecek@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/CoreOS/sudo/Sanity/upstream-testsuite-execution-and-rebuild-test
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
test -x runtest.sh || chmod a+x runtest.sh
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Ales Marecek <amarecek@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: This test rebuild sudo source rpm and checks that rebuild is OK. The second - main - part is about upstream testsuite execution." >> $(METADATA)
|
||||
@echo "Type: Sanity" >> $(METADATA)
|
||||
@echo "TestTime: 15m" >> $(METADATA)
|
||||
@echo "RunFor: sudo" >> $(METADATA)
|
||||
@echo "Requires: sudo" >> $(METADATA)
|
||||
@echo "Requires: sed" >> $(METADATA)
|
||||
@echo "Requires: grep" >> $(METADATA)
|
||||
@echo "Requires: rpm-build" >> $(METADATA)
|
||||
@echo "Requires: yum-utils" >> $(METADATA)
|
||||
@echo "Requires: make" >> $(METADATA)
|
||||
@echo "Requires: libcap-devel" >> $(METADATA)
|
||||
@echo "Requires: audit-libs-devel" >> $(METADATA)
|
||||
@echo "Priority: Normal" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
@echo "Confidential: no" >> $(METADATA)
|
||||
@echo "Destructive: no" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
@ -0,0 +1,3 @@
|
||||
PURPOSE of /CoreOS/sudo/Sanity/upstream-testsuite-execution-and-rebuild-test
|
||||
Description: This test rebuild sudo source rpm and checks that rebuild is OK. The second - main - part is about upstream testsuite execution.
|
||||
Author: Ales Marecek <amarecek@redhat.com>
|
80
tests/upstream-testsuite-execution-and-rebuild-test/runtest.sh
Executable file
80
tests/upstream-testsuite-execution-and-rebuild-test/runtest.sh
Executable file
@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# runtest.sh of /CoreOS/sudo/Sanity/upstream-testsuite-execution-and-rebuild-test
|
||||
# Description: This test rebuild sudo source rpm and checks that rebuild is OK. The second - main - part is about upstream testsuite execution.
|
||||
# Author: Ales Marecek <amarecek@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2013 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
# Include Beaker environment
|
||||
. /usr/bin/rhts-environment.sh || exit 1
|
||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||||
|
||||
PACKAGE="sudo"
|
||||
_SPEC_DIR="$(rpm --eval=%_specdir)"
|
||||
_BUILD_DIR="$(rpm --eval=%_builddir)"
|
||||
_LOG_REBUILD_F="${PACKAGE}-rebuild.log"
|
||||
_LOG_TESTSUITE_F="${PACKAGE}-testsuite.log"
|
||||
|
||||
|
||||
rlJournalStart
|
||||
rlPhaseStartSetup
|
||||
rlAssertRpm $PACKAGE
|
||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
||||
rlRun "pushd $TmpDir"
|
||||
# Source package is needed for code inspection
|
||||
rlFetchSrcForInstalled "${PACKAGE}" || yumdownloader --source "${PACKAGE}"
|
||||
rlRun "find . -size 0 -delete" 0 "Remove empty src.rpm-s"
|
||||
rlRun "yum-builddep -y --nogpgcheck ${PACKAGE}-*.src.rpm" 0 "Installing build dependencies"
|
||||
[ -d ${_BUILD_DIR} ] && rlRun "rm -rf ${_BUILD_DIR}/*" 0 "Cleaning build directory"
|
||||
rlRun "rpm -ivh ${PACKAGE}-*.src.rpm" 0 "Installing source rpm"
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartTest
|
||||
rlRun "QA_RPATHS=0x0002 rpmbuild -ba ${_SPEC_DIR}/${PACKAGE}.spec" 0 "Test: Rebuild of source '${PACKAGE}' package"
|
||||
rlGetPhaseState
|
||||
if [ $? -eq 0 ]; then
|
||||
cd ${_BUILD_DIR}/${PACKAGE}-*
|
||||
rlRun -s "make check" 0 "Test: Upstream testsuite"
|
||||
cd ${TmpDir}
|
||||
while read -r I; do
|
||||
if [[ "$I" =~ $(echo '([^:]+): .+ tests run, .+ errors, (.*)% success rate') ]]; then
|
||||
[[ "${BASH_REMATCH[2]}" == "100" ]]
|
||||
rlAssert0 "Test: Checking tests of '${BASH_REMATCH[1]}'" $?
|
||||
elif [[ "$I" =~ $(echo "([^:]+): .+ tests passed; (.+)/.+ tests failed") ]]; then
|
||||
[[ "${BASH_REMATCH[2]}" == "0" ]]
|
||||
rlAssert0 "Test: Checking tests of '${BASH_REMATCH[1]}'" $?
|
||||
fi
|
||||
done < $rlRun_LOG
|
||||
rm -f $rlRun_LOG
|
||||
else
|
||||
rlFail "Skipping testsuite part because rebuild part failed."
|
||||
fi
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
rlRun "popd"
|
||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
||||
rlPhaseEnd
|
||||
rlJournalPrintText
|
||||
rlJournalEnd
|
72
tests/use_pty-option/Makefile
Normal file
72
tests/use_pty-option/Makefile
Normal file
@ -0,0 +1,72 @@
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Makefile of /CoreOS/sudo/Sanity/use_pty-option
|
||||
# Description: checks if use_pty option in /etc/sudoers works as expected
|
||||
# Author: Milos Malik <mmalik@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2011 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
export TEST=/CoreOS/sudo/Sanity/use_pty-option
|
||||
export TESTVERSION=1.0
|
||||
|
||||
BUILT_FILES=
|
||||
|
||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE forker.sh ssh-sudo.exp
|
||||
|
||||
.PHONY: all install download clean
|
||||
|
||||
run: $(FILES) build
|
||||
./runtest.sh
|
||||
|
||||
build: $(BUILT_FILES)
|
||||
chmod a+x runtest.sh
|
||||
chmod a+x ssh-sudo.exp
|
||||
|
||||
clean:
|
||||
rm -f *~ $(BUILT_FILES)
|
||||
|
||||
include /usr/share/rhts/lib/rhts-make.include
|
||||
|
||||
$(METADATA): Makefile
|
||||
@echo "Owner: Milos Malik <mmalik@redhat.com>" > $(METADATA)
|
||||
@echo "Name: $(TEST)" >> $(METADATA)
|
||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
||||
@echo "Description: checks if use_pty option in /etc/sudoers works as expected" >> $(METADATA)
|
||||
@echo "Type: Sanity" >> $(METADATA)
|
||||
@echo "TestTime: 10m" >> $(METADATA)
|
||||
@echo "RunFor: sudo" >> $(METADATA)
|
||||
@echo "Requires: sudo" >> $(METADATA)
|
||||
@echo "Requires: iputils" >> $(METADATA)
|
||||
@echo "Requires: sed" >> $(METADATA)
|
||||
@echo "Requires: grep" >> $(METADATA)
|
||||
@echo "Requires: mktemp" >> $(METADATA)
|
||||
@echo "Requires: openssh-server" >> $(METADATA)
|
||||
@echo "Requires: openssh-clients" >> $(METADATA)
|
||||
@echo "Requires: expect" >> $(METADATA)
|
||||
@echo "Requires: shadow-utils" >> $(METADATA)
|
||||
@echo "Priority: Normal" >> $(METADATA)
|
||||
@echo "License: GPLv2" >> $(METADATA)
|
||||
@echo "Confidential: no" >> $(METADATA)
|
||||
@echo "Destructive: no" >> $(METADATA)
|
||||
|
||||
rhts-lint $(METADATA)
|
||||
|
4
tests/use_pty-option/PURPOSE
Normal file
4
tests/use_pty-option/PURPOSE
Normal file
@ -0,0 +1,4 @@
|
||||
PURPOSE of /CoreOS/sudo/Sanity/use_pty-option
|
||||
Description: checks if use_pty option in /etc/sudoers works as expected
|
||||
Author: Milos Malik <mmalik@redhat.com>
|
||||
|
5
tests/use_pty-option/forker.sh
Normal file
5
tests/use_pty-option/forker.sh
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
for i in `seq 1 10`; do
|
||||
( ping -c 10 -q www.redhat.com & )
|
||||
done
|
||||
|
76
tests/use_pty-option/runtest.sh
Executable file
76
tests/use_pty-option/runtest.sh
Executable file
@ -0,0 +1,76 @@
|
||||
#!/bin/bash
|
||||
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# runtest.sh of /CoreOS/sudo/Sanity/use_pty-option
|
||||
# Description: checks if use_pty option in /etc/sudoers works as expected
|
||||
# Author: Milos Malik <mmalik@redhat.com>
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
#
|
||||
# Copyright (c) 2011 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing
|
||||
# to use, modify, copy, or redistribute it subject to the terms
|
||||
# and conditions of the GNU General Public License version 2.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
# Include rhts environment
|
||||
. /usr/bin/rhts-environment.sh
|
||||
. /usr/share/beakerlib/beakerlib.sh
|
||||
|
||||
PACKAGE="sudo"
|
||||
USER_NAME="user${RANDOM}"
|
||||
USER_SECRET="s3kr3T${RANDOM}"
|
||||
|
||||
rlJournalStart
|
||||
rlPhaseStartSetup
|
||||
rlAssertRpm ${PACKAGE}
|
||||
OUTPUT_FILE=`mktemp`
|
||||
rlFileBackup /etc/sudoers
|
||||
rlFileBackup --clean ~/.ssh
|
||||
|
||||
rlRun "useradd ${USER_NAME}"
|
||||
rlRun "echo ${USER_SECRET} | passwd --stdin ${USER_NAME}"
|
||||
rlRun "cp ./forker.sh /home/${USER_NAME}/"
|
||||
rlRun "chown ${USER_NAME}:${USER_NAME} /home/${USER_NAME}/forker.sh"
|
||||
rlRun "chmod u+x /home/${USER_NAME}/forker.sh"
|
||||
rlRun "echo \"${USER_NAME} ALL = NOPASSWD: /home/${USER_NAME}/forker.sh\" >> /etc/sudoers"
|
||||
rlRun "sed -i 's/^.*requiretty.*$//' /etc/sudoers"
|
||||
rlRun "echo \"Defaults !requiretty\" >> /etc/sudoers"
|
||||
rlRun "> ~/.ssh/known_hosts"
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartTest "use_pty option is enabled"
|
||||
rlRun "sed -i 's/^.*use_pty.*$//' /etc/sudoers"
|
||||
rlRun "echo \"Defaults use_pty\" >> /etc/sudoers"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost ./forker.sh 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertNotGrep "ping statistics" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartTest "use_pty option is disabled"
|
||||
rlRun "sed -i 's/^.*use_pty.*$//' /etc/sudoers"
|
||||
rlRun "echo \"Defaults !use_pty\" >> /etc/sudoers"
|
||||
rlRun "./ssh-sudo.exp ${USER_NAME} ${USER_SECRET} localhost ./forker.sh 2>&1 | tee ${OUTPUT_FILE}"
|
||||
rlAssertGrep "ping statistics" ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
|
||||
rlPhaseStartCleanup
|
||||
rlRun "userdel -rf ${USER_NAME}"
|
||||
rlFileRestore
|
||||
rm -f ${OUTPUT_FILE}
|
||||
rlPhaseEnd
|
||||
rlJournalPrintText
|
||||
rlJournalEnd
|
||||
|
20
tests/use_pty-option/ssh-sudo.exp
Executable file
20
tests/use_pty-option/ssh-sudo.exp
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/expect -f
|
||||
# usage:
|
||||
# ./ssh-sudo.exp username password hostname command
|
||||
set username [lrange $argv 0 0]
|
||||
set password [lrange $argv 1 1]
|
||||
set hostname [lrange $argv 2 2]
|
||||
set command [lrange $argv 3 3]
|
||||
set timeout 15
|
||||
spawn ssh $username@$hostname sudo $command
|
||||
expect "*yes/no*" {
|
||||
send -- "yes\r"
|
||||
}
|
||||
expect "*assword*" {
|
||||
send -- "$password\r"
|
||||
}
|
||||
expect "*assword*" {
|
||||
send -- "$password\r"
|
||||
}
|
||||
expect eof
|
||||
|
Loading…
Reference in New Issue
Block a user