summaryrefslogtreecommitdiffstats
path: root/ctdb/tools/onnode
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2009-05-06 13:17:34 +1000
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2009-05-12 08:58:04 +1000
commit9616959bd6938e4c5c3713fe986c1e17cbdc574c (patch)
tree937732c8e59783b2c04a2d01c187827e3ac1d9d1 /ctdb/tools/onnode
parent9666d7bf0a87c816cb09aca8b33bfb8f15c912e9 (diff)
downloadsamba-9616959bd6938e4c5c3713fe986c1e17cbdc574c.tar.gz
samba-9616959bd6938e4c5c3713fe986c1e17cbdc574c.tar.xz
samba-9616959bd6938e4c5c3713fe986c1e17cbdc574c.zip
New option "-o <prefix>" saves stdout from each node to file <prefix>.<ip>.
Signed-off-by: Martin Schwenke <martin@meltin.net> (This used to be ctdb commit a0f5148ac749758e2dfbd6099e829c5bf1d900e6)
Diffstat (limited to 'ctdb/tools/onnode')
-rwxr-xr-xctdb/tools/onnode54
1 files changed, 36 insertions, 18 deletions
diff --git a/ctdb/tools/onnode b/ctdb/tools/onnode
index 5bb5ebbfb8..91d8ee815e 100755
--- a/ctdb/tools/onnode
+++ b/ctdb/tools/onnode
@@ -30,15 +30,16 @@ usage ()
cat >&2 <<EOF
Usage: onnode [OPTION] ... <NODES> <COMMAND> ...
options:
- -c Run in current working directory on specified nodes.
- -p Run command in parallel on specified nodes.
- -q Do not print node addresses (overrides -v).
- -v Print node address even for a single node.
- <NODES> "all", "ok" (or "healthy"), "con" (or "connected"),
- "rm" (or "recmaster");
- or a node number (0 base); or
- list (comma separated) of <NODES>; or
- range (hyphen separated) of node numbers.
+ -c Run in current working directory on specified nodes.
+ -o <prefix> Save standard output from each node to file <prefix>.<ip>
+ -p Run command in parallel on specified nodes.
+ -q Do not print node addresses (overrides -v).
+ -v Print node address even for a single node.
+ <NODES> "all", "ok" (or "healthy"), "con" (or "connected"),
+ "rm" (or "recmaster");
+ or a node number (0 base); or
+ list (comma separated) of <NODES>; or
+ range (hyphen separated) of node numbers.
EOF
exit 1
@@ -55,13 +56,14 @@ current=false
parallel=false
verbose=false
quiet=false
+prefix=""
parse_options ()
{
# $POSIXLY_CORRECT means that the command passed to onnode can
# take options and getopt won't reorder things to make them
# options ot onnode.
- local temp=$(POSIXLY_CORRECT=1 getopt -n "$prog" -o "chpqv" -l help -- "$@")
+ local temp=$(POSIXLY_CORRECT=1 getopt -n "$prog" -o "cho:pqv" -l help -- "$@")
[ $? != 0 ] && usage
@@ -70,6 +72,7 @@ parse_options ()
while true ; do
case "$1" in
-c) current=true ; shift ;;
+ -o) prefix="$2" ; shift 2 ;;
-p) parallel=true ; shift ;;
-q) quiet=true ; shift ;;
-v) verbose=true ; shift ;;
@@ -222,6 +225,26 @@ fakessh ()
CTDB_SOCKET="$1" sh -c "$2"
}
+stdout_filter ()
+{
+ if [ -n "$prefix" ] ; then
+ cat >"${prefix}.${n}"
+ elif $verbose && $parallel ; then
+ sed -e "s@^@[$n] @"
+ else
+ cat
+ fi
+}
+
+stderr_filter ()
+{
+ if $verbose && $parallel ; then
+ sed -e "s@^@[$n] @"
+ else
+ cat
+ fi
+}
+
######################################################################
parse_options "$@"
@@ -263,21 +286,16 @@ trap 'kill -TERM $pids 2>/dev/null' INT TERM
# the part of the window where it matter is very small.
retcode=0
for n in $nodes ; do
+ set -o pipefail 2>/dev/null
if $parallel ; then
- if $verbose ; then
- # pipefail is a bashism - is there some way to do this with plain sh?
- set -o pipefail 2>/dev/null
- ($SSH $ssh_opts $EXTRA_SSH_OPTS $n "$command" 2>&1 | sed -e "s@^@[$n] @" )&
- else
- $SSH $ssh_opts $EXTRA_SSH_OPTS $n "$command" &
- fi
+ { exec 3>&1 ; { $SSH $ssh_opts $EXTRA_SSH_OPTS $n "$command" | stdout_filter >&3 ; } 2>&1 | stderr_filter ; } &
pids="${pids} $!"
else
if $verbose ; then
echo >&2 ; echo ">> NODE: $n <<" >&2
fi
- $SSH $ssh_opts $EXTRA_SSH_OPTS $n "$command"
+ { exec 3>&1 ; { $SSH $ssh_opts $EXTRA_SSH_OPTS $n "$command" | stdout_filter >&3 ; } 2>&1 | stderr_filter ; }
[ $? = 0 ] || retcode=$?
fi
done