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 16f03868bdSEduardo Habkostfrom __future__ import print_function 17068cf7a4SEduardo Habkostfrom __future__ import absolute_import 18eb60aa57SAndreas Färberimport sys 19eb60aa57SAndreas Färberimport os 20068cf7a4SEduardo Habkostfrom .qmp import QEMUMonitorProtocol 21eb60aa57SAndreas Färber 22eb60aa57SAndreas Färbercmd, args = sys.argv[0], sys.argv[1:] 23eb60aa57SAndreas Färbersocket_path = None 24eb60aa57SAndreas Färberpath = None 25eb60aa57SAndreas Färberprop = None 26eb60aa57SAndreas Färber 27eb60aa57SAndreas Färberdef usage(): 28eb60aa57SAndreas Färber return '''environment variables: 29eb60aa57SAndreas Färber QMP_SOCKET=<path | addr:port> 30eb60aa57SAndreas Färberusage: 31eb60aa57SAndreas Färber %s [-h] [-s <QMP socket path | addr:port>] [<path>] 32eb60aa57SAndreas Färber''' % cmd 33eb60aa57SAndreas Färber 34eb60aa57SAndreas Färberdef usage_error(error_msg = "unspecified error"): 35eb60aa57SAndreas Färber sys.stderr.write('%s\nERROR: %s\n' % (usage(), error_msg)) 36eb60aa57SAndreas Färber exit(1) 37eb60aa57SAndreas Färber 38eb60aa57SAndreas Färberif len(args) > 0: 39eb60aa57SAndreas Färber if args[0] == "-h": 40f03868bdSEduardo Habkost print(usage()) 41eb60aa57SAndreas Färber exit(0); 42eb60aa57SAndreas Färber elif args[0] == "-s": 43eb60aa57SAndreas Färber try: 44eb60aa57SAndreas Färber socket_path = args[1] 45eb60aa57SAndreas Färber except: 46eb60aa57SAndreas Färber usage_error("missing argument: QMP socket path or address"); 47eb60aa57SAndreas Färber args = args[2:] 48eb60aa57SAndreas Färber 49eb60aa57SAndreas Färberif not socket_path: 50*d7a4228eSEduardo Habkost if 'QMP_SOCKET' in os.environ: 51eb60aa57SAndreas Färber socket_path = os.environ['QMP_SOCKET'] 52eb60aa57SAndreas Färber else: 53eb60aa57SAndreas Färber usage_error("no QMP socket path or address given"); 54eb60aa57SAndreas Färber 55eb60aa57SAndreas Färbersrv = QEMUMonitorProtocol(socket_path) 56eb60aa57SAndreas Färbersrv.connect() 57eb60aa57SAndreas Färber 58eb60aa57SAndreas Färberdef list_node(path): 59f03868bdSEduardo Habkost print('%s' % path) 60eb60aa57SAndreas Färber items = srv.command('qom-list', path=path) 61eb60aa57SAndreas Färber for item in items: 62eb60aa57SAndreas Färber if not item['type'].startswith('child<'): 63eb60aa57SAndreas Färber try: 64f03868bdSEduardo Habkost print(' %s: %s (%s)' % (item['name'], srv.command('qom-get', path=path, property=item['name']), item['type'])) 65eb60aa57SAndreas Färber except: 66f03868bdSEduardo Habkost print(' %s: <EXCEPTION> (%s)' % (item['name'], item['type'])) 67f03868bdSEduardo Habkost print('') 68eb60aa57SAndreas Färber for item in items: 69eb60aa57SAndreas Färber if item['type'].startswith('child<'): 70ff5397bcSMartin Cerveny list_node((path if (path != '/') else '') + '/' + item['name']) 71eb60aa57SAndreas Färber 72ff5397bcSMartin Cervenyif len(args) == 0: 73ff5397bcSMartin Cerveny path = '/' 74ff5397bcSMartin Cervenyelse: 75ff5397bcSMartin Cerveny path = args[0] 76ff5397bcSMartin Cerveny 77ff5397bcSMartin Cervenylist_node(path) 78