File 0008-openSUSE-add-C-pcmk_nodes-option-to-get-list-of-node.patch of Package pssh
From 755b1ce33d6f726c54891eadb9bd61c7893f5252 Mon Sep 17 00:00:00 2001
From: Dejan Muhamedagic <dejan@suse.de>
Date: Fri, 10 Jan 2014 12:17:23 +0100
Subject: [PATCH 8/8] openSUSE: add -C/--pcmk_nodes option to get list of nodes
from Pacemaker
---
bin/pnuke | 4 +++-
bin/prsync | 4 +++-
bin/pscp | 4 +++-
bin/pslurp | 4 +++-
bin/pssh | 6 +++++-
psshlib/cli.py | 2 ++
psshlib/psshutil.py | 30 ++++++++++++++++++++++++++++++
7 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/bin/pnuke b/bin/pnuke
index 884ac25a1d35..ec314f3858e8 100755
--- a/bin/pnuke
+++ b/bin/pnuke
@@ -40,7 +40,7 @@ def parse_args():
if len(args) > 1:
parser.error('Extra arguments given after the pattern.')
- if not opts.host_files and not opts.host_strings:
+ if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes:
parser.error('Hosts not specified.')
return opts, args
@@ -93,4 +93,6 @@ if __name__ == "__main__":
if opts.host_strings:
for s in opts.host_strings:
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
+ if opts.pcmk_nodes:
+ hosts += psshutil.get_pcmk_nodes()
do_pnuke(hosts, pattern, opts)
diff --git a/bin/prsync b/bin/prsync
index 5e25786a90e8..d7868c87a945 100755
--- a/bin/prsync
+++ b/bin/prsync
@@ -52,7 +52,7 @@ def parse_args():
if len(args) < 2:
parser.error('Remote path not specified.')
- if not opts.host_files and not opts.host_strings:
+ if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes:
parser.error('Hosts not specified.')
return opts, args
@@ -117,4 +117,6 @@ if __name__ == "__main__":
if opts.host_strings:
for s in opts.host_strings:
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
+ if opts.pcmk_nodes:
+ hosts += psshutil.get_pcmk_nodes()
do_prsync(hosts, local, remote, opts)
diff --git a/bin/pscp b/bin/pscp
index d569be7d5404..4408913ce077 100755
--- a/bin/pscp
+++ b/bin/pscp
@@ -47,7 +47,7 @@ def parse_args():
if len(args) < 2:
parser.error('Remote path not specified.')
- if not opts.host_files and not opts.host_strings:
+ if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes:
parser.error('Hosts not specified.')
return opts, args
@@ -102,4 +102,6 @@ if __name__ == "__main__":
if opts.host_strings:
for s in opts.host_strings:
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
+ if opts.pcmk_nodes:
+ hosts += psshutil.get_pcmk_nodes()
do_pscp(hosts, localargs, remote, opts)
diff --git a/bin/pslurp b/bin/pslurp
index c7dece656f1b..0f17b5bc87d9 100755
--- a/bin/pslurp
+++ b/bin/pslurp
@@ -52,7 +52,7 @@ def parse_args():
if len(args) > 2:
parser.error('Extra arguments given after the local path.')
- if not opts.host_files and not opts.host_strings:
+ if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes:
parser.error('Hosts not specified.')
return opts, args
@@ -126,4 +126,6 @@ if __name__ == "__main__":
if opts.host_strings:
for s in opts.host_strings:
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
+ if opts.pcmk_nodes:
+ hosts += psshutil.get_pcmk_nodes()
do_pslurp(hosts, remote, local, opts)
diff --git a/bin/pssh b/bin/pssh
index 5b6c2a5e4661..cf02f40c2fbd 100755
--- a/bin/pssh
+++ b/bin/pssh
@@ -54,7 +54,7 @@ def parse_args():
if len(args) == 0 and not opts.send_input:
parser.error('Command not specified.')
- if not opts.host_files and not opts.host_strings:
+ if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes:
parser.error('Hosts not specified.')
return opts, args
@@ -112,6 +112,10 @@ if __name__ == "__main__":
_, e, _ = sys.exc_info()
sys.stderr.write('Could not open hosts file: %s\n' % e.strerror)
sys.exit(1)
+ if opts.pcmk_nodes:
+ hosts = psshutil.get_pcmk_nodes()
+ if not hosts:
+ sys.exit(1)
if opts.host_strings:
for s in opts.host_strings:
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
diff --git a/psshlib/cli.py b/psshlib/cli.py
index 611fadb6eb16..09e2571f3c6c 100644
--- a/psshlib/cli.py
+++ b/psshlib/cli.py
@@ -31,6 +31,8 @@ def common_parser():
parser.add_option('-H', '--host', dest='host_strings', action='append',
metavar='HOST_STRING',
help='additional host entries ("[user@]host[:port]")')
+ parser.add_option('-C', '--pcmk_nodes', dest='pcmk_nodes', action='store_true',
+ help='get nodes from pacemaker')
parser.add_option('-l', '--user', dest='user',
help='username (OPTIONAL)')
parser.add_option('-p', '--par', dest='par', type='int',
diff --git a/psshlib/psshutil.py b/psshlib/psshutil.py
index 6c67f667637e..274b3b92546c 100644
--- a/psshlib/psshutil.py
+++ b/psshlib/psshutil.py
@@ -4,6 +4,7 @@
import fcntl
import string
import sys
+import subprocess
HOST_FORMAT = 'Host format is [user@]host[:port] [user]'
@@ -98,6 +99,33 @@ def parse_host(host, default_user=None, default_port=None):
host, port = host.rsplit(':', 1)
return (host, port, user)
+def get_pcmk_nodes():
+ """Get the list of nodes from crm_node -l.
+
+ Returns a list of (host, port, user) triples.
+ """
+ hosts = []
+ if subprocess.call("which crm_node >/dev/null 2>&1", shell=True) != 0:
+ sys.stderr.write('crm_node not available\n')
+ return hosts
+ cmd = "crm_node -l"
+ p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+ try:
+ outp = p.communicate()[0]
+ p.wait()
+ rc = p.returncode
+ except IOError, msg:
+ sys.stderr.write('%s failed: %s\n' % (cmd,msg))
+ return hosts
+ if rc != 0:
+ sys.stderr.write('%s failed: exit code %d\n' % (cmd,rc))
+ return hosts
+ for s in outp.split('\n'):
+ a = s.split()
+ if len(a) < 2:
+ continue
+ hosts.append((a[1], None, None))
+ return hosts
def set_cloexec(filelike):
"""Sets the underlying filedescriptor to automatically close on exec.
@@ -106,3 +134,5 @@ def set_cloexec(filelike):
not require the close_fds option.
"""
fcntl.fcntl(filelike.fileno(), fcntl.FD_CLOEXEC, 1)
+
+# vim:ts=4:sw=4:et:
--
1.8.4