From 474c94b81efad1b954ab789bf8a97d93cd0e74f3 Mon Sep 17 00:00:00 2001 From: Mohamad Gebai Date: Wed, 28 Feb 2018 18:12:19 -0500 Subject: [PATCH] ceph.in: handle polling commands Signed-off-by: Mohamad Gebai --- src/ceph.in | 86 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/src/ceph.in b/src/ceph.in index 7484a54dfc8..9bc8a1fcef4 100755 --- a/src/ceph.in +++ b/src/ceph.in @@ -43,6 +43,7 @@ CEPH_RELEASE_TYPE = "@CEPH_RELEASE_TYPE@" FLAG_NOFORWARD = (1 << 0) FLAG_OBSOLETE = (1 << 1) FLAG_DEPRECATED = (1 << 2) +FLAG_POLL = (1 << 4) # priorities from src/common/perf_counters.h PRIO_CRITICAL = 10 @@ -515,6 +516,56 @@ else: if line: return line +def run_and_print_cmd(target, cmdargs, valid_dict, sigdict, inbuf, verbose): + ret, outbuf, outs = json_command(cluster_handle, target=target, argdict=valid_dict, + inbuf=inbuf) + + if ret: + ret = abs(ret) + print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')), + file=sys.stderr) + if outbuf: + print(outbuf) + if outs: + print(outs, file=sys.stderr) + + return ret, outbuf, outs + + +def do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose): + ''' Validate a command, and handle the polling flag ''' + + valid_dict = validate_command(sigdict, cmdargs, verbose) + # Validate input args against list of sigs + if valid_dict: + if parsed_args.output_format: + valid_dict['format'] = parsed_args.output_format + if verbose: + print("Submitting command: ", valid_dict, file=sys.stderr) + else: + return -errno.EINVAL, '', 'invalid command' + + while True: + ret, outbuf, outs = json_command(cluster_handle, target=target, argdict=valid_dict, + inbuf=inbuf) + if 'poll' not in valid_dict or not valid_dict['poll']: + # Don't print here if it's not a polling command + break + if ret: + ret = abs(ret) + print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')), + file=sys.stderr) + break + if outbuf: + print(outbuf.decode('utf-8')) + if outs: + print(outs, file=sys.stderr) + if parsed_args.period <= 0: + break + sleep(parsed_args.period) + + return ret, outbuf, outs + def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose): """ @@ -532,14 +583,10 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose): if True: if cmdargs: - # Validate input args against list of sigs - valid_dict = validate_command(sigdict, cmdargs, verbose) - if valid_dict: - if parsed_args.output_format: - valid_dict['format'] = parsed_args.output_format - else: - return -errno.EINVAL, '', 'invalid command' + # Non interactive mode + ret, outbuf, outs = do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose) else: + # Interactive mode (ceph cli) if sys.stdin.isatty(): # do the command-interpreter looping # for input to do readline cmd editing @@ -564,30 +611,9 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose): print('Can not use \'tell\' in interactive mode.', file=sys.stderr) continue - valid_dict = validate_command(sigdict, cmdargs, verbose) - if valid_dict: - if parsed_args.output_format: - valid_dict['format'] = parsed_args.output_format - if verbose: - print("Submitting command: ", valid_dict, file=sys.stderr) - ret, outbuf, outs = json_command(cluster_handle, - target=target, - argdict=valid_dict) - if ret: - ret = abs(ret) - print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')), - file=sys.stderr) - if outbuf: - print(outbuf) - if outs: - print('Status:\n', outs, file=sys.stderr) - else: - print("Invalid command", file=sys.stderr) + do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose) - if verbose: - print("Submitting command: ", valid_dict, file=sys.stderr) - return json_command(cluster_handle, target=target, argdict=valid_dict, - inbuf=inbuf) + return ret, outbuf, outs def complete(sigdict, args, target): -- 2.47.3