xenstore isn't even consistent in what happens on error
[invirt/packages/invirt-remote.git] / files / usr / sbin / sipb-xen-listvms
1 #!/usr/bin/python
2
3 import sys
4 import time
5 sys.path.insert(0, '/usr/lib/xen-3.1-1/lib/python')
6 from xen.lowlevel import xs
7
8 xsc = xs.xs()
9
10 def live_vms():
11     domids = set(xsc.ls('', '/local/domain'))
12     domids.discard('0')
13
14     vms = dict()
15
16     for domid in domids:
17         try:
18             name, data = get_dom(int(domid))
19         except (xs.Error, TypeError):
20             continue # went down since we started
21         if name.startswith('d_'):
22             name = name[2:]
23             vms[name] = data
24     return vms
25
26 def get_dom(domid):
27     name = xsc.read('', '/local/domain/%d/name' % domid)
28     data = dict()
29     data['domid'] = domid
30     # presence of a graphical console
31     data['console'] = xsc.read('', '/local/domain/%d/device/vfb/0/state' % domid)
32     # uptime
33     data['vm'] = xsc.read('', '/local/domain/%d/vm' % domid)
34     data['start_time'] = float(xsc.read('', '%s/start_time' % data['vm']))
35     data['uptime'] = time.time()-data['start_time']
36     
37     return name, data
38
39 if __name__ == '__main__':
40     vms = live_vms()
41     if '--json' in sys.argv[1:]:
42         import cjson
43         print cjson.encode(vms)
44     elif '--pickle' in sys.argv[1:]:
45         import cPickle
46         cPickle.dump(vms, sys.stdout, cPickle.HIGHEST_PROTOCOL)
47     else:
48         import yaml
49         print yaml.dump(vms, Dumper=yaml.CSafeDumper, default_flow_style=False)