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