X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/bfc18d40b2bbf5ae3db1db0c3ef22006eedc059a..bed209caf968dd992a7f849f8b982b4b46a0f876:/files/usr/share/python-support/sipb-xen-base/invirt/remote.py 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]