root / QMP / qmp @ d7582078
History | View | Annotate | Download (3.1 kB)
1 | 1c1d46cc | Mark Wu | #!/usr/bin/python |
---|---|---|---|
2 | 1c1d46cc | Mark Wu | # |
3 | 1c1d46cc | Mark Wu | # QMP command line tool |
4 | 1c1d46cc | Mark Wu | # |
5 | 1c1d46cc | Mark Wu | # Copyright IBM, Corp. 2011 |
6 | 1c1d46cc | Mark Wu | # |
7 | 1c1d46cc | Mark Wu | # Authors: |
8 | 1c1d46cc | Mark Wu | # Anthony Liguori <aliguori@us.ibm.com> |
9 | 1c1d46cc | Mark Wu | # |
10 | 1c1d46cc | Mark Wu | # This work is licensed under the terms of the GNU GPLv2 or later. |
11 | 1c1d46cc | Mark Wu | # See the COPYING file in the top-level directory. |
12 | 1c1d46cc | Mark Wu | |
13 | 1c1d46cc | Mark Wu | import sys, os |
14 | 1c1d46cc | Mark Wu | from qmp import QEMUMonitorProtocol |
15 | 1c1d46cc | Mark Wu | |
16 | 1c1d46cc | Mark Wu | def print_response(rsp, prefix=[]): |
17 | 1c1d46cc | Mark Wu | if type(rsp) == list: |
18 | 1c1d46cc | Mark Wu | i = 0 |
19 | 1c1d46cc | Mark Wu | for item in rsp: |
20 | 1c1d46cc | Mark Wu | if prefix == []: |
21 | 1c1d46cc | Mark Wu | prefix = ['item'] |
22 | 1c1d46cc | Mark Wu | print_response(item, prefix[:-1] + ['%s[%d]' % (prefix[-1], i)]) |
23 | 1c1d46cc | Mark Wu | i += 1 |
24 | 1c1d46cc | Mark Wu | elif type(rsp) == dict: |
25 | 1c1d46cc | Mark Wu | for key in rsp.keys(): |
26 | 1c1d46cc | Mark Wu | print_response(rsp[key], prefix + [key]) |
27 | 1c1d46cc | Mark Wu | else: |
28 | 1c1d46cc | Mark Wu | if len(prefix): |
29 | 1c1d46cc | Mark Wu | print '%s: %s' % ('.'.join(prefix), rsp) |
30 | 1c1d46cc | Mark Wu | else: |
31 | 1c1d46cc | Mark Wu | print '%s' % (rsp) |
32 | 1c1d46cc | Mark Wu | |
33 | 1c1d46cc | Mark Wu | def main(args): |
34 | 1c1d46cc | Mark Wu | path = None |
35 | 1c1d46cc | Mark Wu | |
36 | 1c1d46cc | Mark Wu | # Use QMP_PATH if it's set |
37 | 1c1d46cc | Mark Wu | if os.environ.has_key('QMP_PATH'): |
38 | 1c1d46cc | Mark Wu | path = os.environ['QMP_PATH'] |
39 | 1c1d46cc | Mark Wu | |
40 | 1c1d46cc | Mark Wu | while len(args): |
41 | 1c1d46cc | Mark Wu | arg = args[0] |
42 | 1c1d46cc | Mark Wu | |
43 | 1c1d46cc | Mark Wu | if arg.startswith('--'): |
44 | 1c1d46cc | Mark Wu | arg = arg[2:] |
45 | 1c1d46cc | Mark Wu | if arg.find('=') == -1: |
46 | 1c1d46cc | Mark Wu | value = True |
47 | 1c1d46cc | Mark Wu | else: |
48 | 1c1d46cc | Mark Wu | arg, value = arg.split('=', 1) |
49 | 1c1d46cc | Mark Wu | |
50 | 1c1d46cc | Mark Wu | if arg in ['path']: |
51 | 1c1d46cc | Mark Wu | if type(value) == str: |
52 | 1c1d46cc | Mark Wu | path = value |
53 | 1c1d46cc | Mark Wu | elif arg in ['help']: |
54 | 1c1d46cc | Mark Wu | os.execlp('man', 'man', 'qmp') |
55 | 1c1d46cc | Mark Wu | else: |
56 | 1c1d46cc | Mark Wu | print 'Unknown argument "%s"' % arg |
57 | 1c1d46cc | Mark Wu | |
58 | 1c1d46cc | Mark Wu | args = args[1:] |
59 | 1c1d46cc | Mark Wu | else: |
60 | 1c1d46cc | Mark Wu | break |
61 | 1c1d46cc | Mark Wu | |
62 | 1c1d46cc | Mark Wu | if not path: |
63 | 1c1d46cc | Mark Wu | print "QMP path isn't set, use --path=qmp-monitor-address or set QMP_PATH" |
64 | 1c1d46cc | Mark Wu | return 1 |
65 | 1c1d46cc | Mark Wu | |
66 | 1c1d46cc | Mark Wu | if len(args): |
67 | 1c1d46cc | Mark Wu | command, args = args[0], args[1:] |
68 | 1c1d46cc | Mark Wu | else: |
69 | 1c1d46cc | Mark Wu | print 'No command found' |
70 | 1c1d46cc | Mark Wu | print 'Usage: "qmp [--path=qmp-monitor-address] qmp-cmd arguments"' |
71 | 1c1d46cc | Mark Wu | return 1 |
72 | 1c1d46cc | Mark Wu | |
73 | 1c1d46cc | Mark Wu | if command in ['help']: |
74 | 1c1d46cc | Mark Wu | os.execlp('man', 'man', 'qmp') |
75 | 1c1d46cc | Mark Wu | |
76 | 1c1d46cc | Mark Wu | srv = QEMUMonitorProtocol(path) |
77 | 1c1d46cc | Mark Wu | srv.connect() |
78 | 1c1d46cc | Mark Wu | |
79 | 1c1d46cc | Mark Wu | def do_command(srv, cmd, **kwds): |
80 | 1c1d46cc | Mark Wu | rsp = srv.cmd(cmd, kwds) |
81 | 1c1d46cc | Mark Wu | if rsp.has_key('error'): |
82 | 1c1d46cc | Mark Wu | raise Exception(rsp['error']['desc']) |
83 | 1c1d46cc | Mark Wu | return rsp['return'] |
84 | 1c1d46cc | Mark Wu | |
85 | 1c1d46cc | Mark Wu | commands = map(lambda x: x['name'], do_command(srv, 'query-commands')) |
86 | 1c1d46cc | Mark Wu | |
87 | 1c1d46cc | Mark Wu | srv.close() |
88 | 1c1d46cc | Mark Wu | |
89 | 1c1d46cc | Mark Wu | if command not in commands: |
90 | 1c1d46cc | Mark Wu | fullcmd = 'qmp-%s' % command |
91 | 1c1d46cc | Mark Wu | try: |
92 | 1c1d46cc | Mark Wu | os.environ['QMP_PATH'] = path |
93 | 1c1d46cc | Mark Wu | os.execvp(fullcmd, [fullcmd] + args) |
94 | 1c1d46cc | Mark Wu | except OSError, (errno, msg): |
95 | 1c1d46cc | Mark Wu | if errno == 2: |
96 | 1c1d46cc | Mark Wu | print 'Command "%s" not found.' % (fullcmd) |
97 | 1c1d46cc | Mark Wu | return 1 |
98 | 1c1d46cc | Mark Wu | raise |
99 | 1c1d46cc | Mark Wu | return 0 |
100 | 1c1d46cc | Mark Wu | |
101 | 1c1d46cc | Mark Wu | srv = QEMUMonitorProtocol(path) |
102 | 1c1d46cc | Mark Wu | srv.connect() |
103 | 1c1d46cc | Mark Wu | |
104 | 1c1d46cc | Mark Wu | arguments = {} |
105 | 1c1d46cc | Mark Wu | for arg in args: |
106 | 1c1d46cc | Mark Wu | if not arg.startswith('--'): |
107 | 1c1d46cc | Mark Wu | print 'Unknown argument "%s"' % arg |
108 | 1c1d46cc | Mark Wu | return 1 |
109 | 1c1d46cc | Mark Wu | |
110 | 1c1d46cc | Mark Wu | arg = arg[2:] |
111 | 1c1d46cc | Mark Wu | if arg.find('=') == -1: |
112 | 1c1d46cc | Mark Wu | value = True |
113 | 1c1d46cc | Mark Wu | else: |
114 | 1c1d46cc | Mark Wu | arg, value = arg.split('=', 1) |
115 | 1c1d46cc | Mark Wu | |
116 | 1c1d46cc | Mark Wu | if arg in ['help']: |
117 | 1c1d46cc | Mark Wu | os.execlp('man', 'man', 'qmp-%s' % command) |
118 | 1c1d46cc | Mark Wu | return 1 |
119 | 1c1d46cc | Mark Wu | |
120 | 1c1d46cc | Mark Wu | arguments[arg] = value |
121 | 1c1d46cc | Mark Wu | |
122 | 1c1d46cc | Mark Wu | rsp = do_command(srv, command, **arguments) |
123 | 1c1d46cc | Mark Wu | print_response(rsp) |
124 | 1c1d46cc | Mark Wu | |
125 | 1c1d46cc | Mark Wu | if __name__ == '__main__': |
126 | 1c1d46cc | Mark Wu | sys.exit(main(sys.argv[1:])) |