]>
git.proxmox.com Git - mirror_qemu.git/blob - python/qemu/utils/qom.py
bcf192f47744eedee39cc78384a19d3d50ff5bbf
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
24 # John Snow <jsnow@redhat.com>
25 # Anthony Liguori <aliguori@amazon.com>
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
)