From da9d2b4077ab1dceeed979ab71f0d9ed59b14266 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 24 Apr 2015 01:27:44 +0800 Subject: [PATCH] ceph.in: improve the interactive mode * if ceph is not reading from a tty, expect EOF instead of "quit" as the end of input. * do not panic at seeing the EOF * update the test case test_mon_injectargs_SI(). since we disables "ceph injectargs " in a458bd83, in which the arguments of "injectargs" are supposed to be consumed by "tell" instead. so "ceph injectargs ..." is taken as an incomplete command, and this command will bring ceph cli into the interactive mode, redirecting its stdin to /dev/null helps ceph cli quit the loop, but in a way of throwing EOFError exception. this change handles the EOF, so the "ceph injectargs ..." does not throws anymore. but the side effect is that the test fails since it expects a non-zero return code. so replace it with an equivalent "tell" command which also fails but due to the non-SI postfix. Signed-off-by: Kefu Chai --- qa/workunits/cephtool/test.sh | 9 ++++----- src/ceph.in | 33 ++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 594c80cccc6de..2c4f9a8316925 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -232,10 +232,7 @@ function test_mon_injectargs_SI() expect_config_value "mon.a" "mon_pg_warn_min_objects" 10240 ceph tell mon.a injectargs '--mon_pg_warn_min_objects 1G' expect_config_value "mon.a" "mon_pg_warn_min_objects" 1073741824 - # < /dev/null accounts for the fact that ceph will go in interactive mode - # because injectargs is discarded (actually saved for the benefit of - # a tell command that never comes) - expect_false ceph injectargs mon.a '--mon_pg_warn_min_objects 10F' < /dev/null 2> /dev/null + expect_false ceph tell mon.a injectargs '--mon_pg_warn_min_objects 10F' $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects $initial_value } @@ -446,7 +443,9 @@ function test_auth() # (almost) interactive mode echo -e 'auth add client.xx mon allow osd "allow *"\n' | ceph ceph auth get client.xx - ceph auth del client.xx + # script mode + echo 'auth del client.xx' | ceph + expect_false ceph auth get client.xx # # get / set auid diff --git a/src/ceph.in b/src/ceph.in index a56046c360d81..476839169ffff 100755 --- a/src/ceph.in +++ b/src/ceph.in @@ -333,6 +333,25 @@ def ceph_conf(parsed_args, field, name): PROMPT = 'ceph> ' +if sys.stdin.isatty(): + def read_input(): + while True: + line = raw_input(PROMPT).rstrip() + if line in ['q', 'quit', 'Q']: + return None + if line: + return line +else: + def read_input(): + while True: + line = sys.stdin.readline() + if not line: + return None + line = line.rstrip() + if line: + return line + + def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose): """ Do new-style command dance. @@ -360,18 +379,14 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose): else: return -errno.EINVAL, '', 'invalid command' else: - # do the command-interpreter looping - # for raw_input to do readline cmd editing - import readline - if sys.stdin.isatty(): - prompt = PROMPT - else: - prompt = '' + # do the command-interpreter looping + # for raw_input to do readline cmd editing + import readline while True: - interactive_input = raw_input(prompt) - if interactive_input in ['q', 'quit', 'Q']: + interactive_input = read_input() + if interactive_input is None: return 0, '', '' cmdargs = parse_cmdargs(shlex.split(interactive_input))[2] try: -- 2.39.5