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