blob: 116a3d789e434dadf70ea08cabd21c49cba2c237 [file] [log] [blame]
#!/bin/bash
if [ -e $PWD/cts/CTSlab.py ]; then
cts_root=$PWD/cts
elif [ -e $PWD/CTSlab.py ]; then
cts_root=$PWD
else
cts_root=`dirname $0`
fi
logfile=0
summary=0
verbose=0
pengine=0
watch=0
saved=0
tests=""
install=0
clean=0
build=0
kill=0
run=0
boot=0
setup=0
target=rhel-7
cmd=""
trace=""
custom_log=""
patterns="-e CTS:"
helpmsg=$(cat <<EOF
Usage: %s [options] {[{init|local-init|setup} [TARGET]] | [OTHER-CMDS]}
[--]help, -h show help screen and exit
-x turn on debugging
-a show relevant screen sessions and exit
-c,-g CLUSTER_NAME set the cluster name
-S show summary from the last CTS run
-s show summary for the current log (see -l)
-v increase verbosity
-p (currently unused)
-e PATTERN grep pattern to apply when 'summary' or 'watch' requested
-l print the filename of the log that would be operated on
-w continous (filtered) monitoring of the log file
-f,-sf FILE show summary for the provided log
-t TEST, [0-9]* add a test to the working set
[--]build [???] request building Pacemaker
[--]kill request termination of cluster software
[--]run request CTS run (passing remaining arguments through)
[--]boot, start request CTS run (with --boot option)
[--]clean request cleaning up after CTS run
[--]install, --inst request installing packages to get ready to run CTS
[--]setup request initialization to get ready to run CTS
trace-ls, tls list traced functions
trace-add, tadd FUNC add a function to the list of traced ones
trace-rm, trm FUNC remove a function from the list of traced ones
trace-set, tset FUNC set function(s) as the only to be traced
(f|fedora|r|rhel).* specify target distro
init, local-init [local] initialize CTS environment
--wget [local] download up-to-date CTS helpers
-- delimits tests that follow
EOF
)
while true; do
case $1 in
-h|--help|help) printf "${helpmsg}\n" "$0"; exit;;
-x) set -x; shift;;
-a)
screen -ls | grep cts
exit 0;;
-c|-g) cluster_name=$2; shift; shift;;
-S) summary=1; saved=1; shift;;
-s) summary=1; shift;;
-v) verbose=`expr $verbose + 1`; shift;;
-p) pengine=1; shift;;
-e) patterns="$patterns -e `echo $2 | sed 's/ /\\\W/g'`"; shift; shift;;
-l) logfile=1; shift;;
-w) watch=1; shift;;
-f|-sf) summary=1; custom_log=$2; shift; shift;;
-t) tests="$tests $2"; shift; shift;;
[0-9]*) tests="$tests $1"; shift;;
--build|build) build=1; shift;;
--kill|kill) kill=1; shift; break;;
--run|run) run=1; shift; break;;
--boot|boot|start) boot=1; clean=1; shift; break;;
--clean|clean) clean=1; shift;;
--inst|--install|install) install=1; clean=1; shift;;
--setup|setup) setup=1; shift;;
trace-ls|tls) cmd=$1; shift;;
trace-add|tadd|trace-rm|trm|trace-set|tset) cmd=$1; trace=$2; shift; shift;;
f*|fedora*)
target="fedora-`echo $1 | sed -e s/fedora// -e s/-// -e s/f//`"
shift;;
r|rhel) target="rhel-7"; shift;;
r*|rhel*)
target="rhel-`echo $1 | sed -e s/rhel// -e s/-// -e s/r//`"
shift;;
init|local-init)
local_root=
case $cts_root in
/*) local_root=`dirname $cts_root`;;
*) local_root=`dirname $PWD/$cts_root`;;
esac
cat << EOF > $cts_root/CTSvars.py
class CTSvars:
CTS_home="$local_root/cts"
Fencing_home="$local_root/fencing"
CRM_CONFIG_DIR="/var/lib/pacemaker/cib"
CRM_DAEMON_USER="hacluster"
CRM_DAEMON_DIR="/usr/libexec/pacemaker"
OCF_ROOT_DIR="/usr/lib/ocf"
EOF
files="extra/cluster-init extra/cluster-helper extra/cluster-clean tools/crm_report.in"
for f in $files; do
cp $local_root/$f $cts_root/
done
cp $local_root/tools/report.common.in $local_root/tools/report.common
sed -i.sed s:@localstatedir@:/var: $local_root/tools/report.common
cp $cts_root/crm_report.in $cts_root/crm_report
sed -i.sed s:@datadir@/@PACKAGE@:$local_root/tools: $cts_root/crm_report
chmod +x $cts_root/crm_report
cp $cts_root/LSBDummy.in $cts_root/LSBDummy
cp $cts_root/HBDummy.in $cts_root/HBDummy
chmod +x $local_root/fencing/fence_*
sed -i.sed s:@OCF_ROOT_DIR@:/usr/lib/ocf: $cts_root/LSBDummy $cts_root/HBDummy
echo "Make sure you add $cts_root to your PATH and set a value for \$cluster_name in .bashrc"
exit 0
;;
--wget)
files="cluster-helper cluster-init cluster-clean"
for f in $files; do
rm -f $cts_root/$f
echo "Downloading helper script $f from GitHub"
wget -O $cts_root/$f https://raw.github.com/ClusterLabs/pacemaker/master/extra/$f
chmod +x $cts_root/$f
done
shift
;;
--) shift; tests="$tests $*"; break;;
"") break;;
*) echo "Unknown argument: $1"; exit 1;;
esac
done
# Add the location of this script
export PATH="$PATH:$cts_root"
which cluster-helper &>/dev/null
if [ $? != 0 ]; then
echo $0 needs the cluster-helper script to be in your path
echo You can obtain it from: https://raw.github.com/ClusterLabs/pacemaker/master/extra/cluster-helper
exit 1
fi
which cluster-clean &>/dev/null
if [ $? != 0 ]; then
echo $0 needs the cluster-clean script to be in your path
echo You can obtain it from: https://raw.github.com/ClusterLabs/pacemaker/master/extra/cluster-clean
exit 1
fi
if [ "x$cluster_name" = x -o "x$cluster_name" = xpick ]; then
clusters=`ls -1 ~/.dsh/group/[a-z]+[0-9] | sed s/.*group.// | tr '\n' ' ' `
echo "custom) interactively define a cluster"
for i in $clusters; do
echo "$i) `cluster-helper --list short -g $i`"
done
read -p "Choose a cluster [custom]: " cluster_name
echo
fi
if [ -z $cluster_name ]; then
cluster_name=custom
fi
case $cluster_name in
custom)
read -p "Cluster name: " cluster_name
read -p "Cluster hosts: " cluster_hosts
read -p "Cluster log file: " cluster_log
cluster-helper add -g "$cluster_name" -w "$cluster_hosts"
;;
*)
cluster_hosts=`cluster-helper --list short -g $cluster_name`
cluster_log=~/cluster-$cluster_name.log;
;;
esac
if [ x$cmd != x ]; then
config=/etc/sysconfig/pacemaker
case $cmd in
trace-ls|tls)
cluster-helper -g $cluster_name -- grep PCMK_trace_functions $config
;;
trace-add|tadd)
echo "Adding $trace to PCMK_trace_functions"
cluster-helper -g $cluster_name -- sed -i "s/.*PCMK_trace_functions=/PCMK_trace_functions=$trace,/" $config
;;
trace-rm|trm)
echo "Removing $trace from PCMK_trace_functions"
cluster-helper -g $cluster_name -- sed -i "s/.*PCMK_trace_functions=\\\\\\(.*\\\\\\)$trace,\\\\\\(.*\\\\\\)/PCMK_trace_functions=\\\\\\1\\\\\\2/" $config
;;
trace-set|tset)
echo "Setting PCMK_trace_functions to '$trace'"
cluster-helper -g $cluster_name -- sed -i "s/.*PCMK_trace_functions.*/PCMK_trace_functions=$trace/" $config
;;
esac
exit 0
fi
if [ $build = 1 -a $run = 1 ]; then
install=1
clean=1
fi
if [ $build = 1 ]; then
which build-pcmk
if [ $? != 0 ]; then
echo "You'll need to write/obtain build-pcmk in order to build pacemaker from here. Skipping"
else
build-pcmk r7
rc=$?
if [ $rc != 0 ]; then
echo "Build failed: $rc"
exit $rc
fi
fi
fi
if [ $clean = 1 ]; then
rm -f $cluster_log; cluster-clean -g $cluster_name --kill
elif [ $kill = 1 ]; then
cluster-clean -g $cluster_name --kill-only
exit 0
fi
if [ $install = 1 ]; then
cluster-helper -g $cluster_name -- yum install -y pacemaker pacemaker-debuginfo pacemaker-cts libqb libqb-debuginfo
fi
if [ $setup = 1 ]; then
cluster-init -g $cluster_name $target -u --test
exit 0
elif [ $boot = 1 ]; then
$cts_root/CTSlab.py -r -c -g $cluster_name --boot
rc=$?
if [ $rc = 0 ]; then
echo "The cluster is ready..."
fi
exit $rc
elif [ $run = 1 ]; then
$cts_root/CTSlab.py -r -c -g $cluster_name 500 "$@"
exit $?
elif [ $clean = 1 ]; then
exit 0
fi
screen -ls | grep cts-$cluster_name &>/dev/null
active=$?
if [ ! -z $custom_log ]; then
cluster_log=$custom_log
fi
if [ "x$tests" != x -a "x$tests" != "x " ]; then
for t in $tests; do
echo "crm_report --cts-log $cluster_log -d -T $t"
crm_report --cts-log $cluster_log -d -T $t
done
elif [ $logfile = 1 ]; then
echo $cluster_log
elif [ $summary = 1 ]; then
files=$cluster_log
if [ $saved = 1 ]; then
files=`ls -1tr ~/CTS-*/cluster-log.txt`
fi
for f in $files; do
echo $f
case $verbose in
0) cat -n $f | grep $patterns | grep -v "CTS: debug:"
;;
1) cat -n $f | grep $patterns | grep -v "CTS:.* cmd:"
;;
*) cat -n $f | grep $patterns
;;
esac
echo ""
done
elif [ $watch = 1 ]; then
case $verbose in
0) tail -F $cluster_log | grep $patterns | grep -v "CTS: debug:"
;;
1) tail -F $cluster_log | grep $patterns | grep -v "CTS:.* cmd:"
;;
*) tail -F $cluster_log | grep $patterns
;;
esac
elif [ $active = 0 ]; then
screen -x cts-$cluster_name
else
touch $cluster_log
# . ~/.bashrc
# . $BASH_FILES/.heartbeat
export cluster_name cluster_hosts cluster_log
screen -S cts-$cluster_name bash
fi