]>
Commit | Line | Data |
---|---|---|
6f09bc96 | 1 | #!/usr/bin/python2 |
e9dbc551 JR |
2 | |
3 | from __future__ import print_function | |
4 | ||
5 | import json | |
6 | import re | |
7 | import sys | |
8 | import subprocess | |
9 | ||
10 | ||
11 | class SXPParser(object): | |
12 | tokenizer_rules = r""" (?P<open> \( ) | (?P<close> \) ) | (?P<whitespace> \s+ ) | [^()^\s]+ """ | |
13 | tokenizer_re = re.compile(tokenizer_rules, re.X) | |
14 | ||
15 | def __init__(self): | |
16 | self.stack = [] | |
17 | self.data = [] | |
18 | ||
19 | def __call__(self, input): | |
20 | for match in self.tokenizer_re.finditer(input): | |
21 | if match.group('open'): | |
22 | self.stack.append([]) | |
23 | elif match.group('close'): | |
24 | top = self.stack.pop() | |
25 | if self.stack: | |
26 | self.stack[-1].append(top) | |
27 | else: | |
28 | self.data.append(top) | |
29 | elif match.group('whitespace'): | |
30 | pass | |
31 | else: | |
32 | if self.stack: | |
33 | self.stack[-1].append(match.group()) | |
34 | return self.data | |
35 | ||
36 | ||
37 | class Data(object): | |
38 | def __call__(self, out): | |
39 | for domid, info in sorted(self.data.iteritems(), reverse=True): | |
40 | print(str(domid), *info) | |
41 | ||
42 | ||
43 | class DataJSON(Data): | |
44 | def __init__(self, p): | |
45 | s = json.loads(p) | |
46 | self.data = d = {} | |
47 | for i in s: | |
48 | domid = i['domid'] | |
49 | name = i['config']['c_info']['name'] | |
50 | d[domid] = (name, ) | |
51 | ||
52 | ||
53 | class DataSXP(Data): | |
54 | def __init__(self, p): | |
55 | s = SXPParser()(p) | |
56 | self.data = d = {} | |
57 | for i in s: | |
58 | if i and i[0] == 'domain': | |
59 | try: | |
60 | data = dict(j for j in i if len(j) == 2) | |
61 | domid = int(data['domid']) | |
62 | name = data['name'] | |
63 | if domid == 0: | |
64 | continue | |
65 | d[domid] = (name, ) | |
66 | except (KeyError, ValueError) as e: | |
67 | pass | |
68 | ||
69 | ||
70 | if __name__ == '__main__': | |
6f09bc96 | 71 | p = subprocess.check_output(('/usr/libexec/xen/bin/xen-toolstack', 'list', '-l')) |
e9dbc551 JR |
72 | if p[0] == '(': |
73 | d = DataSXP(p) | |
74 | else: | |
75 | d = DataJSON(p) | |
76 | d(sys.stdout) | |
77 |