From bed209caf968dd992a7f849f8b982b4b46a0f876 Mon Sep 17 00:00:00 2001
From: Yang Zhang <y_z@mit.edu>
Date: Sat, 2 Aug 2008 20:28:18 -0400
Subject: [PATCH] - 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