qemu/scripts/qmp/qmp
<<
>>
Prefs
   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 as exc:
  95            if exc.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