qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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()
> 



  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).