[
https://issues.apache.org/jira/browse/STORM-904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14655066#comment-14655066
]
ASF GitHub Bot commented on STORM-904:
--------------------------------------
Github user caofangkun commented on a diff in the pull request:
https://github.com/apache/storm/pull/662#discussion_r36284000
--- Diff: storm-core/src/jvm/backtype/storm/utils/StormCommandExecutor.java
---
@@ -0,0 +1,785 @@
+package backtype.storm.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+import clojure.lang.IFn;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.SystemUtils;
+
+/**
+ * Created by pshah on 7/17/15.
+ */
+abstract class StormCommandExecutor {
+ final String NIMBUS_CLASS = "backtype.storm.daemon.nimbus";
+ final String SUPERVISOR_CLASS = "backtype.storm.daemon.supervisor";
+ final String UI_CLASS = "backtype.storm.ui.core";
+ final String LOGVIEWER_CLASS = "backtype.storm.daemon.logviewer";
+ final String DRPC_CLASS = "backtype.storm.daemon.drpc";
+ final String REPL_CLASS = "clojure.main";
+ final String ACTIVATE_CLASS = "backtype.storm.command.activate";
+ final String DEACTIVATE_CLASS = "backtype.storm.command.deactivate";
+ final String REBALANCE_CLASS = "backtype.storm.command.rebalance";
+ final String LIST_CLASS = "backtype.storm.command.list";
+ String stormHomeDirectory;
+ String userConfDirectory;
+ String stormConfDirectory;
+ String clusterConfDirectory;
+ String stormLibDirectory;
+ String stormBinDirectory;
+ String stormLog4jConfDirectory;
+ String configFile = "";
+ String javaCommand;
+ List<String> configOptions = new ArrayList<String>();
+ String stormExternalClasspath;
+ String stormExternalClasspathDaemon;
+ String fileSeparator;
+ final List<String> COMMANDS = Arrays.asList("jar", "kill", "shell",
+ "nimbus", "ui", "logviewer", "drpc", "supervisor",
+ "localconfvalue", "remoteconfvalue", "repl", "classpath",
+ "activate", "deactivate", "rebalance", "help", "list",
+ "dev-zookeeper", "version", "monitor", "upload-credentials",
+ "get-errors");
+
+ public static void main (String[] args) {
+ for (String arg : args) {
+ System.out.println("Argument ++ is " + arg);
+ }
+ StormCommandExecutor stormCommandExecutor;
+ if (System.getProperty("os.name").startsWith("Windows")) {
+ stormCommandExecutor = new WindowsStormCommandExecutor();
+ } else {
+ stormCommandExecutor = new UnixStormCommandExecutor();
+ }
+ stormCommandExecutor.initialize();
+ stormCommandExecutor.execute(args);
+ }
+
+ StormCommandExecutor () {
+
+ }
+
+ abstract void initialize ();
+
+ abstract void execute (String[] args);
+
+ void callMethod (String command, List<String> args) {
+ Class implementation = this.getClass();
+ String methodName = command.replace("-", "") + "Command";
+ try {
+ Method method = implementation.getDeclaredMethod(methodName,
List
+ .class);
+ method.invoke(this, args);
+ } catch (NoSuchMethodException ex) {
+ System.out.println("No such method exception occured while
trying" +
+ " to run storm method " + command);
+ } catch (IllegalAccessException ex) {
+ System.out.println("Illegal access exception occured while
trying" +
+ " to run storm method " + command);
+ } catch (IllegalArgumentException ex) {
+ System.out.println("Illegal argument exception occured while "
+
+ "trying" + " to run storm method " + command);
+ } catch (InvocationTargetException ex) {
+ System.out.println("Invocation target exception occured while
" +
+ "trying" + " to run storm method " + command);
+ }
+ }
+}
+
+class UnixStormCommandExecutor extends StormCommandExecutor {
+
+ UnixStormCommandExecutor () {
+
+ }
+
+ void initialize () {
+ Collections.sort(this.COMMANDS);
+ this.fileSeparator = System .getProperty ("file.separator");
+ this.stormHomeDirectory = System.getenv("STORM_BASE_DIR");
+ this.userConfDirectory = System.getProperty("user.home") +
+ this.fileSeparator + "" +
+ ".storm";
+ this.stormConfDirectory = System.getenv("STORM_CONF_DIR");
+ this.clusterConfDirectory = this.stormConfDirectory == null ?
(this
+ .stormHomeDirectory + this.fileSeparator + "conf") : this
+ .stormConfDirectory;
+ File f = new File(this.userConfDirectory + this.fileSeparator +
+ "storm.yaml");
+ if (!f.isFile()) {
+ this.userConfDirectory = this.clusterConfDirectory;
+ }
+ this.stormLibDirectory = this.stormHomeDirectory +
this.fileSeparator +
+ "lib";
+ this.stormBinDirectory = this.stormHomeDirectory +
this.fileSeparator +
+ "bin";
+ this.stormLog4jConfDirectory = this.stormHomeDirectory +
+ this.fileSeparator + "log4j2";
+ if (System.getenv("JAVA_HOME") != null) {
+ this.javaCommand = System.getenv("JAVA_HOME") +
this.fileSeparator +
+ "bin" + this.fileSeparator + "java";
+ if (!(new File(this.javaCommand).exists())) {
+ System.out.println("ERROR: JAVA_HOME is invalid. Could
not " +
+ "find " + this.javaCommand);
+ System.exit(1);
+ }
+ } else {
+ this.javaCommand = "java";
+ }
+ this.stormExternalClasspath = System.getenv("STORM_EXT_CLASSPATH");
+ this.stormExternalClasspathDaemon = System.getenv
+ ("STORM_EXT_CLASSPATH_DAEMON");
+ if (!(new File(this.stormLibDirectory).exists())) {
+
System.out.println("******************************************");
+ System.out.println("The storm client can only be run from
within " +
+ "a release. " + "You appear to be trying to run the
client" +
+ " from a checkout of Storm's source code.");
+ System.out.println("You can download a Storm release at " +
+ "http://storm-project.net/downloads.html");
+
System.out.println("******************************************");
+ System.exit(1);
+ }
+ //System.getProperties().list(System.out);
+ }
+
+ void execute (String[] args) {
+ if (args.length == 0) {
+ this.printUsage();
+ System.exit(-1);
+ }
+ List<String> commandArgs = new ArrayList<String>();
+ for (int i = 0; i < args.length; ++i) {
+ if (args[i] == "-c") {
+ this.configOptions.add(args[++i]);
+ } else if (args[i] == "--config") {
+ this.configFile = args[++i];
+ } else {
+ commandArgs.add(args[i]);
+ }
+ }
+ if ((commandArgs.size() == 0) || (!this.COMMANDS.contains
+ (commandArgs.get(0)))) {
+ System.out.println("Unknown command: [storm " +
StringUtils.join
+ (args, " ") + "]");
+ this.printUsage();
+ System.exit(254);
+
+ }
+ this.callMethod(commandArgs.get(0), commandArgs.subList(1,
+ commandArgs.size()));
+
+ }
+
+ String getConfigOptions() {
+ String configOptions = "-Dstorm.options=";
+ //TODO - do urlencode here. python does quote_plus to each
configoption
+ return configOptions + StringUtils.join(this.configOptions, ',');
+
+ }
+
+ List<String> getJarsFull (String directory) {
+ List<String> fullJarFiles = new ArrayList<String>();
+ File file = new File(directory);
+ File[] files = file.listFiles();
+ if (files != null) {
+ for (File f : files) {
+ if (f.getName().endsWith(".jar")) {
+ fullJarFiles.add(f.getPath());
+ }
+ }
+ }
+ return fullJarFiles;
+ }
+
+ String getClassPath (List<String> extraJars, boolean daemon) {
+ List<String> classPaths =
this.getJarsFull(this.stormHomeDirectory);
+ classPaths.addAll(this.getJarsFull(this.stormLibDirectory));
+ classPaths.addAll(this.getJarsFull(this.stormHomeDirectory + this
+ .fileSeparator + "extlib"));
+ if (daemon == true) {
+ classPaths.addAll(this.getJarsFull(this.stormHomeDirectory +
this
+ .fileSeparator + "extlib-daemon"));
+ }
+ if (this.stormExternalClasspath != null) {
+ classPaths.add(this.stormExternalClasspath);
+ }
+ if (this.stormExternalClasspathDaemon != null) {
+ classPaths.add(this.stormExternalClasspathDaemon);
+ }
+ classPaths.addAll(extraJars);
+ return StringUtils.join(classPaths, System.getProperty("path" +
+ ".separator"));
+ }
+
+ String confValue (String name, List<String> extraPaths, boolean
daemon) {
+ // The original code from python started a process that started a
jvm
+ // with backtype.storm.command.config_value main method that would
+ // read the conf value and print it out to an output stream. python
+ // tapped on to the output stream of that subprocess and returned
the
+ // confvalue for the name. Because the pythong code has been
shipped
+ // to java now it should not spawn a new process which is a jvm
since
+ // we are already in jvm. Instead it should just be doing as the
code
+ // commeneted below.
+ // However looking at the pythong code it was
+ // starting a jvm with -cp argument that had classpaths which might
+ // not be available to this java process. Hence there is a chance
+ // that the below code might break existing scripts. As a result I
+ // have decided to still spawn a new process from java just like
+ // python with similar classpaths being constructed for the jvm
+ // execution
+ /*IFn fn = Utils.loadClojureFn("backtype.storm.config",
+ "read-storm-config");
+ Object o = fn.invoke();
+ return ((Map) o).get(name).toString();*/
+ String confValue = "";
+ ProcessBuilder processBuilder = new
ProcessBuilder(this.javaCommand,
+ "-client", this.getConfigOptions(), "-Dstorm.conf.file=" +
+ this.configFile, "-cp", this.getClassPath(extraPaths,
daemon),
+ "backtype.storm.command.config_value", name);
+ BufferedReader br;
+ try {
+ Process process = processBuilder.start();
+ br = new BufferedReader(new InputStreamReader(process
+ .getInputStream(), StandardCharsets.UTF_8));
+ process.waitFor();
+ String line;
+ while ((line = br.readLine()) != null) {
+ String[] tokens = line.split(" ");
+ if ("VALUE:".equals(tokens[0])) {
+ confValue =
StringUtils.join(Arrays.copyOfRange(tokens, 1,
+ tokens.length), " ");
+ break;
+ }
+ }
+ br.close();
+ } catch (Exception ex) {
+ System.out.println("Exception occured while starting process
via " +
+ "processbuilder " + ex.getMessage());
+ }
+ return confValue;
+ }
+
+ void executeStormClass (String className, String jvmType, List<String>
+ jvmOptions, List<String> extraJars, List<String> args, boolean
+ fork, boolean daemon, String daemonName) {
+ List<String> extraPaths = new ArrayList<>();
+ extraPaths.add(this.clusterConfDirectory);
+ String stormLogDirectory = this.confValue("storm.log.dir",
+ extraPaths, daemon);
+ if ((stormLogDirectory == null) || ("".equals(stormLogDirectory))
||
+ ("nil".equals(stormLogDirectory))) {
+ stormLogDirectory = this.stormHomeDirectory +
this.fileSeparator
+ + "logs";
+ }
+ List<String> commandList = new ArrayList<String>();
+ commandList.add(this.javaCommand);
+ commandList.add(jvmType);
+ commandList.add("-Ddaemon.name=" + daemonName);
+ commandList.add(this.getConfigOptions());
+ commandList.add("-Dstorm.home=" + this.stormHomeDirectory);
+ commandList.add("-Dstorm.log.dir=" + stormLogDirectory);
+ commandList.add("-Djava.library.path=" + this
+ .confValue("java.library.path", extraJars, daemon));
+ commandList.add("-Dstorm.conf.file=" + this.configFile);
+ commandList.add("-cp");
+ commandList.add(this.getClassPath(extraJars, daemon));
+ commandList.addAll(jvmOptions);
+ commandList.add(className);
+ commandList.addAll(args);
+ ProcessBuilder processBuilder = new ProcessBuilder(commandList);
+ processBuilder.inheritIO();
+ try {
+ Process process = processBuilder.start();
+ System.out.println("Executing the command: ");
+ String commandLine = StringUtils.join(commandList, " ");
+ System.out.println(commandLine);
+ if (daemon == true) {
+ Runtime.getRuntime().addShutdownHook(new ShutdownHookThread
+ (process, commandLine));
+ }
+ System.out.println("Waiting for subprocess to finish");
+ process.waitFor();
+ System.out.println("subprocess finished");
+ System.out.println("Exit value from subprocess is :" + process
+ .exitValue());
+ } catch (Exception ex) {
+ System.out.println("Exception occured while starting process
via " +
+ "processbuilder " + ex.getMessage());
+ }
+ }
+
+ void jarCommand (List<String> args) {
+ System.out.println("Called jarCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() < 2)) {
+ System.out.println("Not enough arguments for storm jar
command");
+ System.out.println("Please pass a jar file location and the " +
+ "topology class for jar command");
+ //TODO print usage for jar command here
+ System.exit(-1);
+ }
+ String jarJvmOptions = System.getenv("STORM_JAR_JVM_OPTS");
+ List<String> jvmOptions = new ArrayList<String>();
+ if (jarJvmOptions != null) {
+ //TODO the python code to parse STORM_JAR_JVM_OPTIONS uses
shlex
+ // .split to get the different jvm options for the jar. For now
+ // keeping it simple and splitting on space. Need to be in
synch
+ // with python. Not sure though if we really need to use a
+ // lexical parser
+ jvmOptions.addAll(Arrays.asList(jarJvmOptions.split(" ")));
+ }
+ jvmOptions.add("-Dstorm.jar=" + args.get(0));
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(args.get(0));
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass(args.get(1), "-client", jvmOptions,
+ extraPaths, args.subList(2, args.size()), false, false,
"");
+ return;
+ }
+
+ void killCommand (List<String> args) {
+ System.out.println("Called killCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() < 1)) {
+ System.out.println("Not enough arguments for storm kill
command");
+ //TODO print usage for kill command here
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass("backtype.storm.command.kill_topology",
+ "-client", new ArrayList<String>(), extraPaths, args,
false,
+ false, "");
+ return;
+ }
+
+ //TODO implement shell command after understanding more about it
+ void shellCommand (List<String> args) {
+ System.out.println("Called shellCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ void nimbusCommand (List<String> args) {
+ System.out.println("Called nimbusCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> jvmOptions = new ArrayList<String>();
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String nimbusOptions = this.confValue("nimbus.childopts",
extraPaths,
+ true);
+ // below line is different from original python script storm.py
where
+ // it called parse_args method on nimbusOptions. Now we just call a
+ // split with a space. Hence this will have different behavior and
+ // a buggy one if the nimbusOptions string in the config file has a
+ // space. TODO need to fix this
+ jvmOptions.addAll(Arrays.asList(nimbusOptions.split(" ")));
+ jvmOptions.add("-Dlogfile.name=nimbus.log");
+ jvmOptions.add("-Dlog4j.configurationFile=" + this
+ .getLog4jConfigDirectory() + this.fileSeparator +
"cluster" +
+ ".xml");
+ this.executeStormClass(this.NIMBUS_CLASS, "-server", jvmOptions,
+ extraPaths, new ArrayList<String>(), false, true,
"nimbus");
+ return;
+ }
+
+ void uiCommand (List<String> args) {
+ System.out.println("Called uiCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> jvmOptions = new ArrayList<String>();
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String uiOptions = this.confValue("ui.childopts", extraPaths,
+ true);
+ // below line is different from original python script storm.py
where
+ // it called parse_args method on nimbusOptions. Now we just call a
+ // split with a space. Hence this will have different behavior and
+ // a buggy one if the nimbusOptions string in the config file has a
+ // space. TODO need to fix this
+ jvmOptions.addAll(Arrays.asList(uiOptions.split(" ")));
+ jvmOptions.add("-Dlogfile.name=ui.log");
+ jvmOptions.add("-Dlog4j.configurationFile=" + this
+ .getLog4jConfigDirectory() + this.fileSeparator +
"cluster" +
+ ".xml");
+ extraPaths.add(0, this.stormHomeDirectory);
+ this.executeStormClass(this.UI_CLASS, "-server", jvmOptions,
+ extraPaths, new ArrayList<String>(), false, true, "ui");
+ return;
+ }
+
+ void logviewerCommand (List<String> args) {
+ System.out.println("Called logviewerCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> jvmOptions = new ArrayList<String>();
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String logviewerOptions = this.confValue("logviewer.childopts",
+ extraPaths, true);
+ // below line is different from original python script storm.py
where
+ // it called parse_args method on nimbusOptions. Now we just call a
+ // split with a space. Hence this will have different behavior and
+ // a buggy one if the nimbusOptions string in the config file has a
+ // space. TODO need to fix this
+ jvmOptions.addAll(Arrays.asList(logviewerOptions.split(" ")));
+ jvmOptions.add("-Dlogfile.name=logviewer.log");
+ jvmOptions.add("-Dlog4j.configurationFile=" + this
+ .getLog4jConfigDirectory() + this.fileSeparator +
"cluster" +
+ ".xml");
+ extraPaths.add(0, this.stormHomeDirectory);
+ this.executeStormClass(this.LOGVIEWER_CLASS, "-server", jvmOptions,
+ extraPaths, new ArrayList<String>(), false, true,
"logviewer");
+ return;
+ }
+
+ void drpcCommand (List<String> args) {
+ System.out.println("Called drpcCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> jvmOptions = new ArrayList<String>();
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String drpcOptions = this.confValue("drpc.childopts", extraPaths,
+ true);
+ // below line is different from original python script storm.py
where
+ // it called parse_args method on nimbusOptions. Now we just call a
+ // split with a space. Hence this will have different behavior and
+ // a buggy one if the nimbusOptions string in the config file has a
+ // space. TODO need to fix this
+ jvmOptions.addAll(Arrays.asList(drpcOptions.split(" ")));
+ jvmOptions.add("-Dlogfile.name=drpc.log");
+ jvmOptions.add("-Dlog4j.configurationFile=" + this
+ .getLog4jConfigDirectory() + this.fileSeparator +
"cluster" +
+ ".xml");
+ this.executeStormClass(this.DRPC_CLASS, "-server", jvmOptions,
+ extraPaths, new ArrayList<String>(), false, true, "drpc");
+ return;
+ }
+
+ void supervisorCommand (List<String> args) {
+ System.out.println("Called supervisorCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> jvmOptions = new ArrayList<String>();
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String supervisorOptions = this.confValue("supervisor.childopts",
+ extraPaths,
+ true);
+ // below line is different from original python script storm.py
where
+ // it called parse_args method on nimbusOptions. Now we just call a
+ // split with a space. Hence this will have different behavior and
+ // a buggy one if the nimbusOptions string in the config file has a
+ // space. TODO need to fix this
+ jvmOptions.addAll(Arrays.asList(supervisorOptions.split(" ")));
+ jvmOptions.add("-Dlogfile.name=supervisor.log");
+ jvmOptions.add("-Dlog4j.configurationFile=" + this
+ .getLog4jConfigDirectory() + this.fileSeparator +
"cluster" +
+ ".xml");
+ this.executeStormClass(this.SUPERVISOR_CLASS, "-server",
jvmOptions,
+ extraPaths, new ArrayList<String>(), false, true,
"supervisor");
+ return;
+ }
+
+ void localconfvalueCommand (List<String> args) {
+ System.out.println("Called localconfvalueCommand using
reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() == 0)) {
+ System.out.println("Not enough arguments for localconfvalue " +
+ "command");
+ System.out.println("Please pass the name of the config value
you " +
+ "want to be printed");
+ //TODO print command help for localconfvalue command
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ System.out.println(args.get(0) + ": " + this.confValue(args.get(0),
+ extraPaths,
+ true));
+ return;
+ }
+
+ void remoteconfvalueCommand (List<String> args) {
+ System.out.println("Called remoteconfvalueCommand using
reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() == 0)) {
+ System.out.println("Not enough arguments for remoteconfvalue "
+
+ "command");
+ System.out.println("Please pass the name of the config value
you " +
+ "want to be printed");
+ //TODO print command help for remoteconfvalue command
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ System.out.println(args.get(0) + ": " + this.confValue(args.get(0),
+ extraPaths,
+ true));
+ return;
+ }
+
+ void replCommand (List<String> args) {
+ System.out.println("Called replCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ this.executeStormClass(this.REPL_CLASS, "-client", new
+ ArrayList<String>(), extraPaths, new
ArrayList<String>(),
+ false, true, "");
+ return;
+ }
+
+ void classpathCommand (List<String> args) {
+ System.out.println("Called classpathCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ System.out.println(this.getClassPath(new ArrayList<String>(),
true));
+ return;
+ }
+
+ void activateCommand (List<String> args) {
+ System.out.println("Called activateCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() < 1)) {
+ System.out.println("Not enough arguments for activate
command");
+ System.out.println("Please pass the topology name to
activate");
+ //TODO print usage for activate command here
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass(this.ACTIVATE_CLASS, "-client", new
+ ArrayList<String>(), extraPaths, args, false, false, "");
+ return;
+ }
+
+ void deactivateCommand (List<String> args) {
+ System.out.println("Called deactivateCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() < 1)) {
+ System.out.println("Not enough arguments for deactivate
command");
+ System.out.println("Please pass the topology name to
deactivate");
+ //TODO print usage for deactivate command here
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass(this.DEACTIVATE_CLASS, "-client", new
+ ArrayList<String>(), extraPaths, args, false, false, "");
+ return;
+ }
+
+ void rebalanceCommand (List<String> args) {
+ System.out.println("Called rebalanceCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() < 1)) {
+ System.out.println("Not enough arguments for rebalance
command");
+ System.out.println("Please pass the topology name to
rebalance");
+ //TODO print usage for rebalance command here
+ System.exit(2);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass(this.REBALANCE_CLASS, "-client", new
+ ArrayList<String>(), extraPaths, args, false, false, "");
+ return;
+ }
+
+ void helpCommand (List<String> args) {
+ System.out.println("Called helpCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ if ((args == null) || (args.size() == 0)) {
+ this.printUsage();
+ } else {
+ if ((!this.COMMANDS.contains(args.get(0)))) {
+ System.out.println(args.get(0) + " is not a valid
command");
+ } else {
+ //TODO print indivudual commands help here
+ System.out.println("Print command specific help here");
+ }
+ }
+ return;
+ }
+
+ void listCommand (List<String> args) {
+ System.out.println("Called listCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.userConfDirectory);
+ extraPaths.add(this.stormBinDirectory);
+ this.executeStormClass(this.LIST_CLASS, "-client", new
+ ArrayList<String>(), extraPaths, args, false, false, "");
+ return;
+ }
+
+ void devzookeeperCommand (List<String> args) {
+ System.out.println("Called devzookeeperCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ void versionCommand (List<String> args) {
+ System.out.println("Called versionCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ void monitorCommand (List<String> args) {
+ System.out.println("Called monitorCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ void uploadcredentialsCommand (List<String> args) {
+ System.out.println("Called uploadcredentialsCommand using
reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ void geterrorsCommand (List<String> args) {
+ System.out.println("Called geterrorsCommand using reflection");
+ System.out.println("Arguments are : ");
+ for (String s: args) {
+ System.out.println(s);
+ }
+ return;
+ }
+
+ String getLog4jConfigDirectory () {
+ List<String> extraPaths = new ArrayList<String>();
+ extraPaths.add(this.clusterConfDirectory);
+ String log4jDirectory = this.confValue("storm.logback.conf.dir",
+ extraPaths, true);
+ if ((log4jDirectory == null) || ("".equals(log4jDirectory)) ||
+ ("nil".equals(log4jDirectory))) {
+ log4jDirectory = this.stormLog4jConfDirectory;
+ }
+ return log4jDirectory;
+ }
+
+ private void printUsage () {
+ String commands = StringUtils.join(this.COMMANDS, "\n\t");
+ System.out.println("Commands:\n\t" + commands);
+ System.out.println("\nHelp: \n\thelp \n\thelp <command>\n");
+ System.out.println("Documentation for the storm client can be
found" +
+ " at " +
+ "http://storm.incubator.apache" +
+ ".org/documentation/Command-line-client.html\n");
+ System.out.println("Configs can be overridden using one or more -c
" +
+ "flags, e.g. " +
+ "\"storm list -c nimbus.host=nimbus.mycompany.com\"\n");
+ }
+
+ private void executeHelpCommand () {
+ System.out.println("Print storm help here");
+ }
+
+}
+
+class WindowsStormCommandExecutor extends StormCommandExecutor {
+
+ WindowsStormCommandExecutor () {
+
+ }
+
+ void initialize () {
+ return;
+ }
+
+ void execute (String[] args) {
--- End diff --
If run on Windows ,do nothing but return ?
> move storm bin commands to java and provide appropriate bindings for windows
> and linux
> --------------------------------------------------------------------------------------
>
> Key: STORM-904
> URL: https://issues.apache.org/jira/browse/STORM-904
> Project: Apache Storm
> Issue Type: Bug
> Reporter: Sriharsha Chintalapani
> Assignee: Priyank Shah
>
> Currently we have python and .cmd implementation for windows. This is
> becoming increasing difficult upkeep both versions. Lets make all the main
> code of starting daemons etc. to java and provider wrapper scripts in shell
> and batch for linux and windows respectively.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)