+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]