mirror of
https://github.com/Graylog2/graylog2-server.git
synced 2026-03-13 09:32:21 +08:00
Fix opensearch configuration sync permissions (#17059)
* Fix opensearch configuration sync permissions * added changelog
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user