Skip to content

Commit

Permalink
scripts/qmp-shell: use argparse
Browse files Browse the repository at this point in the history
Use argparse instead of an open-coded CLI parser, for consistency with
everything else.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 20210607200649.1840382-18-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
  • Loading branch information
jnsnow committed Jun 18, 2021
1 parent 90bd8eb commit 17329be
Showing 1 changed file with 33 additions and 51 deletions.
84 changes: 33 additions & 51 deletions scripts/qmp/qmp-shell
Expand Up @@ -64,7 +64,7 @@
# Use the -v and -p options to activate the verbose and pretty-print options,
# which will echo back the properly formatted JSON-compliant QMP that is being
# sent to QEMU, which is useful for debugging and documentation generation.

import argparse
import ast
import atexit
import json
Expand Down Expand Up @@ -401,65 +401,47 @@ def die(msg):
sys.exit(1)


def fail_cmdline(option=None):
if option:
sys.stderr.write('ERROR: bad command-line option \'%s\'\n' % option)
sys.stderr.write(
'qmp-shell [ -v ] [ -p ] [ -H ] [ -N ] '
'< UNIX socket path> | < TCP address:port >\n'
)
sys.stderr.write(' -v Verbose (echo command sent and received)\n')
sys.stderr.write(' -p Pretty-print JSON\n')
sys.stderr.write(' -H Use HMP interface\n')
sys.stderr.write(' -N Skip negotiate (for qemu-ga)\n')
sys.exit(1)


def main():
addr = ''
qemu = None
hmp = False
pretty = False
verbose = False
negotiate = True

parser = argparse.ArgumentParser()
parser.add_argument('-H', '--hmp', action='store_true',
help='Use HMP interface')
parser.add_argument('-N', '--skip-negotiation', action='store_true',
help='Skip negotiate (for qemu-ga)')
parser.add_argument('-v', '--verbose', action='store_true',
help='Verbose (echo commands sent and received)')
parser.add_argument('-p', '--pretty', action='store_true',
help='Pretty-print JSON')

default_server = os.environ.get('QMP_SOCKET')
parser.add_argument('qmp_server', action='store',
default=default_server,
help='< UNIX socket path | TCP address:port >')

args = parser.parse_args()
if args.qmp_server is None:
parser.error("QMP socket or TCP address must be specified")

qemu: QMPShell
try:
for arg in sys.argv[1:]:
if arg == "-H":
if qemu is not None:
fail_cmdline(arg)
hmp = True
elif arg == "-p":
pretty = True
elif arg == "-N":
negotiate = False
elif arg == "-v":
verbose = True
else:
if qemu is not None:
fail_cmdline(arg)
if hmp:
qemu = HMPShell(arg)
else:
qemu = QMPShell(arg, pretty)
addr = arg

if qemu is None:
fail_cmdline()
if args.hmp:
qemu = HMPShell(args.qmp_server)
else:
qemu = QMPShell(args.qmp_server, args.pretty)
except qmp.QMPBadPortError:
die('bad port number in command-line')
parser.error(f"Bad port number: {args.qmp_server}")
return # pycharm doesn't know error() is noreturn

try:
qemu.connect(negotiate)
qemu.connect(negotiate=not args.skip_negotiation)
except qmp.QMPConnectError:
die('Didn\'t get QMP greeting message')
die("Didn't get QMP greeting message")
except qmp.QMPCapabilitiesError:
die('Could not negotiate capabilities')
except OSError:
die('Could not connect to %s' % addr)
die("Couldn't negotiate capabilities")
except OSError as err:
die(f"Couldn't connect to {args.qmp_server}: {err!s}")

qemu.show_banner()
qemu.set_verbosity(verbose)
qemu.set_verbosity(args.verbose)
while qemu.read_exec_command(qemu.get_prompt()):
pass
qemu.close()
Expand Down

0 comments on commit 17329be

Please sign in to comment.