2 QEMU Object Model testing tools.
4 usage: qom [-h] {set,get,list,tree,fuse} ...
6 Query and manipulate QOM data
9 -h, --help show this help message and exit
12 {set,get,list,tree,fuse}
13 set Set a QOM property value
14 get Get a QOM property value
15 list List QOM properties at a given path
16 tree Show QOM tree from a given path
17 fuse Mount a QOM tree as a FUSE filesystem
20 # Copyright John Snow 2020, for Red Hat, Inc.
21 # Copyright IBM, Corp. 2011
27 # This work is licensed under the terms of the GNU GPL, version 2 or later.
28 # See the COPYING file in the top-level directory.
30 # Based on ./scripts/qmp/qom-[set|get|tree|list]
35 from qemu.qmp import ExecuteError
37 from .qom_common import QOMCommand
41 from .qom_fuse import QOMFuse
42 except ModuleNotFoundError as _err:
43 if _err.name != 'fuse':
46 assert issubclass(QOMFuse, QOMCommand)
49 class QOMSet(QOMCommand):
51 QOM Command - Set a property to a given value.
53 usage: qom-set [-h] [--socket SOCKET] <path>.<property> <value>
55 Set a QOM property value
58 <path>.<property> QOM path and property, separated by a period '.'
59 <value> new QOM property value
62 -h, --help show this help message and exit
63 --socket SOCKET, -s SOCKET
64 QMP socket path or address (addr:port). May also be
65 set via QMP_SOCKET environment variable.
68 help = 'Set a QOM property value'
71 def configure_parser(cls, parser: argparse.ArgumentParser) -> None:
72 super().configure_parser(parser)
73 cls.add_path_prop_arg(parser)
78 help='new QOM property value'
81 def __init__(self, args: argparse.Namespace):
82 super().__init__(args)
83 self.path, self.prop = args.path_prop.rsplit('.', 1)
84 self.value = args.value
87 rsp = self.qmp.command(
97 class QOMGet(QOMCommand):
99 QOM Command - Get a property's current value.
101 usage: qom-get [-h] [--socket SOCKET] <path>.<property>
103 Get a QOM property value
105 positional arguments:
106 <path>.<property> QOM path and property, separated by a period '.'
109 -h, --help show this help message and exit
110 --socket SOCKET, -s SOCKET
111 QMP socket path or address (addr:port). May also be
112 set via QMP_SOCKET environment variable.
115 help = 'Get a QOM property value'
118 def configure_parser(cls, parser: argparse.ArgumentParser) -> None:
119 super().configure_parser(parser)
120 cls.add_path_prop_arg(parser)
122 def __init__(self, args: argparse.Namespace):
123 super().__init__(args)
125 tmp = args.path_prop.rsplit('.', 1)
126 except ValueError as err:
127 raise ValueError('Invalid format for <path>.<property>') from err
131 def run(self) -> int:
132 rsp = self.qmp.command(
137 if isinstance(rsp, dict):
138 for key, value in rsp.items():
139 print(f"{key}: {value}")
145 class QOMList(QOMCommand):
147 QOM Command - List the properties at a given path.
149 usage: qom-list [-h] [--socket SOCKET] <path>
151 List QOM properties at a given path
153 positional arguments:
157 -h, --help show this help message and exit
158 --socket SOCKET, -s SOCKET
159 QMP socket path or address (addr:port). May also be
160 set via QMP_SOCKET environment variable.
163 help = 'List QOM properties at a given path'
166 def configure_parser(cls, parser: argparse.ArgumentParser) -> None:
167 super().configure_parser(parser)
175 def __init__(self, args: argparse.Namespace):
176 super().__init__(args)
177 self.path = args.path
179 def run(self) -> int:
180 rsp = self.qom_list(self.path)
183 print(f"{item.name}/")
185 print(f"@{item.name}/")
191 class QOMTree(QOMCommand):
193 QOM Command - Show the full tree below a given path.
195 usage: qom-tree [-h] [--socket SOCKET] [<path>]
197 Show QOM tree from a given path
199 positional arguments:
203 -h, --help show this help message and exit
204 --socket SOCKET, -s SOCKET
205 QMP socket path or address (addr:port). May also be
206 set via QMP_SOCKET environment variable.
209 help = 'Show QOM tree from a given path'
212 def configure_parser(cls, parser: argparse.ArgumentParser) -> None:
213 super().configure_parser(parser)
223 def __init__(self, args: argparse.Namespace):
224 super().__init__(args)
225 self.path = args.path
227 def _list_node(self, path: str) -> None:
229 items = self.qom_list(path)
234 rsp = self.qmp.command('qom-get', path=path,
236 print(f" {item.name}: {rsp} ({item.type})")
237 except ExecuteError as err:
238 print(f" {item.name}: <EXCEPTION: {err!s}> ({item.type})")
245 self._list_node(f"{path}/{item.name}")
247 def run(self) -> int:
248 self._list_node(self.path)
253 """QOM script main entry point."""
254 parser = argparse.ArgumentParser(
255 description='Query and manipulate QOM data'
257 subparsers = parser.add_subparsers(
258 title='QOM commands',
262 for command in QOMCommand.__subclasses__():
263 command.register(subparsers)
265 args = parser.parse_args()
267 if args.command is None:
268 parser.error('Command not specified.')
271 cmd_class = args.cmd_class
272 assert isinstance(cmd_class, type(QOMCommand))
273 return cmd_class.command_runner(args)