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