Last change
on this file since 2100 was
2045,
checked in by price, 16 years ago
|
invirt.remote.bcast: provide stderr text when remctl fails
|
File size:
1002 bytes
|
Line | |
---|
1 | from subprocess import PIPE, Popen |
---|
2 | from invirt.config import structs as config |
---|
3 | import yaml |
---|
4 | |
---|
5 | def bcast(cmd, hosts = [h.hostname for h in config.hosts]): |
---|
6 | """ |
---|
7 | Given a command and a list of hostnames or IPs, issue the command to all |
---|
8 | the nodes and return a list of (host, output) pairs (the order should be |
---|
9 | the same as the order of the hosts). |
---|
10 | """ |
---|
11 | pipes = [(host, |
---|
12 | Popen(['remctl', host, 'remote', 'web', cmd], stdout=PIPE, stderr=PIPE)) |
---|
13 | for host in hosts] |
---|
14 | outputs = dict((s, p.communicate()) for (s, p) in pipes) |
---|
15 | for (s, p) in pipes: |
---|
16 | if p.returncode != 0: |
---|
17 | if outputs[s][1].startswith('remctl: cannot connect to %s' % s): |
---|
18 | del outputs[s] |
---|
19 | else: |
---|
20 | raise RuntimeError("remctl to host %s returned non-zero exit status %d; stderr:\n%s" |
---|
21 | % (s, p.returncode, outputs[s][1])) |
---|
22 | return [(s, yaml.load(o[0], yaml.CSafeLoader)) for (s, o) in outputs.iteritems()] |
---|
Note: See
TracBrowser
for help on using the repository browser.