(feat.) Check if the MongoDB port is open before binding to it

This commit is contained in:
KingRainbow44
2023-11-26 00:41:19 -05:00
parent 828f29d657
commit 184438585f
2 changed files with 36 additions and 13 deletions

View File

@@ -2,6 +2,7 @@ package emu.lunarcore.database;
import java.util.stream.Stream; import java.util.stream.Stream;
import emu.lunarcore.util.Utils;
import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistries;
import org.reflections.Reflections; import org.reflections.Reflections;
@@ -41,11 +42,12 @@ public final class DatabaseManager {
public DatabaseManager(DatabaseInfo info, ServerType type) { public DatabaseManager(DatabaseInfo info, ServerType type) {
// Variables // Variables
var internalConfig = LunarCore.getConfig().getInternalMongoServer();
String connectionString = info.getUri(); String connectionString = info.getUri();
// Local mongo server // Local mongo server
if (info.isUseInternal()) { if (info.isUseInternal() && Utils.isPortOpen(internalConfig.getAddress(), internalConfig.getPort())) {
connectionString = startInternalMongoServer(LunarCore.getConfig().getInternalMongoServer()); connectionString = startInternalMongoServer(internalConfig);
LunarCore.getLogger().info("Using local mongo server at " + server.getConnectionString()); LunarCore.getLogger().info("Using local mongo server at " + server.getConnectionString());
} }

View File

@@ -1,6 +1,10 @@
package emu.lunarcore.util; package emu.lunarcore.util;
import java.io.File; import java.io.File;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -157,4 +161,21 @@ public class Utils {
public static byte[] base64Decode(String toDecode) { public static byte[] base64Decode(String toDecode) {
return Base64.getDecoder().decode(toDecode); return Base64.getDecoder().decode(toDecode);
} }
/**
* Checks if a port is open on a given host.
*
* @param host The host to check.
* @param port The port to check.
* @return True if the port is open, false otherwise.
*/
public static boolean isPortOpen(String host, int port) {
try (var serverSocket = new ServerSocket()) {
serverSocket.setReuseAddress(false);
serverSocket.bind(new InetSocketAddress(InetAddress.getByName(host), port), 1);
return true;
} catch (Exception ex) {
return false;
}
}
} }