Skip to content

Commit 670d644

Browse files
author
Положаев Денис Александрович
committed
IGNITE-23459 Add console input if argument presented without value for ./control.sh
1 parent a09b821 commit 670d644

File tree

7 files changed

+243
-15
lines changed

7 files changed

+243
-15
lines changed

modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ArgumentParser.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ public class ArgumentParser {
160160
/** */
161161
private final List<CLIArgument<?>> common = new ArrayList<>();
162162

163+
/** Console instance */
164+
protected final GridConsole console;
165+
163166
static {
164167
SENSITIVE_ARGUMENTS.add(CMD_PASSWORD);
165168
SENSITIVE_ARGUMENTS.add(CMD_KEYSTORE_PASSWORD);
@@ -179,16 +182,26 @@ public static boolean isSensitiveArgument(String arg) {
179182
* @param registry Supported commands.
180183
*/
181184
public ArgumentParser(IgniteLogger log, IgniteCommandRegistry registry) {
185+
this(log, registry, null);
186+
}
187+
188+
/**
189+
* @param log Logger.
190+
* @param registry Supported commands.
191+
* @param console Supported commands.
192+
*/
193+
public ArgumentParser(IgniteLogger log, IgniteCommandRegistry registry, GridConsole console) {
182194
this.log = log;
183195
this.registry = registry;
196+
this.console = console;
184197

185198
BiConsumer<String, ?> securityWarn = (name, val) -> log.info(String.format("Warning: %s is insecure. " +
186199
"Whenever possible, use interactive prompt for password (just discard %s option).", name, name));
187200

188201
arg(CMD_HOST, "HOST_OR_IP", String.class, DFLT_HOST);
189202
arg(CMD_PORT, "PORT", Integer.class, useConnectorConnection() ? DFLT_TCP_PORT : DFLT_PORT, PORT_VALIDATOR);
190203
arg(CMD_USER, "USER", String.class, null);
191-
arg(CMD_PASSWORD, "PASSWORD", String.class, null, (BiConsumer<String, String>)securityWarn);
204+
arg(CMD_PASSWORD, "PASSWORD", String.class, null, (BiConsumer<String, String>)securityWarn, true);
192205
arg(CMD_PING_INTERVAL, "PING_INTERVAL", Long.class, DFLT_PING_INTERVAL, POSITIVE_LONG);
193206
arg(CMD_PING_TIMEOUT, "PING_TIMEOUT", Long.class, DFLT_PING_TIMEOUT, POSITIVE_LONG);
194207
arg(CMD_VERBOSE, CMD_VERBOSE, boolean.class, false);
@@ -198,10 +211,10 @@ public ArgumentParser(IgniteLogger log, IgniteCommandRegistry registry) {
198211
arg(CMD_SSL_FACTORY, "SSL_FACTORY_PATH", String.class, null);
199212
arg(CMD_KEYSTORE_TYPE, "KEYSTORE_TYPE", String.class, SslContextFactory.DFLT_STORE_TYPE);
200213
arg(CMD_KEYSTORE, "KEYSTORE_PATH", String.class, null);
201-
arg(CMD_KEYSTORE_PASSWORD, "KEYSTORE_PASSWORD", char[].class, null, (BiConsumer<String, char[]>)securityWarn);
214+
arg(CMD_KEYSTORE_PASSWORD, "KEYSTORE_PASSWORD", char[].class, null, (BiConsumer<String, char[]>)securityWarn, true);
202215
arg(CMD_TRUSTSTORE_TYPE, "TRUSTSTORE_TYPE", String.class, SslContextFactory.DFLT_STORE_TYPE);
203216
arg(CMD_TRUSTSTORE, "TRUSTSTORE_PATH", String.class, null);
204-
arg(CMD_TRUSTSTORE_PASSWORD, "TRUSTSTORE_PASSWORD", char[].class, null, (BiConsumer<String, char[]>)securityWarn);
217+
arg(CMD_TRUSTSTORE_PASSWORD, "TRUSTSTORE_PASSWORD", char[].class, null, (BiConsumer<String, char[]>)securityWarn, true);
205218
arg(CMD_AUTO_CONFIRMATION, CMD_AUTO_CONFIRMATION, boolean.class, false);
206219
arg(
207220
CMD_ENABLE_EXPERIMENTAL,
@@ -210,6 +223,11 @@ public ArgumentParser(IgniteLogger log, IgniteCommandRegistry registry) {
210223
);
211224
}
212225

226+
/** */
227+
private <T> void arg(String name, String usage, Class<T> type, T dflt, BiConsumer<String, T> validator, boolean isConsoleReq) {
228+
common.add(optionalArg(name, usage, type, t -> dflt, validator, isConsoleReq));
229+
}
230+
213231
/** */
214232
private <T> void arg(String name, String usage, Class<T> type, T dflt, BiConsumer<String, T> validator) {
215233
common.add(optionalArg(name, usage, type, t -> dflt, validator));
@@ -255,7 +273,7 @@ public <A extends IgniteDataTransferObject> ConnectionAndSslParameters<A> parseA
255273

256274
CLIArgumentParser parser = createArgumentParser();
257275

258-
parser.parse(args.iterator());
276+
parser.parse(args.listIterator());
259277

260278
A arg = (A)argument(
261279
cmdPath.peek().argClass(),
@@ -348,7 +366,9 @@ private CLIArgumentParser createArgumentParser() {
348366
optional,
349367
fld.getType(),
350368
null,
351-
(name, val) -> {}
369+
(name, val) -> {},
370+
(!fld.getType().equals(Boolean.class) && !fld.getType().equals(boolean.class))
371+
&& fld.getAnnotation(Argument.class).consoleReq()
352372
);
353373

354374
List<Set<String>> grpdFlds = CommandUtils.argumentGroupsValues(cmdPath.peek().argClass());
@@ -378,6 +398,6 @@ private CLIArgumentParser createArgumentParser() {
378398

379399
namedArgs.addAll(common);
380400

381-
return new CLIArgumentParser(positionalArgs, namedArgs);
401+
return new CLIArgumentParser(positionalArgs, namedArgs, console);
382402
}
383403
}

modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public <A extends IgniteDataTransferObject> int execute(List<String> rawArgs) {
263263

264264
verbose = F.exist(rawArgs, CMD_VERBOSE::equalsIgnoreCase);
265265

266-
ConnectionAndSslParameters<A> args = new ArgumentParser(logger, registry).parseAndValidate(rawArgs);
266+
ConnectionAndSslParameters<A> args = new ArgumentParser(logger, registry, console).parseAndValidate(rawArgs);
267267

268268
cmdName = toFormattedCommandName(args.cmdPath().peekLast().getClass()).toUpperCase();
269269

modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/argument/parser/CLIArgument.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ public class CLIArgument<T> {
4747
/** */
4848
private final BiConsumer<String, T> validator;
4949

50+
/** */
51+
private final boolean isConsoleReq;
52+
5053
/** */
5154
public static <T> CLIArgument<T> optionalArg(String name, String usage, Class<T> type) {
5255
return new CLIArgument<>(name, usage, true, type, null, null);
@@ -68,6 +71,18 @@ public static <T> CLIArgument<T> optionalArg(
6871
return new CLIArgument<>(name, usage, true, type, dfltValSupplier, validator);
6972
}
7073

74+
/** */
75+
public static <T> CLIArgument<T> optionalArg(
76+
String name,
77+
String usage,
78+
Class<T> type,
79+
Function<CLIArgumentParser, T> dfltValSupplier,
80+
BiConsumer<String, T> validator,
81+
boolean isConsoleReq
82+
) {
83+
return new CLIArgument<>(name, usage, true, type, dfltValSupplier, validator, isConsoleReq);
84+
}
85+
7186
/** */
7287
public static <T> CLIArgument<T> mandatoryArg(String name, String usage, Class<T> type) {
7388
return new CLIArgument<>(name, usage, false, type, null, null);
@@ -81,6 +96,19 @@ public CLIArgument(
8196
Class<T> type,
8297
Function<CLIArgumentParser, T> dfltValSupplier,
8398
BiConsumer<String, T> validator
99+
) {
100+
this(name, usage, isOptional, type, dfltValSupplier, validator, false);
101+
}
102+
103+
/** */
104+
public CLIArgument(
105+
String name,
106+
String usage,
107+
boolean isOptional,
108+
Class<T> type,
109+
Function<CLIArgumentParser, T> dfltValSupplier,
110+
BiConsumer<String, T> validator,
111+
boolean isConsoleReq
84112
) {
85113
this.name = name;
86114
this.usage = usage;
@@ -90,6 +118,7 @@ public CLIArgument(
90118
? (type.equals(Boolean.class) ? p -> (T)Boolean.FALSE : p -> null)
91119
: dfltValSupplier;
92120
this.validator = validator;
121+
this.isConsoleReq = !type.equals(Boolean.class) && !type.equals(boolean.class) && isConsoleReq;
93122
}
94123

95124
/** */
@@ -121,4 +150,9 @@ public Function<CLIArgumentParser, T> defaultValueSupplier() {
121150
public BiConsumer<String, T> validator() {
122151
return validator == null ? EMPTY : validator;
123152
}
153+
154+
/** */
155+
public boolean isConsoleReq() {
156+
return isConsoleReq;
157+
}
124158
}

modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/argument/parser/CLIArgumentParser.java

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.HashMap;
24-
import java.util.Iterator;
2524
import java.util.LinkedHashMap;
2625
import java.util.List;
26+
import java.util.ListIterator;
2727
import java.util.Map;
28+
import java.util.Scanner;
2829
import java.util.Set;
2930
import org.apache.ignite.IgniteException;
31+
import org.apache.ignite.internal.commandline.GridConsole;
3032
import org.apache.ignite.internal.util.GridStringBuilder;
3133

3234
import static java.util.stream.Collectors.toSet;
@@ -49,20 +51,34 @@ public class CLIArgumentParser {
4951
/** */
5052
private final Map<String, Object> parsedArgs = new HashMap<>();
5153

54+
/** Console instance */
55+
protected final GridConsole console;
56+
5257
/** */
5358
public CLIArgumentParser(List<CLIArgument<?>> argConfiguration) {
5459
this(Collections.emptyList(), argConfiguration);
5560
}
5661

5762
/** */
5863
public CLIArgumentParser(
59-
List<CLIArgument<?>> positionalArgConfig,
64+
List<CLIArgument<?>> positionalArgCfg,
6065
List<CLIArgument<?>> argConfiguration
6166
) {
62-
this.positionalArgCfg = positionalArgConfig;
67+
this(positionalArgCfg, argConfiguration, null);
68+
}
69+
70+
/** */
71+
public CLIArgumentParser(
72+
List<CLIArgument<?>> positionalArgCfg,
73+
List<CLIArgument<?>> argConfiguration,
74+
GridConsole console
75+
) {
76+
this.positionalArgCfg = positionalArgCfg;
6377

6478
for (CLIArgument<?> cliArg : argConfiguration)
6579
this.argConfiguration.put(cliArg.name(), cliArg);
80+
81+
this.console = console;
6682
}
6783

6884
/**
@@ -71,7 +87,7 @@ public CLIArgumentParser(
7187
*
7288
* @param argsIter Iterator.
7389
*/
74-
public void parse(Iterator<String> argsIter) {
90+
public void parse(ListIterator<String> argsIter) {
7591
Set<String> obligatoryArgs =
7692
argConfiguration.values().stream().filter(a -> !a.optional()).map(CLIArgument::name).collect(toSet());
7793

@@ -104,10 +120,21 @@ else if (parsedArgs.get(cliArg.name()) != null)
104120

105121
boolean bool = cliArg.type().equals(Boolean.class) || cliArg.type().equals(boolean.class);
106122

107-
if (!bool && !argsIter.hasNext())
108-
throw new IllegalArgumentException("Please specify a value for argument: " + arg);
123+
String strVal;
109124

110-
String strVal = bool ? "true" : argsIter.next();
125+
if (cliArg.isConsoleReq() && console != null) {
126+
strVal = argsIter.hasNext() ? argsIter.next() : null;
127+
128+
if (strVal != null && strVal.startsWith(NAME_PREFIX))
129+
argsIter.previous();
130+
131+
if (strVal == null && !argsIter.hasNext() || strVal.startsWith(NAME_PREFIX))
132+
strVal = requestDataFromConsole(arg.substring(NAME_PREFIX.length()) + ": ");
133+
}
134+
else if (!bool && !argsIter.hasNext())
135+
throw new IllegalArgumentException("Please specify a value for argument: " + arg);
136+
else
137+
strVal = bool ? "true" : argsIter.next();
111138

112139
if (strVal != null && strVal.startsWith(NAME_PREFIX))
113140
throw new IllegalArgumentException("Unexpected value: " + strVal);
@@ -214,4 +241,20 @@ private String argNameForUsage(CLIArgument<?> arg) {
214241
else
215242
return arg.name();
216243
}
244+
245+
/**
246+
* Requests data from console with message.
247+
*
248+
* @param msg Message.
249+
* @return Input data.
250+
*/
251+
private String requestDataFromConsole(String msg) {
252+
if (console != null)
253+
return console.readLine(msg);
254+
else {
255+
Scanner scanner = new Scanner(System.in);
256+
257+
return scanner.nextLine();
258+
}
259+
}
217260
}

modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/indexreader/IgniteIndexReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ public static void main(String[] args) {
321321
return;
322322
}
323323

324-
p.parse(asList(args).iterator());
324+
p.parse(asList(args).listIterator());
325325

326326
Set<String> idxs = new HashSet<>(asList(p.get(INDEXES_ARG)));
327327

0 commit comments

Comments
 (0)