Il 05/02/2014 18:35, Andreas Färber ha scritto:
Functionally it is a recursive qom-list with qom-get per non-child<>
property. Some failures needed to be handled, such as trying to read a
pointer property, which is not representable in QMP. Those print a
literal "<EXCEPTION>".

Signed-off-by: Andreas Färber <afaer...@suse.de>

I don't think it's a modern equivalent of anything. The two are just different.

"info qtree" may be focused the old concept of buses, but those buses aren't going anywhere anytime soon. "info qtree" may also be focused on the old concept of qdev properties (now "static" properties), but that's not something that cannot be fixed.

So, even though I think this script is a very welcome addition, I don't think it helps settling the question of what to do with "info qtree". IMO there's no good reason to exclude busless devices from "info qtree", and it's a bug (of course less severe than crashing, but still a bug) that the busless nand device doesn't appear there.

We can apply all three patches:

* qdev_try_create for busless devices (or alternatively abort when creating the device, qom-test will catch that)

* add qom-tree

* nand: Don't use qdev_create() in nand_init()

and still improve "info qtree" on top.

Paolo

---
 scripts/qmp/qom-tree | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100755 scripts/qmp/qom-tree

diff --git a/scripts/qmp/qom-tree b/scripts/qmp/qom-tree
new file mode 100755
index 0000000..5fd506a
--- /dev/null
+++ b/scripts/qmp/qom-tree
@@ -0,0 +1,70 @@
+#!/usr/bin/python
+##
+# QEMU Object Model test tools
+#
+# Copyright IBM, Corp. 2011
+# Copyright (c) 2013 SUSE LINUX Products GmbH
+#
+# Authors:
+#  Anthony Liguori   <aligu...@us.ibm.com>
+#  Andreas Faerber   <afaer...@suse.de>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or later.  
See
+# the COPYING file in the top-level directory.
+##
+
+import sys
+import os
+from qmp import QEMUMonitorProtocol
+
+cmd, args = sys.argv[0], sys.argv[1:]
+socket_path = None
+path = None
+prop = None
+
+def usage():
+    return '''environment variables:
+    QMP_SOCKET=<path | addr:port>
+usage:
+    %s [-h] [-s <QMP socket path | addr:port>] [<path>]
+''' % cmd
+
+def usage_error(error_msg = "unspecified error"):
+    sys.stderr.write('%s\nERROR: %s\n' % (usage(), error_msg))
+    exit(1)
+
+if len(args) > 0:
+    if args[0] == "-h":
+        print usage()
+        exit(0);
+    elif args[0] == "-s":
+        try:
+            socket_path = args[1]
+        except:
+            usage_error("missing argument: QMP socket path or address");
+        args = args[2:]
+
+if not socket_path:
+    if os.environ.has_key('QMP_SOCKET'):
+        socket_path = os.environ['QMP_SOCKET']
+    else:
+        usage_error("no QMP socket path or address given");
+
+srv = QEMUMonitorProtocol(socket_path)
+srv.connect()
+
+def list_node(path):
+    print '%s' % path
+    items = srv.command('qom-list', path=path)
+    for item in items:
+        if not item['type'].startswith('child<'):
+            try:
+                print '  %s: %s (%s)' % (item['name'], srv.command('qom-get', 
path=path, property=item['name']), item['type'])
+            except:
+                print '  %s: <EXCEPTION> (%s)' % (item['name'], item['type'])
+    print ''
+    for item in items:
+        if item['type'].startswith('child<'):
+            list_node(path + '/' + item['name'])
+
+list_node('/machine')



Reply via email to