Statistics
| Branch: | Revision:

root / QMP / qmp @ 1c1d46cc

History | View | Annotate | Download (3.1 kB)

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

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