Fix opensearch configuration sync permissions (#17059)

* Fix opensearch configuration sync permissions

* added changelog
This commit is contained in:
Tomas Dvorak
2023-11-02 08:36:35 +01:00
committed by GitHub
parent 51eabc75bf
commit 220f14eb3b
5 changed files with 43 additions and 12 deletions

View File

@@ -27,19 +27,30 @@ import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class FullDirSync {
private static final Logger LOG = LoggerFactory.getLogger(FullDirSync.class);
/**
* The execute bit for directories means that owner can traverse these and access their content.
*/
protected static final Set<PosixFilePermission> DIRECTORY_PERMISSIONS = Set.of(PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_EXECUTE);
protected static final Set<PosixFilePermission> FILE_PERMISSIONS = Set.of(PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_READ);
public static void run(Path source, Path target) throws IOException {
final List<Path> existingPaths = collectExistingPaths(target);
final List<Path> copiedPaths = copyFiles(source, target);
existingPaths.removeAll(copiedPaths);
existingPaths.remove(target); // exclude the target, we don't want to remove it in following step
deletePaths(existingPaths);
copyFiles(source, target);
}
private static void deletePaths(List<Path> existingPaths) throws IOException {
for (Path path : existingPaths) {
if (Files.isDirectory(path)) {
LOG.info("Deleting obsolete directory " + path);
@@ -54,7 +65,6 @@ public class FullDirSync {
}
}
}
private static List<Path> copyFiles(Path source, Path target) throws IOException {
@@ -65,7 +75,7 @@ public class FullDirSync {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path currentTarget = target.resolve(source.relativize(dir).toString());
Files.createDirectories(currentTarget);
Files.createDirectories(currentTarget, PosixFilePermissions.asFileAttribute((DIRECTORY_PERMISSIONS)));
copiedPaths.add(currentTarget);
LOG.info("Synchronizing directory {}", currentTarget);
return FileVisitResult.CONTINUE;
@@ -75,6 +85,7 @@ public class FullDirSync {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
final Path currentTarget = target.resolve(source.relativize(file).toString());
Files.copy(file, currentTarget, StandardCopyOption.REPLACE_EXISTING);
Files.setPosixFilePermissions(currentTarget, FILE_PERMISSIONS);
copiedPaths.add(currentTarget);
LOG.info("Synchronizing file {}", currentTarget);
return FileVisitResult.CONTINUE;

View File

@@ -42,7 +42,7 @@ public class OpensearchCommandLineProcess implements Closeable {
private final CommandLineProcess commandLineProcess;
private final CommandLineProcessListener resultHandler;
private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
private static final String CONFIG = "opensearch.yml";
private static final Path CONFIG = Path.of("opensearch.yml");
/**
* as long as OpenSearch is not supported on macOS, we have to fix the jdk path if we want to
@@ -79,8 +79,7 @@ public class OpensearchCommandLineProcess implements Closeable {
private void writeOpenSearchConfig(final OpensearchConfiguration config) {
try {
final var configFile = config.datanodeDirectories().getOpensearchProcessConfigurationDir().resolve(CONFIG);
Files.deleteIfExists(configFile);
final Path configFile = config.datanodeDirectories().createOpensearchProcessConfigurationFile(CONFIG);
mapper.writeValue(configFile.toFile(), getOpensearchConfigurationArguments(config));
} catch (IOException e) {
throw new RuntimeException("Could not generate OpenSearch config: " + e.getMessage(), e);

View File

@@ -22,7 +22,6 @@ import org.apache.commons.exec.ExecuteException;
import org.apache.http.client.utils.URIBuilder;
import org.graylog.datanode.Configuration;
import org.graylog.datanode.configuration.DatanodeConfiguration;
import org.graylog.datanode.configuration.DatanodeConfigurationProvider;
import org.graylog.datanode.process.OpensearchConfiguration;
import org.graylog.datanode.process.OpensearchInfo;
import org.graylog.datanode.process.ProcessEvent;
@@ -53,6 +52,7 @@ import java.util.stream.Collectors;
class OpensearchProcessImpl implements OpensearchProcess, ProcessListener {
private static final Logger LOG = LoggerFactory.getLogger(OpensearchProcessImpl.class);
public static final Path UNICAST_HOSTS_FILE = Path.of("unicast_hosts.txt");
private final StateMachineTracerAggregator tracerAggregator;
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@@ -70,7 +70,6 @@ class OpensearchProcessImpl implements OpensearchProcess, ProcessListener {
private final Queue<String> stdout;
private final Queue<String> stderr;
private final CustomCAX509TrustManager trustManager;
private final Path hostsfile;
private final NodeService nodeService;
private final Configuration configuration;
@@ -85,7 +84,6 @@ class OpensearchProcessImpl implements OpensearchProcess, ProcessListener {
this.trustManager = trustManager;
this.nodeService = nodeService;
this.configuration = configuration;
this.hostsfile = datanodeConfiguration.datanodeDirectories().getOpensearchProcessConfigurationDir().resolve("unicast_hosts.txt");
}
private RestHighLevelClient createRestClient(OpensearchConfiguration configuration) {
@@ -157,10 +155,11 @@ class OpensearchProcessImpl implements OpensearchProcess, ProcessListener {
private void writeSeedHostsList() {
try {
final Path hostsfile = datanodeConfiguration.datanodeDirectories().createOpensearchProcessConfigurationFile(UNICAST_HOSTS_FILE);
final Set<String> current = nodeService.allActive(Node.Type.DATANODE).values().stream().map(Node::getClusterAddress).filter(Objects::nonNull).collect(Collectors.toSet());
Files.write(hostsfile, current, Charset.defaultCharset(), StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE);
} catch (IOException iox) {
LOG.error("Could not write to file: {} - {}", hostsfile, iox.getMessage());
LOG.error("Could not write to file: {} - {}", UNICAST_HOSTS_FILE, iox.getMessage());
}
}