|
|
@@ -26,6 +26,7 @@ import java.nio.file.Path;
|
|
|
import java.nio.file.StandardCopyOption;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
|
|
|
import joptsimple.OptionSet;
|
|
|
import joptsimple.OptionSpec;
|
|
|
@@ -40,21 +41,22 @@ import org.elasticsearch.env.Environment;
|
|
|
import static org.elasticsearch.cli.Terminal.Verbosity.VERBOSE;
|
|
|
|
|
|
/**
|
|
|
- * A command for the plugin cli to remove a plugin from elasticsearch.
|
|
|
+ * A command for the plugin CLI to remove a plugin from Elasticsearch.
|
|
|
*/
|
|
|
class RemovePluginCommand extends EnvironmentAwareCommand {
|
|
|
|
|
|
private final OptionSpec<String> arguments;
|
|
|
|
|
|
RemovePluginCommand() {
|
|
|
- super("Removes a plugin from elasticsearch");
|
|
|
+ super("removes a plugin from Elasticsearch");
|
|
|
this.arguments = parser.nonOptions("plugin name");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void execute(Terminal terminal, OptionSet options, Environment env) throws Exception {
|
|
|
- String arg = arguments.value(options);
|
|
|
- execute(terminal, arg, env);
|
|
|
+ protected void execute(final Terminal terminal, final OptionSet options, final Environment env)
|
|
|
+ throws Exception {
|
|
|
+ final String pluginName = arguments.value(options);
|
|
|
+ execute(terminal, pluginName, env);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -68,18 +70,22 @@ class RemovePluginCommand extends EnvironmentAwareCommand {
|
|
|
* @throws UserException if plugin directory does not exist
|
|
|
* @throws UserException if the plugin bin directory is not a directory
|
|
|
*/
|
|
|
- void execute(Terminal terminal, String pluginName, Environment env) throws IOException, UserException {
|
|
|
+ void execute(final Terminal terminal, final String pluginName, final Environment env)
|
|
|
+ throws IOException, UserException {
|
|
|
if (pluginName == null) {
|
|
|
throw new UserException(ExitCodes.USAGE, "plugin name is required");
|
|
|
}
|
|
|
|
|
|
- terminal.println("-> Removing " + Strings.coalesceToEmpty(pluginName) + "...");
|
|
|
+ terminal.println("-> removing [" + Strings.coalesceToEmpty(pluginName) + "]...");
|
|
|
|
|
|
final Path pluginDir = env.pluginsFile().resolve(pluginName);
|
|
|
if (Files.exists(pluginDir) == false) {
|
|
|
- throw new UserException(
|
|
|
- ExitCodes.CONFIG,
|
|
|
- "plugin " + pluginName + " not found; run 'elasticsearch-plugin list' to get list of installed plugins");
|
|
|
+ final String message = String.format(
|
|
|
+ Locale.ROOT,
|
|
|
+ "plugin [%s] not found; "
|
|
|
+ + "run 'elasticsearch-plugin list' to get list of installed plugins",
|
|
|
+ pluginName);
|
|
|
+ throw new UserException(ExitCodes.CONFIG, message);
|
|
|
}
|
|
|
|
|
|
final List<Path> pluginPaths = new ArrayList<>();
|
|
|
@@ -87,30 +93,41 @@ class RemovePluginCommand extends EnvironmentAwareCommand {
|
|
|
final Path pluginBinDir = env.binFile().resolve(pluginName);
|
|
|
if (Files.exists(pluginBinDir)) {
|
|
|
if (Files.isDirectory(pluginBinDir) == false) {
|
|
|
- throw new UserException(ExitCodes.IO_ERROR, "Bin dir for " + pluginName + " is not a directory");
|
|
|
+ throw new UserException(
|
|
|
+ ExitCodes.IO_ERROR, "bin dir for " + pluginName + " is not a directory");
|
|
|
}
|
|
|
pluginPaths.add(pluginBinDir);
|
|
|
- terminal.println(VERBOSE, "Removing: " + pluginBinDir);
|
|
|
+ terminal.println(VERBOSE, "removing [" + pluginBinDir + "]");
|
|
|
}
|
|
|
|
|
|
- terminal.println(VERBOSE, "Removing: " + pluginDir);
|
|
|
+ terminal.println(VERBOSE, "removing [" + pluginDir + "]");
|
|
|
final Path tmpPluginDir = env.pluginsFile().resolve(".removing-" + pluginName);
|
|
|
try {
|
|
|
Files.move(pluginDir, tmpPluginDir, StandardCopyOption.ATOMIC_MOVE);
|
|
|
} catch (final AtomicMoveNotSupportedException e) {
|
|
|
- // this can happen on a union filesystem when a plugin is not installed on the top layer; we fall back to a non-atomic move
|
|
|
+ /*
|
|
|
+ * On a union file system if the plugin that we are removing is not installed on the
|
|
|
+ * top layer then atomic move will not be supported. In this case, we fall back to a
|
|
|
+ * non-atomic move.
|
|
|
+ */
|
|
|
Files.move(pluginDir, tmpPluginDir);
|
|
|
}
|
|
|
pluginPaths.add(tmpPluginDir);
|
|
|
|
|
|
IOUtils.rm(pluginPaths.toArray(new Path[pluginPaths.size()]));
|
|
|
|
|
|
- // we preserve the config files in case the user is upgrading the plugin, but we print
|
|
|
- // a message so the user knows in case they want to remove manually
|
|
|
+ /*
|
|
|
+ * We preserve the config files in case the user is upgrading the plugin, but we print a
|
|
|
+ * message so the user knows in case they want to remove manually.
|
|
|
+ */
|
|
|
final Path pluginConfigDir = env.configFile().resolve(pluginName);
|
|
|
if (Files.exists(pluginConfigDir)) {
|
|
|
- terminal.println(
|
|
|
- "-> Preserving plugin config files [" + pluginConfigDir + "] in case of upgrade, delete manually if not needed");
|
|
|
+ final String message = String.format(
|
|
|
+ Locale.ROOT,
|
|
|
+ "-> preserving plugin config files [%s] in case of upgrade; "
|
|
|
+ + "delete manually if not needed",
|
|
|
+ pluginConfigDir);
|
|
|
+ terminal.println(message);
|
|
|
}
|
|
|
}
|
|
|
|