scripts/qmp-shell: use argparse

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>
master
John Snow 2021-06-07 16:06:24 -04:00
parent 90bd8eb8dc
commit 17329be2fd
1 changed files with 32 additions and 50 deletions

View File

@ -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
@ -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()