Add qemu 2.4.0
[kvmfornfv.git] / qemu / scripts / qmp / qmp
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:]))