xref: /openbmc/qemu/scripts/qmp/qom-tree (revision eb60aa57)
1*eb60aa57SAndreas Färber#!/usr/bin/python
2*eb60aa57SAndreas Färber##
3*eb60aa57SAndreas Färber# QEMU Object Model test tools
4*eb60aa57SAndreas Färber#
5*eb60aa57SAndreas Färber# Copyright IBM, Corp. 2011
6*eb60aa57SAndreas Färber# Copyright (c) 2013 SUSE LINUX Products GmbH
7*eb60aa57SAndreas Färber#
8*eb60aa57SAndreas Färber# Authors:
9*eb60aa57SAndreas Färber#  Anthony Liguori   <aliguori@amazon.com>
10*eb60aa57SAndreas Färber#  Andreas Faerber   <afaerber@suse.de>
11*eb60aa57SAndreas Färber#
12*eb60aa57SAndreas Färber# This work is licensed under the terms of the GNU GPL, version 2 or later.  See
13*eb60aa57SAndreas Färber# the COPYING file in the top-level directory.
14*eb60aa57SAndreas Färber##
15*eb60aa57SAndreas Färber
16*eb60aa57SAndreas Färberimport sys
17*eb60aa57SAndreas Färberimport os
18*eb60aa57SAndreas Färberfrom qmp import QEMUMonitorProtocol
19*eb60aa57SAndreas Färber
20*eb60aa57SAndreas Färbercmd, args = sys.argv[0], sys.argv[1:]
21*eb60aa57SAndreas Färbersocket_path = None
22*eb60aa57SAndreas Färberpath = None
23*eb60aa57SAndreas Färberprop = None
24*eb60aa57SAndreas Färber
25*eb60aa57SAndreas Färberdef usage():
26*eb60aa57SAndreas Färber    return '''environment variables:
27*eb60aa57SAndreas Färber    QMP_SOCKET=<path | addr:port>
28*eb60aa57SAndreas Färberusage:
29*eb60aa57SAndreas Färber    %s [-h] [-s <QMP socket path | addr:port>] [<path>]
30*eb60aa57SAndreas Färber''' % cmd
31*eb60aa57SAndreas Färber
32*eb60aa57SAndreas Färberdef usage_error(error_msg = "unspecified error"):
33*eb60aa57SAndreas Färber    sys.stderr.write('%s\nERROR: %s\n' % (usage(), error_msg))
34*eb60aa57SAndreas Färber    exit(1)
35*eb60aa57SAndreas Färber
36*eb60aa57SAndreas Färberif len(args) > 0:
37*eb60aa57SAndreas Färber    if args[0] == "-h":
38*eb60aa57SAndreas Färber        print usage()
39*eb60aa57SAndreas Färber        exit(0);
40*eb60aa57SAndreas Färber    elif args[0] == "-s":
41*eb60aa57SAndreas Färber        try:
42*eb60aa57SAndreas Färber            socket_path = args[1]
43*eb60aa57SAndreas Färber        except:
44*eb60aa57SAndreas Färber            usage_error("missing argument: QMP socket path or address");
45*eb60aa57SAndreas Färber        args = args[2:]
46*eb60aa57SAndreas Färber
47*eb60aa57SAndreas Färberif not socket_path:
48*eb60aa57SAndreas Färber    if os.environ.has_key('QMP_SOCKET'):
49*eb60aa57SAndreas Färber        socket_path = os.environ['QMP_SOCKET']
50*eb60aa57SAndreas Färber    else:
51*eb60aa57SAndreas Färber        usage_error("no QMP socket path or address given");
52*eb60aa57SAndreas Färber
53*eb60aa57SAndreas Färbersrv = QEMUMonitorProtocol(socket_path)
54*eb60aa57SAndreas Färbersrv.connect()
55*eb60aa57SAndreas Färber
56*eb60aa57SAndreas Färberdef list_node(path):
57*eb60aa57SAndreas Färber    print '%s' % path
58*eb60aa57SAndreas Färber    items = srv.command('qom-list', path=path)
59*eb60aa57SAndreas Färber    for item in items:
60*eb60aa57SAndreas Färber        if not item['type'].startswith('child<'):
61*eb60aa57SAndreas Färber            try:
62*eb60aa57SAndreas Färber                print '  %s: %s (%s)' % (item['name'], srv.command('qom-get', path=path, property=item['name']), item['type'])
63*eb60aa57SAndreas Färber            except:
64*eb60aa57SAndreas Färber                print '  %s: <EXCEPTION> (%s)' % (item['name'], item['type'])
65*eb60aa57SAndreas Färber    print ''
66*eb60aa57SAndreas Färber    for item in items:
67*eb60aa57SAndreas Färber        if item['type'].startswith('child<'):
68*eb60aa57SAndreas Färber            list_node(path + '/' + item['name'])
69*eb60aa57SAndreas Färber
70*eb60aa57SAndreas Färberlist_node('/machine')
71