diff options
Diffstat (limited to 'tools/cluster-helper.in')
-rwxr-xr-x | tools/cluster-helper.in | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/tools/cluster-helper.in b/tools/cluster-helper.in new file mode 100755 index 0000000..d8dac6e --- /dev/null +++ b/tools/cluster-helper.in @@ -0,0 +1,201 @@ +#!@BASH_PATH@ +# +# Copyright 2011-2023 the Pacemaker project contributors +# +# The version control history for this file may have further details. +# +# This source code is licensed under the GNU General Public License version 2 +# or later (GPLv2+) WITHOUT ANY WARRANTY. +# + +hosts= +group=$cluster_name +user=root +pdsh=`which pdsh 2>/dev/null` +ssh=`which qarsh 2>/dev/null` +scp=`which qacp 2>/dev/null` +command=list +format=oneline +replace="{}" + +if [ x$ssh = "x" ]; then + ssh=ssh + scp=scp +fi + +function helptext() { + echo "cluster-helper - A tool for running commands on multiple hosts" + echo "" + echo "Attempt to use pdsh, qarsh, or ssh (in that order) to execute commands" + echo "on multiple hosts" + echo "" + echo "DSH groups can be configured and specified with -g instead of listing" + echo "the individual hosts every time" + echo "" + echo "Usage: cluster-helper [options] [command]" + echo "" + echo "Options:" + echo "--ssh Force the use of ssh instead of qarsh even if it available" + echo "-g, --group Specify the group to operate on/with" + echo "-w, --host Specify a host to operate on/with. May be specified multiple times" + echo "-f, --format Specifiy the output format When listing hosts or group contents" + echo " Allowed values: [oneline], long, short, pdsh, bullet" + echo "" + echo "" + echo "Commands:" + echo "--list format List the contents of a group in the specified format" + echo "--add name Add supplied (-w) hosts to the named group" + echo "--create name Create the named group with the supplied (-w) hosts" + echo "--run, -- Treat all subsequent arguments as a command to perform on" + echo " the specified command on the hosts or group" + echo "--xargs Run the supplied command having replaced any occurrences" + echo " of {} with the node name" + echo "" + echo "--copy file(s) host:file Pass subsequent arguments to scp or qacp" + echo " Any occurrences of {} are replaced with the node name" + echo "--key Install an ssh key" + echo "" + exit $1 +} + +while true ; do + case "$1" in + --help|-h|-\?) helptext 0;; + -x) set -x; shift;; + --ssh) ssh="ssh"; scp="scp"; pdsh=""; shift;; + -g|--group) group="$2"; shift; shift;; + -w|--host) for h in $2; do + hosts="$hosts $h"; + done + shift; shift;; + -f|--format) format=$2; shift; shift;; + -I) replace=$2; shift; shift;; + --list|list) format=$2; command=list; shift; shift;; + --add|add) command=group-add; shift;; + --create|create) group="$2", command=group-create; shift; shift;; + --run|run) command=run; shift;; + --copy|copy) command=copy; shift; break ;; + --key|key) command=key; shift; break ;; + --xargs) command=xargs; shift; break ;; + --) command=run; shift; break ;; + "") break;; + *) helptext 1;; + esac +done + +if [ x"$group" = x -a x"$hosts" = x ]; then + group=$CTS_GROUP +fi + +function expand() { + fmt=$1 + if [ x$group != x -a -f ~/.dsh/group/$group ]; then + hosts=`cat ~/.dsh/group/$group` + elif [ x$group != x ]; then + echo "Unknown group: $group" >&2 + exit 1 + fi + + if [ "x$hosts" != x -a $fmt = oneline ]; then + echo $hosts + + elif [ "x$hosts" != x -a $fmt = short ]; then + ( for h in $hosts; do + echo $h | sed 's:\..*::' + done ) | tr '\n' ' ' + echo "" + + elif [ "x$hosts" != x -a $fmt = pdsh ]; then + ( for h in $hosts; do + echo "-w $h" + done ) | tr '\n' ' ' + echo "" + + elif [ "x$hosts" != x -a $fmt = long ]; then + for h in $hosts; do + echo $h + done + + elif [ "x$hosts" != x -a $fmt = bullet ]; then + for h in $hosts; do + echo " * $h" + done + + elif [ "x$hosts" != x ]; then + echo "Unknown format: $fmt" >&2 + fi +} + +if [ $command = list ]; then + expand $format + +elif [ $command = key ]; then + hosts=`expand oneline` + for h in $hosts; do + ssh-copy-id root@$h + done + +elif [ $command = group-create ]; then + + f=`mktemp` + mkdir -p ~/.dsh/group + + if [ -f ~/.dsh/group/$group ]; then + echo "Overwriting existing group $group" + fi + + for h in $hosts; do + echo $h >> $f + done + + echo "Creating group $group in ~/.dsh/group" + sort -u $f > ~/.dsh/group/$group + rm -f $f + +elif [ $command = group-add ]; then + if [ x$group = x ]; then + echo "Please specify a group to append to" + exit 1 + fi + + f=`mktemp` + mkdir -p ~/.dsh/group + + if [ -f ~/.dsh/group/$group ]; then + cat ~/.dsh/group/$group > $f + fi + + for h in $hosts; do + echo $h >> $f + done + + echo "Appending hosts to group $group in ~/.dsh/group" + sort -u $f > ~/.dsh/group/$group + rm -f $f + +elif [ $command = run ]; then + if [ x$pdsh != x ]; then + hosts=`expand pdsh` + $pdsh -l $user $hosts -- $* + + else + hosts=`expand oneline` + for n in $hosts; do + $ssh -l $user $n -- $* < /dev/null + done + if [ x"$hosts" = x ]; then + echo "No hosts specified" + fi + fi +elif [ $command = copy ]; then + hosts=`expand oneline` + for n in $hosts; do + $scp `echo $* | sed 's@'$replace'@'$n'@'` + done + +elif [ $command = xargs ]; then + hosts=`expand oneline` + for n in $hosts; do + eval `echo $* | sed 's@'$replace'@'$n'@'` + done +fi |