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