Return the right output from remctls when doing a "broadcast"
[invirt/packages/invirt-remote.git] / python / remote / bcast.py
index 0d7dba2..6a00b23 100644 (file)
@@ -9,11 +9,14 @@ def bcast(cmd, hosts = [h.hostname for h in config.hosts]):
     the same as the order of the hosts).
     """
     pipes = [(host,
-              Popen(['remctl', host, 'remote', 'web', cmd], stdout=PIPE))
+              Popen(['remctl', host, 'remote', 'web', cmd], stdout=PIPE, stderr=PIPE))
              for host in hosts]
-    outputs = [(s, p.communicate()[0]) for (s, p) in pipes]
+    outputs = dict((s, p.communicate()) 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]
+            if outputs[s][1].startswith('remctl: cannot connect to %s' % s):
+                del outputs[s]
+            else:
+                raise RuntimeError("remctl to host %s returned non-zero exit status %d"
+                                   % (s, p.returncode))
+    return [(s, yaml.load(o[0], yaml.CSafeLoader)) for (s, o) in outputs.iteritems()]