In response to Nelson's bug report, actually give a useful error if a
[invirt/packages/invirt-remote.git] / files / usr / sbin / sipb-xen-remote-control
1 #!/usr/bin/python
2 """
3 Sends remctl commands about a running VM to the host it's running on.
4 """
5
6 from subprocess import PIPE, Popen, call
7 import sys
8 import yaml
9
10 def main(argv):
11     if len(argv) < 3:
12         print >>sys.stderr, "usage: sipb-xen-remote-control <machine> <command>"
13         return 2
14     machine_name = argv[1]
15     command = argv[2]
16
17     p = Popen(['/usr/sbin/sipb-xen-remote-proxy-web', 'listvms'], stdout=PIPE)
18     output = p.communicate()[0]
19     if p.returncode != 0:
20         raise RuntimeError("Command '%s' returned non-zero exit status %d"
21                            % ('sipb-xen-remote-proxy-web', p.returncode)) 
22     vms = yaml.load(output, yaml.CSafeLoader)
23
24     if machine_name not in vms:
25         print >>sys.stderr, "machine '%s' is not on" % machine_name
26         return 1
27     host = vms[machine_name]['host']
28
29     p = Popen(['remctl', host, 'remote', 'control'] + argv[1:],
30               stdout=PIPE, stderr=PIPE)
31     (out, err) = p.communicate()
32     if p.returncode == 1:
33         print >>sys.stderr, "ERROR: invalid command"
34         return 1
35     sys.stderr.write(err)
36     sys.stdout.write(out)
37     return p.returncode
38
39 if __name__ == '__main__':
40     sys.exit(main(sys.argv))
41
42 # vim:et:sw=4:ts=4