Skip to content

Commit 0e5ed37

Browse files
committed
Plugins: plugin script to set proper plugin bin dir attributes
This commit makes sure that the plugin script looks at user, group and permissions of the elasticsearch bin dir and copies them over to the plugin bin subdirectory, whatever they are, so that they get properly setup depending on how elasticsearch was installed. We also make sure that execute permissions are added for files (we already did this before). Relates to #11016 Closes #14088
1 parent 77cb828 commit 0e5ed37

File tree

3 files changed

+66
-15
lines changed

3 files changed

+66
-15
lines changed

core/src/main/java/org/elasticsearch/plugins/PluginManager.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -355,25 +355,37 @@ private void copyBinDirectory(Path sourcePluginBinDirectory, Path destPluginBinD
355355
throw new IOException("Could not move [" + sourcePluginBinDirectory + "] to [" + destPluginBinDirectory + "]", e);
356356
}
357357
if (Environment.getFileStore(destPluginBinDirectory).supportsFileAttributeView(PosixFileAttributeView.class)) {
358-
// add read and execute permissions to existing perms, so execution will work.
359-
// read should generally be set already, but set it anyway: don't rely on umask...
360-
final Set<PosixFilePermission> executePerms = new HashSet<>();
361-
executePerms.add(PosixFilePermission.OWNER_READ);
362-
executePerms.add(PosixFilePermission.GROUP_READ);
363-
executePerms.add(PosixFilePermission.OTHERS_READ);
364-
executePerms.add(PosixFilePermission.OWNER_EXECUTE);
365-
executePerms.add(PosixFilePermission.GROUP_EXECUTE);
366-
executePerms.add(PosixFilePermission.OTHERS_EXECUTE);
358+
final PosixFileAttributes parentDirAttributes = Files.getFileAttributeView(destPluginBinDirectory.getParent(), PosixFileAttributeView.class).readAttributes();
359+
//copy permissions from parent bin directory
360+
final Set<PosixFilePermission> filePermissions = new HashSet<>();
361+
for (PosixFilePermission posixFilePermission : parentDirAttributes.permissions()) {
362+
switch (posixFilePermission) {
363+
case OWNER_EXECUTE:
364+
case GROUP_EXECUTE:
365+
case OTHERS_EXECUTE:
366+
break;
367+
default:
368+
filePermissions.add(posixFilePermission);
369+
}
370+
}
371+
// add file execute permissions to existing perms, so execution will work.
372+
filePermissions.add(PosixFilePermission.OWNER_EXECUTE);
373+
filePermissions.add(PosixFilePermission.GROUP_EXECUTE);
374+
filePermissions.add(PosixFilePermission.OTHERS_EXECUTE);
367375
Files.walkFileTree(destPluginBinDirectory, new SimpleFileVisitor<Path>() {
368376
@Override
369377
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
370378
if (attrs.isRegularFile()) {
371-
Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
372-
perms.addAll(executePerms);
373-
Files.setPosixFilePermissions(file, perms);
379+
setPosixFileAttributes(file, parentDirAttributes.owner(), parentDirAttributes.group(), filePermissions);
374380
}
375381
return FileVisitResult.CONTINUE;
376382
}
383+
384+
@Override
385+
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
386+
setPosixFileAttributes(dir, parentDirAttributes.owner(), parentDirAttributes.group(), parentDirAttributes.permissions());
387+
return FileVisitResult.CONTINUE;
388+
}
377389
});
378390
} else {
379391
terminal.println(VERBOSE, "Skipping posix permissions - filestore doesn't support posix permission");

core/src/test/java/org/elasticsearch/plugins/PluginManagerPermissionTests.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.zip.ZipEntry;
4242
import java.util.zip.ZipOutputStream;
4343

44+
import static java.nio.file.attribute.PosixFilePermission.*;
4445
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
4546
import static org.elasticsearch.plugins.PluginInfoTests.writeProperties;
4647
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.*;
@@ -283,6 +284,39 @@ public void testConfigDirectoryOwnerGroupAndPermissions() throws IOException {
283284
assertThat(pluginConfigFileAttributes.permissions(), equalTo(expectedFilePermissions));
284285
}
285286

287+
public void testBinDirectoryOwnerGroupAndPermissions() throws IOException {
288+
assumeTrue("File system does not support permissions, skipping", supportsPermissions);
289+
URL pluginUrl = createPlugin(true, false);
290+
PluginManager pluginManager = new PluginManager(environment, pluginUrl, PluginManager.OutputMode.VERBOSE, TimeValue.timeValueSeconds(10));
291+
pluginManager.downloadAndExtract(pluginName, terminal);
292+
PosixFileAttributes parentFileAttributes = Files.getFileAttributeView(environment.binFile(), PosixFileAttributeView.class).readAttributes();
293+
Path binPath = environment.binFile().resolve(pluginName);
294+
PosixFileAttributes pluginBinDirAttributes = Files.getFileAttributeView(binPath, PosixFileAttributeView.class).readAttributes();
295+
assertThat(pluginBinDirAttributes.owner(), equalTo(parentFileAttributes.owner()));
296+
assertThat(pluginBinDirAttributes.group(), equalTo(parentFileAttributes.group()));
297+
assertThat(pluginBinDirAttributes.permissions(), equalTo(parentFileAttributes.permissions()));
298+
Path executableFile = binPath.resolve("my-binary");
299+
PosixFileAttributes pluginExecutableFileAttributes = Files.getFileAttributeView(executableFile, PosixFileAttributeView.class).readAttributes();
300+
assertThat(pluginExecutableFileAttributes.owner(), equalTo(parentFileAttributes.owner()));
301+
assertThat(pluginExecutableFileAttributes.group(), equalTo(parentFileAttributes.group()));
302+
Set<PosixFilePermission> expectedFilePermissions = new HashSet<>();
303+
expectedFilePermissions.add(OWNER_EXECUTE);
304+
expectedFilePermissions.add(GROUP_EXECUTE);
305+
expectedFilePermissions.add(OTHERS_EXECUTE);
306+
for (PosixFilePermission parentPermission : parentFileAttributes.permissions()) {
307+
switch(parentPermission) {
308+
case OWNER_EXECUTE:
309+
case GROUP_EXECUTE:
310+
case OTHERS_EXECUTE:
311+
break;
312+
default:
313+
expectedFilePermissions.add(parentPermission);
314+
}
315+
}
316+
317+
assertThat(pluginExecutableFileAttributes.permissions(), equalTo(expectedFilePermissions));
318+
}
319+
286320
private URL createPlugin(boolean withBinDir, boolean withConfigDir) throws IOException {
287321
final Path structure = createTempDir().resolve("fake-plugin");
288322
writeProperties(structure, "description", "fake desc",
@@ -301,7 +335,7 @@ private URL createPlugin(boolean withBinDir, boolean withConfigDir) throws IOExc
301335
// create executable
302336
Path executable = binDir.resolve("my-binary");
303337
Files.createFile(executable);
304-
Files.setPosixFilePermissions(executable, PosixFilePermissions.fromString("rwxr-xr-x"));
338+
Files.setPosixFilePermissions(executable, PosixFilePermissions.fromString("rw-r--r--"));
305339
}
306340
if (withConfigDir) {
307341
// create bin dir

qa/vagrant/src/test/resources/packaging/scripts/plugins.bash

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,13 @@ install_jvm_example() {
7979
local relativePath=${1:-$(readlink -m jvm-example-*.zip)}
8080
install_jvm_plugin jvm-example "$relativePath"
8181

82-
assert_file_exist "$ESHOME/bin/jvm-example"
83-
assert_file_exist "$ESHOME/bin/jvm-example/test"
82+
#owner group and permissions vary depending on how es was installed
83+
#just make sure that everything is the same as the parent bin dir, which was properly set up during install
84+
bin_user=$(find "$ESHOME/bin" -maxdepth 0 -printf "%u")
85+
bin_owner=$(find "$ESHOME/bin" -maxdepth 0 -printf "%g")
86+
bin_privileges=$(find "$ESHOME/bin" -maxdepth 0 -printf "%m")
87+
assert_file "$ESHOME/bin/jvm-example" d $bin_user $bin_owner $bin_privileges
88+
assert_file "$ESHOME/bin/jvm-example/test" f $bin_user $bin_owner $bin_privileges
8489

8590
#owner group and permissions vary depending on how es was installed
8691
#just make sure that everything is the same as $CONFIG_DIR, which was properly set up during install

0 commit comments

Comments
 (0)