From bed209caf968dd992a7f849f8b982b4b46a0f876 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Sat, 2 Aug 2008 20:28:18 -0400 Subject: [PATCH 1/1] - use invirt.config to get hostnames - refactoring: extracted bcast() function into invirt.remote package - fixed os.rename import bug - using correct default paths in invirt-getconf svn path=/trunk/packages/sipb-xen-base/; revision=816 --- files/usr/sbin/invirt-getconf | 10 ++++++---- .../python-support/sipb-xen-base/invirt/config.py | 3 ++- .../python-support/sipb-xen-base/invirt/remote.py | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 files/usr/share/python-support/sipb-xen-base/invirt/remote.py diff --git a/files/usr/sbin/invirt-getconf b/files/usr/sbin/invirt-getconf index 4721212..bb4fd80 100755 --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -16,7 +16,7 @@ Examples: invirt-getconf authn.0.type """ -from invirt.config import load +from invirt.config import default_src_path, default_cache_path, load from sys import argv, exit, stderr, stdout from optparse import OptionParser @@ -27,10 +27,10 @@ def main(argv): parser = OptionParser(usage = '%prog [options] key', description = __doc__.strip().split('\n\n')[0]) parser.add_option('-s', '--src', - default = '/etc/invirt/master.yaml', + default = default_src_path, help = 'the source YAML configuration file to read from') parser.add_option('-c', '--cache', - default = '/var/lib/invirt/invirt.json', + default = default_cache_path, help = 'path to the JSON cache') parser.add_option('-r', '--refresh', action = 'store_true', @@ -80,8 +80,10 @@ def main(argv): print conf else: import yaml + try: dumper = yaml.CSafeDumper + except: dumper = yaml.SafeDumper yaml.dump(conf, stdout, - Dumper=yaml.CSafeDumper, default_flow_style=False) + Dumper = dumper, default_flow_style = False) except invirt_exception, ex: print >> stderr, ex return 1 diff --git a/files/usr/share/python-support/sipb-xen-base/invirt/config.py b/files/usr/share/python-support/sipb-xen-base/invirt/config.py index cead926..8648c70 100644 --- a/files/usr/share/python-support/sipb-xen-base/invirt/config.py +++ b/files/usr/share/python-support/sipb-xen-base/invirt/config.py @@ -1,5 +1,6 @@ import json from invirt.common import * +from os import rename from os.path import getmtime default_src_path = '/etc/invirt/master.yaml' @@ -74,7 +75,7 @@ def load(src_path = default_src_path, try: with_closing(file(cache_path + '.tmp', 'w')) ( lambda f: f.write(json.write(ns.cfg))) except: pass # silent failure - else: os.rename(cache_path + '.tmp', cache_path) + else: rename(cache_path + '.tmp', cache_path) except IOError: ns.cfg = with_closing(file(src_path)) ( lambda f: yaml.load(f, loader)) diff --git a/files/usr/share/python-support/sipb-xen-base/invirt/remote.py b/files/usr/share/python-support/sipb-xen-base/invirt/remote.py new file mode 100644 index 0000000..0d7dba2 --- /dev/null +++ b/files/usr/share/python-support/sipb-xen-base/invirt/remote.py @@ -0,0 +1,19 @@ +from subprocess import PIPE, Popen +from invirt.config import structs as config +import yaml + +def bcast(cmd, hosts = [h.hostname for h in config.hosts]): + """ + Given a command and a list of hostnames or IPs, issue the command to all + the nodes and return a list of (host, output) pairs (the order should be + the same as the order of the hosts). + """ + pipes = [(host, + Popen(['remctl', host, 'remote', 'web', cmd], stdout=PIPE)) + for host in hosts] + outputs = [(s, p.communicate()[0]) for (s, p) in pipes] + for (s, p) in pipes: + if p.returncode != 0: + raise RuntimeError("remctl to host %s returned non-zero exit status %d" + % (s, p.returncode)) + return [(s, yaml.load(o, yaml.CSafeLoader)) for (s, o) in outputs] -- 1.7.9.5