Statistics
| Branch: | Revision:

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:]))