xref: /qemu/scripts/qmp/qmp (revision 72ac97cd)
1#!/usr/bin/python
2#
3# QMP command line tool
4#
5# Copyright IBM, Corp. 2011
6#
7# Authors:
8#  Anthony Liguori <aliguori@us.ibm.com>
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
13import sys, os
14from qmp import QEMUMonitorProtocol
15
16def 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
33def 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
125if __name__ == '__main__':
126    sys.exit(main(sys.argv[1:]))
127