From 3e2cb58e99dc989eb07c743f74a71f2074fc4ea7 Mon Sep 17 00:00:00 2001
From: jcambon <jcambon@localhost>
Date: Mon, 18 May 2009 13:26:17 +0000
Subject: [PATCH] Fix for issue #1827 : Add batch support to dsconfig Partial fix for issue #3938 : dsconfig is really too slow in non-interactive mode, almost unusable on Niagara systems
---
opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 100 insertions(+), 0 deletions(-)
diff --git a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
index 7ae1d56..09812cd 100644
--- a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
+++ b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
@@ -28,6 +28,7 @@
+import java.io.BufferedReader;
import static org.opends.messages.DSConfigMessages.*;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -37,12 +38,16 @@
import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
@@ -379,6 +384,9 @@
// Indicates whether or not a sub-command was provided.
private boolean hasSubCommand = true;
+ // The argument which should be used to read dsconfig commands from a file.
+ private StringArgument batchFileArgument;
+
// The argument which should be used to request non interactive
// behavior.
private BooleanArgument noPromptArgument;
@@ -576,6 +584,12 @@
OPTION_LONG_HELP, INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_SUMMARY
.get());
+ batchFileArgument = new StringArgument(OPTION_LONG_BATCH_FILE_PATH,
+ OPTION_SHORT_BATCH_FILE_PATH, OPTION_LONG_BATCH_FILE_PATH,
+ false, false, true, INFO_BATCH_FILE_PATH_PLACEHOLDER.get(),
+ null, null,
+ INFO_DESCRIPTION_BATCH_FILE_PATH.get());
+
displayEquivalentArgument = new BooleanArgument(
OPTION_DSCFG_LONG_DISPLAY_EQUIVALENT,
null, OPTION_DSCFG_LONG_DISPLAY_EQUIVALENT,
@@ -610,6 +624,7 @@
parser.addGlobalArgument(quietArgument);
parser.addGlobalArgument(scriptFriendlyArgument);
parser.addGlobalArgument(noPromptArgument);
+ parser.addGlobalArgument(batchFileArgument);
parser.addGlobalArgument(displayEquivalentArgument);
parser.addGlobalArgument(equivalentCommandFileArgument);
parser.addGlobalArgument(propertiesFileArgument);
@@ -737,6 +752,15 @@
return 1;
}
+ if (batchFileArgument.isPresent() && !noPromptArgument.isPresent()) {
+ Message message =
+ ERR_DSCFG_ERROR_BATCH_FILE_AND_INTERACTIVE_INCOMPATIBLE.get(
+ batchFileArgument.getLongIdentifier(), noPromptArgument
+ .getLongIdentifier());
+ displayMessageAndUsageReference(message);
+ return 1;
+ }
+
if (quietArgument.isPresent() && !noPromptArgument.isPresent()) {
Message message = ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get(
quietArgument.getLongIdentifier(), noPromptArgument
@@ -791,6 +815,13 @@
return 1;
}
+ // Handle batch file if any
+ if (batchFileArgument.isPresent()) {
+ handleBatchFile(args);
+ // don't need to do anything else
+ return 0;
+ }
+
int retCode = 0;
if (parser.getSubCommand() == null) {
hasSubCommand = false;
@@ -1135,4 +1166,73 @@
alreadyWroteEquivalentCommand = true;
}
}
+
+ private void handleBatchFile(String[] args) {
+
+ BufferedReader reader = null;
+ try {
+ // Build a list of initial arguments,
+ // removing the batch file option + its value
+ List<String> initialArgs = new ArrayList<String>();
+ Collections.addAll(initialArgs, args);
+ int batchFileArgIndex = -1;
+ for (String elem : initialArgs) {
+ if (elem.startsWith("-" + OPTION_SHORT_BATCH_FILE_PATH) ||
+ elem.contains(OPTION_LONG_BATCH_FILE_PATH)) {
+ batchFileArgIndex = initialArgs.indexOf(elem);
+ break;
+ }
+ }
+ if (batchFileArgIndex != -1) {
+ // Remove both the batch file arg and its value
+ initialArgs.remove(batchFileArgIndex);
+ initialArgs.remove(batchFileArgIndex);
+ }
+ String batchFilePath = batchFileArgument.getValue().trim();
+ reader =
+ new BufferedReader(new FileReader(batchFilePath));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ line = line.trim();
+ if (line.equals("") || line.startsWith("#")) {
+ // Empty line or comment
+ continue;
+ }
+ // Split the CLI string into arguments array
+ // For arguments including spaces, "\ " only is supported.
+ // CLI on several lines (using \) is not supported.
+ line = line.replace("\\ ", "##");
+ String[] fileArguments = line.split("\\s+");
+ for (int ii=0; ii<fileArguments.length; ii++) {
+ fileArguments[ii] = fileArguments[ii].replace("##", " ");
+ }
+
+ // Append initial arguments to the file line
+ List<String> allArguments = new ArrayList<String>();
+ Collections.addAll(allArguments, fileArguments);
+ allArguments.addAll(initialArgs);
+ String[] allArgsArray = allArguments.toArray(new String[] {});
+
+ // Build a single CLI string for display
+ StringBuffer cli = new StringBuffer();
+ for (String arg : allArgsArray) {
+ cli.append(arg + " ");
+ }
+
+ System.out.println("Running : dsconfig " + cli.toString() + "\n");
+ int exitCode =
+ main(allArgsArray, false, getOutputStream(), getErrorStream());
+ if (exitCode != 0) {
+ reader.close();
+ System.exit(filterExitCode(exitCode));
+ }
+ }
+
+ reader.close();
+
+ } catch (IOException ex) {
+ println(ERR_DSCFG_ERROR_READING_BATCH_FILE.get(ex.toString()));
+ }
+ }
+
}
--
Gitblit v1.10.0