adjust sys.path in scripts to find xen modules
[invirt/packages/invirt-remote.git] / host / usr / sbin / invirt-listvms
1 #!/usr/bin/python
2
3 import sys
4 sys.path.append('/usr/lib/xen-default/lib/python/')
5 import time
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     xenserver = None
16
17     for domid in domids:
18         try:
19             name, data = get_dom(int(domid))
20         except (xs.Error, TypeError):
21             continue # went down since we started
22         if name is None: # xenstore may not be fully populated if it hung early
23             try:
24                 if xenserver is None:
25                     from xen.xm.main import SERVER_LEGACY_XMLRPC, parseServer
26                     from xen.util.xmlrpcclient import ServerProxy
27                     serverType, serverURI = parseServer()
28                     if serverType != SERVER_LEGACY_XMLRPC:
29                         continue # we can't handle a XenAPI server yet
30                     xenserver = ServerProxy(serverURI)
31                 name = filter(lambda x: isinstance(x, list) and x[0]=='name',
32                               xenserver.xend.domain(int(domid)))[0][1]
33             except:
34                 continue # we have nothing we can show about this domain
35         if name.startswith('d_'):
36             name = name[2:]
37             vms[name] = data
38     return vms
39
40 def get_dom(domid):
41     name = xsc.read('', '/local/domain/%d/name' % domid)
42     data = dict()
43     data['domid'] = domid
44     # presence of a graphical console
45     data['console'] = xsc.read('', '/local/domain/%d/device/vfb/0/state' % domid)
46     # uptime
47     data['vm'] = xsc.read('', '/local/domain/%d/vm' % domid)
48     start_time = xsc.read('', '%s/start_time' % data['vm'])
49     if start_time is not None:
50         data['start_time'] = float(start_time)
51         data['uptime'] = time.time()-data['start_time']
52     else:
53         data['uptime'] = 0
54     # CD or autoinstall, if we're using either
55     vbds = xsc.ls('', '/local/domain/%d/device/vbd' % domid)
56     if vbds is not None:
57         for vbd in vbds:
58             dev = '/local/domain/%d/device/vbd/%s' % (domid, vbd)
59             dev_type = xsc.read('', '%s/device-type' % dev)
60             dev_params = xsc.read('', '%s/params' % xsc.read('', '%s/backend' % dev))
61             if dev_type == 'cdrom':
62                 data['cdrom'] = dev_params
63             elif dev_type == 'disk' and dev_params == '/dev/xenvg/s_install_hda':
64                 data['autoinstall'] = True
65     cmdline = xsc.read('', '%s/image/cmdline' % data['vm'])
66     if cmdline is not None and 'auto=true' in cmdline:
67         data['autoinstall'] = True
68
69     return name, data
70
71 if __name__ == '__main__':
72     vms = live_vms()
73     if '--json' in sys.argv[1:]:
74         import cjson
75         print cjson.encode(vms)
76     elif '--pickle' in sys.argv[1:]:
77         import cPickle
78         cPickle.dump(vms, sys.stdout, cPickle.HIGHEST_PROTOCOL)
79     else:
80         import yaml
81         print yaml.dump(vms, Dumper=yaml.CSafeDumper, default_flow_style=False)