diff --git a/src/main/java/org/elasticsearch/plugins/PluginManager.java b/src/main/java/org/elasticsearch/plugins/PluginManager.java index 44e6f671205..f03c78d59cf 100644 --- a/src/main/java/org/elasticsearch/plugins/PluginManager.java +++ b/src/main/java/org/elasticsearch/plugins/PluginManager.java @@ -43,6 +43,11 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -235,6 +240,16 @@ public class PluginManager { if (!binFile.renameTo(toLocation)) { throw new IOException("Could not move ["+ binFile.getAbsolutePath() + "] to [" + toLocation.getAbsolutePath() + "]"); } + // Make everything in bin/ executable + Files.walkFileTree(toLocation.toPath(), new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (attrs.isRegularFile()) { + file.toFile().setExecutable(true); + } + return FileVisitResult.CONTINUE; + } + }); debug("Installed " + name + " into " + toLocation.getAbsolutePath()); potentialSitePlugin = false; } diff --git a/src/test/java/org/elasticsearch/plugins/PluginManagerTests.java b/src/test/java/org/elasticsearch/plugins/PluginManagerTests.java index 5f50445582d..a63b51b302d 100644 --- a/src/test/java/org/elasticsearch/plugins/PluginManagerTests.java +++ b/src/test/java/org/elasticsearch/plugins/PluginManagerTests.java @@ -116,7 +116,9 @@ public class PluginManagerTests extends ElasticsearchIntegrationTest { assertThat(plugins.length, is(1)); assertTrue(pluginBinDir.exists()); assertTrue(pluginConfigDir.exists()); - + File toolFile = new File(pluginBinDir, "tool"); + assertThat(toolFile.exists(), is(true)); + assertThat(toolFile.canExecute(), is(true)); } finally { // we need to clean up the copied dirs FileSystemUtils.deleteRecursively(pluginBinDir);