Last change
on this file since 2417 was
2045,
checked in by price, 16 years ago
|
invirt.remote.bcast: provide stderr text when remctl fails
|
File size:
1002 bytes
|
Rev | Line | |
---|
[816] | 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, |
---|
[1598] | 12 | Popen(['remctl', host, 'remote', 'web', cmd], stdout=PIPE, stderr=PIPE)) |
---|
[816] | 13 | for host in hosts] |
---|
[1598] | 14 | outputs = dict((s, p.communicate()) for (s, p) in pipes) |
---|
[816] | 15 | for (s, p) in pipes: |
---|
| 16 | if p.returncode != 0: |
---|
[1598] | 17 | if outputs[s][1].startswith('remctl: cannot connect to %s' % s): |
---|
| 18 | del outputs[s] |
---|
| 19 | else: |
---|
[2045] | 20 | raise RuntimeError("remctl to host %s returned non-zero exit status %d; stderr:\n%s" |
---|
| 21 | % (s, p.returncode, outputs[s][1])) |
---|
[1601] | 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.