From: John Snow <jsnow@redhat.com>
To: Dov Murik <dovmurik@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: Markus Armbruster <armbru@redhat.com>
Subject: Re: [PATCH] qmp-shell: Suppress banner and prompt when stdin is not a TTY
Date: Tue, 19 Jan 2021 15:02:50 -0500 [thread overview]
Message-ID: <f6b88346-9dac-2679-385c-17d4a0e245c4@redhat.com> (raw)
In-Reply-To: <20210117072742.119377-1-dovmurik@linux.vnet.ibm.com>
On 1/17/21 2:27 AM, Dov Murik wrote:
> Detect whether qmp-shell's standard input is not a TTY; in such case,
> assume a non-interactive mode, which suppresses the welcome banner and
> the "(QEMU)" prompt. This allows for easier consumption of qmp-shell's
> output in scripts.
>
> Example usage before this change:
>
> $ printf "query-status\nquery-kvm\n" | sudo scripts/qmp/qmp-shell qmp-unix-sock
> Welcome to the QMP low-level shell!
> Connected to QEMU 5.1.50
>
> (QEMU) {"return": {"status": "running", "singlestep": false, "running": true}}
> (QEMU) {"return": {"enabled": true, "present": true}}
> (QEMU)
>
> Example usage after this change:
>
> $ printf "query-status\nquery-kvm\n" | sudo scripts/qmp/qmp-shell qmp-unix-sock
> {"return": {"status": "running", "singlestep": false, "running": true}}
> {"return": {"enabled": true, "present": true}}
>
> Signed-off-by: Dov Murik <dovmurik@linux.vnet.ibm.com>
Hiya! I've been taking lead on modernizing a lot of our python
infrastructure, including our QMP library and qmp-shell.
(Sorry, not in MAINTAINERS yet; but I am in the process of moving these
scripts and tools over to ./python/qemu/qmp.)
This change makes me nervous, because qmp-shell is not traditionally a
component we've thought of as needing to preserve backwards-compatible
behavior. Using it as a script meant to be consumed in a headless
fashion runs a bit counter to that assumption.
I'd be less nervous if the syntax of qmp-shell was something that was
well thought-out and rigorously tested, but it's a hodge-podge of
whatever people needed at the moment. I am *very* reluctant to cement it.
Are you trying to leverage the qmp.py library from bash?
--js
> ---
>
> Notes:
> Note that this might be considered a breaking change; if users have
> automated scripts which assume that qmp-shell prints 3 lines of banner,
> this change will break their scripts. If there are special
> considerations/procedures for breaking changes, please let me know.
>
> The rationale behaind the TTY check is to imitate python's behaviour:
>
> $ python3
> Python 3.7.5 (default, Apr 19 2020, 20:18:17)
> [GCC 9.2.1 20191008] on linux
> Type "help", "copyright", "credits" or "license" for more information.
> >>> print(19+23)
> 42
> >>>
>
> $ echo 'print(19+23)' | python3
> 42
>
> scripts/qmp/qmp-shell | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
> index b4d06096ab..9336066fa8 100755
> --- a/scripts/qmp/qmp-shell
> +++ b/scripts/qmp/qmp-shell
> @@ -288,6 +288,8 @@ class QMPShell(qmp.QEMUMonitorProtocol):
> self.__completer_setup()
>
> def show_banner(self, msg='Welcome to the QMP low-level shell!'):
> + if not self._interactive:
> + return
> print(msg)
> if not self._greeting:
> print('Connected')
> @@ -300,6 +302,15 @@ class QMPShell(qmp.QEMUMonitorProtocol):
> return "TRANS> "
> return "(QEMU) "
>
> + def read_command(self, prompt):
> + if self._interactive:
> + return input(prompt)
> + else:
> + line = sys.stdin.readline()
> + if not line:
> + raise EOFError
> + return line
> +
> def read_exec_command(self, prompt):
> """
> Read and execute a command.
> @@ -307,7 +318,7 @@ class QMPShell(qmp.QEMUMonitorProtocol):
> @return True if execution was ok, return False if disconnected.
> """
> try:
> - cmdline = input(prompt)
> + cmdline = self.read_command(prompt)
> except EOFError:
> print()
> return False
> @@ -322,6 +333,9 @@ class QMPShell(qmp.QEMUMonitorProtocol):
> def set_verbosity(self, verbose):
> self._verbose = verbose
>
> + def set_interactive(self, interactive):
> + self._interactive = interactive
> +
> class HMPShell(QMPShell):
> def __init__(self, address):
> QMPShell.__init__(self, address)
> @@ -449,8 +463,9 @@ def main():
> except qemu.error:
> die('Could not connect to %s' % addr)
>
> - qemu.show_banner()
> qemu.set_verbosity(verbose)
> + qemu.set_interactive(sys.stdin.isatty())
> + qemu.show_banner()
> while qemu.read_exec_command(qemu.get_prompt()):
> pass
> qemu.close()
>
next prev parent reply other threads:[~2021-01-19 20:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-17 7:27 [PATCH] qmp-shell: Suppress banner and prompt when stdin is not a TTY Dov Murik
2021-01-19 20:02 ` John Snow [this message]
2021-01-20 8:25 ` Dov Murik
2021-01-20 9:45 ` Daniel P. Berrangé
2021-01-20 15:46 ` John Snow
2021-01-20 18:10 ` Dov Murik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f6b88346-9dac-2679-385c-17d4a0e245c4@redhat.com \
--to=jsnow@redhat.com \
--cc=armbru@redhat.com \
--cc=dovmurik@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).