On Thu, Jan 16, 2020 at 12:03:14PM +0100, Kashyap Chamarthy wrote: > On Thu, Jan 02, 2020 at 02:47:22PM +0000, Stefan Hajnoczi wrote: > > On Sat, Dec 21, 2019 at 10:02:23AM +0100, Markus Armbruster wrote: > > > Stefan Hajnoczi writes: > > [...] > > > > > 2. scripts/qmp/ contains command-line tools for QMP communication. > > > > They could use some polish and then be shipped. > > > > > > MAINTAINERS blames them on me, but they're effectively unmaintained. > > > Prerequisite for shipping: having a maintainer who actually gives a > > > damn. > > ... > > > * scripts/qmp/qmp-shell > > > > > > Half-hearted attempt at a human-friendly wrapper around the JSON > > > syntax. I have no use for this myself. > > > > I think this one is used by people. John Snow comes to mind. > > FWIW I too frequently use 'qmp-shell'. And some of the examples in this > document[1] are demonstrated with it. > > I'm reasonably happy with it (particularly the persistent history > captured in ~/.qmp-shell_history), and it has some "known issues" that > can trip up a new user. The one that immediately jumps to mind: > asynchronous events won't be printed without a prompt from the user -- > e.g. after a `blockdev-commit`, you won't see BLOCK_JOB_{READY, > COMPLETED} events printed unless you manually hit enter from the > 'qmp-shell'. > > (Not complaining; I have a long-standing TODO to make time to > investigate this.) > > [1] https://qemu.readthedocs.io/en/latest/interop/live-block-operations.html John and I discussed async events in the past. qmp-shell currently uses the input() built-in function. If we modify it with a select(2)/poll(2)-style function that monitors both stdin and the QMP socket then it could print QMP events as soon as they are received. There might be a nicer way of doing it, but pseudo-code for the idea is: def input_with_events(prompt): while True: print(prompt, end='', flush=True) readable_files = select([sys.stdin, qmp_socket]) if qmp_socket in readable_files: print_qmp_events() # stdin is ready, read a line return input() Stefan