From 9088c2bcd749a92046c3a935a8aa97d2a5932d67 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 02:29:10 +0200 Subject: [PATCH 01/10] started implementing ipv6 into Wrapper --- .../cloudnet/v2/lib/ConnectableAddress.java | 12 +- .../v2/lib/network/NetworkConnection.java | 3 + cloudnet-wrapper/pom.xml | 7 ++ .../cloudnet/v2/wrapper/CloudNetWrapper.java | 25 ++-- .../v2/wrapper/CloudNetWrapperConfig.java | 113 +++++++++++++++--- 5 files changed, 131 insertions(+), 29 deletions(-) diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/ConnectableAddress.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/ConnectableAddress.java index 3b00f4499..303d94625 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/ConnectableAddress.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/ConnectableAddress.java @@ -3,18 +3,20 @@ import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; +import java.net.InetAddress; /** - * Created by Tareko on 07.06.2017. + * Class specifying a Adress & Port Combination + * for Wrapper & Master Connections */ public class ConnectableAddress { public static final Type TYPE = TypeToken.get(ConnectableAddress.class).getType(); - private final String hostName; + private final InetAddress hostName; private final int port; - public ConnectableAddress(String hostName, int port) { - this.hostName = hostName; + public ConnectableAddress(InetAddress adress, int port) { + this.hostName = adress; this.port = port; } @@ -22,7 +24,7 @@ public int getPort() { return port; } - public String getHostName() { + public InetAddress getHostName() { return hostName; } } diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java index 376dee66d..8aed390ed 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java @@ -12,6 +12,9 @@ import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Collections; import java.util.concurrent.TimeUnit; diff --git a/cloudnet-wrapper/pom.xml b/cloudnet-wrapper/pom.xml index 4bbd2a5b1..e09204faf 100644 --- a/cloudnet-wrapper/pom.xml +++ b/cloudnet-wrapper/pom.xml @@ -44,6 +44,13 @@ ${project.version} provided + + + commons-validator + commons-validator + 1.6 + + diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java index bca793f12..fbc1e1cc4 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java @@ -34,6 +34,7 @@ import joptsimple.OptionSet; import java.io.File; +import java.net.InetAddress; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Map; @@ -69,18 +70,24 @@ public CloudNetWrapper(OptionSet optionSet, CloudNetWrapperConfig cloudNetWrappe this.wrapperConfig = cloudNetWrapperConfig; this.cloudNetLogging = cloudNetLogging; + + if (!cloudNetWrapperConfig.getCloudnetHost().isPresent()) { + throw new NullPointerException("No CloudNet host defined!"); + } + + InetAddress address = cloudNetWrapperConfig.getCloudnetHost().get(); this.networkConnection = new NetworkConnection( new ConnectableAddress( - cloudNetWrapperConfig.getCloudnetHost(), + address, cloudNetWrapperConfig.getCloudnetPort()), - new ConnectableAddress(cloudNetWrapperConfig.getInternalIP(), 0), - () -> { - try { - onShutdownCentral(); - } catch (Exception e) { - e.printStackTrace(); - } - }); + new ConnectableAddress(cloudNetWrapperConfig.getInternalIP(), 0), () -> { + try { + onShutdownCentral(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + String key = NetworkUtils.readWrapperKey(); diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java index 9f1343371..b6e3b7256 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java @@ -5,12 +5,16 @@ import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; import net.md_5.bungee.config.YamlConfiguration; +import org.apache.commons.validator.routines.InetAddressValidator; import java.io.*; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Optional; public class CloudNetWrapperConfig { @@ -18,7 +22,10 @@ public class CloudNetWrapperConfig { private Configuration configuration; - private String internalIP, wrapperId, cloudnetHost, proxyConfigHost; + private Optional cloudnet4Host = Optional.empty(); + private Optional cloudnet6Host = Optional.empty(); + + private String internalIP, wrapperId, proxyConfigHost; private boolean savingRecords, autoUpdate, maintenanceCopy; @@ -50,20 +57,48 @@ public CloudNetWrapperConfig(ConsoleReader reader) throws Exception { hostName = System.getProperty("hostAddress"); } + Optional host4Name = Optional.empty(); + Optional host6Name = Optional.empty(); + InetAddressValidator validator = new InetAddressValidator(); + if (hostName.equals("127.0.0.1") || hostName.equals("127.0.1.1") || hostName.split("\\.").length != 4) { String input; - System.out.println("Your local IP address is 127.0.0.1, please provide your service ip"); + System.out.println("Please provide your service ipv4, leave blank for only ipv6"); + System.out.println("Only Ipv6 is not recommended!"); while ((input = reader.readLine()) != null) { - if ((input.equals("127.0.0.1") || input.equals("127.0.1.1") || input.split("\\.").length != 4)) { - System.out.println("Please provide your real ip address :)"); + if (input.isEmpty()) { + host4Name = Optional.empty(); + break; + } + if (!validator.isValidInet4Address(input)) { + System.out.println("Please provide your real ipv4 address :)"); continue; } + host4Name = Optional.of(input); + break; + } - hostName = input; + System.out.println("please provide your service ipv6, leave blank for only ipv4"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + host6Name = Optional.empty(); + break; + } + if (!validator.isValidInet6Address(input)) { + System.out.println("Please provide your real ipv6 address :)"); + continue; + } + host6Name = Optional.of(input); break; } } + if (!host4Name.isPresent() && !host6Name.isPresent()) { + //TODO: Exit or rerequest data + System.exit(0); + } + + String wrapperId = null; if (System.getProperty("wrapper-id") != null) { wrapperId = System.getProperty("wrapper-id"); @@ -84,27 +119,54 @@ public CloudNetWrapperConfig(ConsoleReader reader) throws Exception { cloudNetHost = System.getProperty("cloudnet-host"); } + Optional cloud4Host = Optional.empty(); + Optional cloud6Host = Optional.empty(); + if (cloudNetHost.equals("127.0.0.1") || cloudNetHost.equals("127.0.1.1") || cloudNetHost.split("\\.").length != 4) { String input; - System.out.println("Provide the ip address of the cloudnet-master, please"); + System.out.println("Please provide your master ipv4, leave blank for only ipv6"); + System.out.println("Only Ipv6 is not recommended!"); while ((input = reader.readLine()) != null) { - if ((input.equals("127.0.0.1") || input.equals("127.0.1.1") || input.split("\\.").length != 4)) { - System.out.println("Please provide the real ip address :)"); + if (input.isEmpty()) { + cloud4Host = Optional.empty(); + break; + } + if (!validator.isValidInet4Address(input)) { + System.out.println("Please provide the real ipv4 address :)"); continue; } + cloud4Host = Optional.of(input); + break; + } - cloudNetHost = input; + System.out.println("please provide your service ipv6, leave blank for only ipv4"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + cloud6Host = Optional.empty(); + break; + } + if (!validator.isValidInet6Address(input)) { + System.out.println("Please provide the real ipv6 address :)"); + continue; + } + cloud6Host = Optional.of(input); break; } } + if (!cloud6Host.isPresent() && !cloud4Host.isPresent()) { + //TODO: Exit or rerequest data + System.exit(0); + } + long memory = ((NetworkUtils.systemMemory() / 1048576) - 2048); if (memory < 1024) { System.out.println("WARNING: YOU CAN'T USE THE CLOUD NETWORK SOFTWARE WITH SUCH A SMALL MEMORY SIZE!"); } Configuration configuration = new Configuration(); - configuration.set("connection.cloudnet-host", cloudNetHost); + configuration.set("connection.cloudnet-4host", cloud4Host.orElse("")); + configuration.set("connection.cloudnet-6host", cloud6Host.orElse("")); configuration.set("connection.cloudnet-port", 1410); configuration.set("connection.cloudnet-web", 1420); configuration.set("general.wrapperId", wrapperId); @@ -142,7 +204,10 @@ public CloudNetWrapperConfig load() { this.percentOfCPUForANewProxy = configuration.getDouble("general.percentOfCPUForANewProxy"); this.percentOfCPUForANewServer = configuration.getDouble("general.percentOfCPUForANewServer"); - this.cloudnetHost = configuration.getString("connection.cloudnet-host"); + this.cloudnet4Host = !configuration.getString("connection.cloudnet-4host").isEmpty() ? Optional.of(configuration.getString( + "connection.cloudnet-4host")) : Optional.empty(); + this.cloudnet6Host = !configuration.getString("connection.cloudnet-6host").isEmpty() ? Optional.of(configuration.getString( + "connection.cloudnet-6host")) : Optional.empty(); this.cloudnetPort = configuration.getInt("connection.cloudnet-port"); this.webPort = configuration.getInt("connection.cloudnet-web"); @@ -194,12 +259,30 @@ public Path getPath() { return path; } - public String getCloudnetHost() { - return cloudnetHost; + public Optional getCloudnetHost() { + try { + InetAddressValidator validator = new InetAddressValidator(); + if (cloudnet6Host.isPresent() && validator.isValidInet6Address(cloudnet6Host.get())) { + return Optional.of(InetAddress.getByName(cloudnet6Host.get())); + } + + if (cloudnet4Host.isPresent() && validator.isValidInet6Address(cloudnet4Host.get())) { + return Optional.of(InetAddress.getByName(cloudnet4Host.get())); + } + } catch (UnknownHostException ignore) { + } + + System.err.println("No valid cloudnet Host!"); + return Optional.empty(); } - public String getInternalIP() { - return internalIP; + public InetAddress getInternalIP() { + try { + return InetAddress.getByName(internalIP); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return null; } public String getProxyConfigHost() { From 37cb403a62e85141a10e22014dac4dd9e9122c1b Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 02:47:53 +0200 Subject: [PATCH 02/10] changing Strings to InetAdresses, Validation checks --- .../v2/lib/server/info/ProxyInfo.java | 7 +-- .../v2/lib/server/info/ServerInfo.java | 7 +-- .../v2/lib/server/info/SimpleProxyInfo.java | 8 ++-- .../v2/lib/server/info/SimpleServerInfo.java | 8 ++-- .../v2/wrapper/server/BungeeCord.java | 14 ++++-- .../v2/wrapper/server/GameServer.java | 48 ++++++++++++------- 6 files changed, 60 insertions(+), 32 deletions(-) diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ProxyInfo.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ProxyInfo.java index 96bb0f576..9185404b0 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ProxyInfo.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ProxyInfo.java @@ -4,6 +4,7 @@ import eu.cloudnetservice.cloudnet.v2.lib.service.ServiceId; import java.lang.reflect.Type; +import java.net.InetAddress; import java.util.Map; import java.util.UUID; import java.util.function.Consumer; @@ -14,14 +15,14 @@ public class ProxyInfo { private final ServiceId serviceId; - private final String host; + private final InetAddress host; private final boolean online; private final Map players; private final int memory; private final int port; public ProxyInfo(ServiceId serviceId, - String host, + InetAddress host, int port, boolean online, Map players, @@ -66,7 +67,7 @@ public boolean isOnline() { return online; } - public String getHost() { + public InetAddress getHost() { return host; } diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ServerInfo.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ServerInfo.java index 82a5fef63..21ef627b8 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ServerInfo.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/ServerInfo.java @@ -7,6 +7,7 @@ import eu.cloudnetservice.cloudnet.v2.lib.service.ServiceId; import java.lang.reflect.Type; +import java.net.InetAddress; import java.util.List; import java.util.Objects; import java.util.function.Consumer; @@ -15,7 +16,7 @@ public class ServerInfo { public static final Type TYPE = TypeToken.get(ServerInfo.class).getType(); private final ServiceId serviceId; - private final String host; + private final InetAddress host; private final boolean online; private final List players; private final int port; @@ -27,7 +28,7 @@ public class ServerInfo { private ServerState serverState; public ServerInfo(ServiceId serviceId, - String host, + InetAddress host, int port, boolean online, List players, @@ -180,7 +181,7 @@ public ServiceId getServiceId() { return serviceId; } - public String getHost() { + public InetAddress getHost() { return host; } diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleProxyInfo.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleProxyInfo.java index 870737cae..74b6fd50a 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleProxyInfo.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleProxyInfo.java @@ -2,6 +2,8 @@ import eu.cloudnetservice.cloudnet.v2.lib.service.ServiceId; +import java.net.InetAddress; + /** * Created by Tareko on 02.07.2017. */ @@ -9,12 +11,12 @@ public class SimpleProxyInfo { private final ServiceId serviceId; private final boolean online; - private final String hostName; + private final InetAddress hostName; private final int port; private final int memory; private final int onlineCount; - public SimpleProxyInfo(ServiceId serviceId, boolean online, String hostName, int port, int memory, int onlineCount) { + public SimpleProxyInfo(ServiceId serviceId, boolean online, InetAddress hostName, int port, int memory, int onlineCount) { this.serviceId = serviceId; this.online = online; this.hostName = hostName; @@ -39,7 +41,7 @@ public int getMemory() { return memory; } - public String getHostName() { + public InetAddress getHostName() { return hostName; } diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleServerInfo.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleServerInfo.java index 007e56a17..11b0349ce 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleServerInfo.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/server/info/SimpleServerInfo.java @@ -2,11 +2,13 @@ import eu.cloudnetservice.cloudnet.v2.lib.service.ServiceId; +import java.net.InetAddress; + public class SimpleServerInfo { private final ServiceId serviceId; - private final String hostAddress; + private final InetAddress hostAddress; private final int port; @@ -14,7 +16,7 @@ public class SimpleServerInfo { private final int maxPlayers; - public SimpleServerInfo(ServiceId serviceId, String hostAddress, int port, int onlineCount, int maxPlayers) { + public SimpleServerInfo(ServiceId serviceId, InetAddress hostAddress, int port, int onlineCount, int maxPlayers) { this.serviceId = serviceId; this.hostAddress = hostAddress; this.port = port; @@ -38,7 +40,7 @@ public int getMaxPlayers() { return maxPlayers; } - public String getHostAddress() { + public InetAddress getHostAddress() { return hostAddress; } } \ No newline at end of file diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/BungeeCord.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/BungeeCord.java index 598016683..514396221 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/BungeeCord.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/BungeeCord.java @@ -284,10 +284,16 @@ public boolean bootstrap() throws Exception { .append("proxyInfo", proxyInfo) .append("memory", proxyProcessMeta.getMemory()) .saveAsConfig(cloudPath.resolve("config.json")); - new Document().append("connection", - new ConnectableAddress(CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost(), - CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetPort())) - .saveAsConfig(cloudPath.resolve("connection.json")); + + if (CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost().isPresent()) { + new Document().append("connection", + new ConnectableAddress(CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost().get(), + CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetPort())) + .saveAsConfig(cloudPath.resolve("connection.json")); + } else { + throw new NullPointerException("No CloudNet host defined!"); + } + StringBuilder commandBuilder = new StringBuilder(); commandBuilder.append("java "); diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/GameServer.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/GameServer.java index b717d1ce0..a43b4580e 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/GameServer.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/server/GameServer.java @@ -406,7 +406,7 @@ private ServerInfo configureNormalServer() { properties.setProperty(x, this.serverProcessMeta.getProperties().getProperty(x)); } - properties.setProperty("server-ip", CloudNetWrapper.getInstance().getWrapperConfig().getInternalIP()); + properties.setProperty("server-ip", CloudNetWrapper.getInstance().getWrapperConfig().getInternalIP().toString()); properties.setProperty("server-port", serverProcessMeta.getPort() + NetworkUtils.EMPTY_STRING); String motd = properties.getProperty("motd"); @@ -494,10 +494,15 @@ private void generateCloudNetConfigurations() { .append("memory", serverProcessMeta.getMemory()) .saveAsConfig(cloudPath.resolve("config.json")); - new Document("connection", - new ConnectableAddress(CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost(), - CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetPort())) - .saveAsConfig(cloudPath.resolve("connection.json")); + if (CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost().isPresent()) { + new Document("connection", + new ConnectableAddress(CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost().get(), + CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetPort())) + .saveAsConfig(cloudPath.resolve("connection.json")); + } else { + throw new NullPointerException("No CloudNet host defined!"); + } + } @@ -699,18 +704,29 @@ public void copy(Template template) { } if (template != null && template.getBackend().equals(TemplateResource.MASTER)) { - MasterTemplateDeploy masterTemplateDeploy = - new MasterTemplateDeploy(this.dir, - new ConnectableAddress(CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost(), - CloudNetWrapper.getInstance().getWrapperConfig().getWebPort()), - CloudNetWrapper.getInstance().getSimpledUser(), - template, - serverGroup.getName()); - try { - masterTemplateDeploy.deploy(); - } catch (Exception e) { - e.printStackTrace(); + + if (CloudNetWrapper.getInstance().getWrapperConfig().getCloudnetHost().isPresent()) { + MasterTemplateDeploy masterTemplateDeploy = + new MasterTemplateDeploy(this.dir, + new ConnectableAddress(CloudNetWrapper.getInstance() + .getWrapperConfig() + .getCloudnetHost() + .get(), + CloudNetWrapper.getInstance().getWrapperConfig().getWebPort()), + CloudNetWrapper.getInstance().getSimpledUser(), + template, + serverGroup.getName()); + + try { + masterTemplateDeploy.deploy(); + } catch (Exception e) { + e.printStackTrace(); + } + + } else { + throw new NullPointerException("No CloudNet host defined!"); } + } else if (template != null) { CloudNetWrapper.getInstance().getCloudNetLogging().log(Level.INFO, String.format("Copying template from %s to local directory...", From b751707aeed555c8b4f1d984480b15c02cc7c1de Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 03:07:11 +0200 Subject: [PATCH 03/10] added validator, upgraded CloudConfig --- cloudnet-master/pom.xml | 6 ++++++ .../cloudnet/v2/master/CloudConfig.java | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cloudnet-master/pom.xml b/cloudnet-master/pom.xml index 4b964ea9d..32c9d1bb7 100644 --- a/cloudnet-master/pom.xml +++ b/cloudnet-master/pom.xml @@ -69,6 +69,12 @@ ${dependency.slf4j.version} compile + + + commons-validator + commons-validator + 1.6 + diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java index e2e451a19..6e2badc8c 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java @@ -16,9 +16,12 @@ import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; import net.md_5.bungee.config.YamlConfiguration; +import org.apache.commons.validator.routines.InetAddressValidator; import java.io.*; import java.lang.reflect.Type; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -76,7 +79,7 @@ public CloudConfig() { try { Files.createDirectories(path); } catch (IOException e) { - throw new RuntimeException("Folder path " + path.toAbsolutePath().toString() + " could not be created", e); + throw new RuntimeException("Folder path " + path.toAbsolutePath().toString() + " could not be created", e); } } @@ -156,9 +159,16 @@ public CloudConfig load() { String host = configuration.getString("server.hostaddress"); + InetAddressValidator validator = new InetAddressValidator(); + if (!validator.isValid(host)) { + throw new UnknownHostException("No valid InetAdress found!"); + } + + InetAddress hostInet = InetAddress.getByName(host); + Collection addresses = new ArrayList<>(); for (int value : configuration.getIntList("server.ports")) { - addresses.add(new ConnectableAddress(host, value)); + addresses.add(new ConnectableAddress(hostInet, value)); } this.addresses = addresses; From 87395205229f743369379baddc3103b4927eb861 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 03:21:28 +0200 Subject: [PATCH 04/10] start updating master --- .../cloudnet/v2/master/CloudConfig.java | 11 +++++-- .../network/components/WrapperMeta.java | 10 +++---- .../v2/master/setup/SetupWrapper.java | 29 ++++++++++++------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java index 6e2badc8c..e0b616855 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/CloudConfig.java @@ -131,10 +131,15 @@ private void defaultInitDoc() { } String hostName = NetworkUtils.getHostName(); - new Document("wrapper", Collections.singletonList(new WrapperMeta("Wrapper-1", hostName, "admin"))) - .append("proxyGroups", Collections.singletonList(new BungeeGroup())).saveAsConfig(servicePath); + try { + new Document("wrapper", Collections.singletonList(new WrapperMeta("Wrapper-1", InetAddress.getByName(hostName), "admin"))) + .append("proxyGroups", Collections.singletonList(new BungeeGroup())).saveAsConfig(servicePath); + + new Document("group", new LobbyGroup()).saveAsConfig(Paths.get("groups/Lobby.json")); - new Document("group", new LobbyGroup()).saveAsConfig(Paths.get("groups/Lobby.json")); + } catch (UnknownHostException e) { + e.printStackTrace(); + } } private void defaultInitUsers() { diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/components/WrapperMeta.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/components/WrapperMeta.java index 03ce13460..ad436f63b 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/components/WrapperMeta.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/components/WrapperMeta.java @@ -1,19 +1,17 @@ package eu.cloudnetservice.cloudnet.v2.master.network.components; +import java.net.InetAddress; import java.util.Objects; -/** - * Created by Tareko on 24.07.2017. - */ public class WrapperMeta { private final String id; - private final String hostName; + private final InetAddress hostName; private final String user; - public WrapperMeta(String id, String hostName, String user) { + public WrapperMeta(String id, InetAddress hostName, String user) { this.id = id; this.hostName = hostName; this.user = user; @@ -23,7 +21,7 @@ public String getId() { return id; } - public String getHostName() { + public InetAddress getHostName() { return hostName; } diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/setup/SetupWrapper.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/setup/SetupWrapper.java index 2514421d8..01567abab 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/setup/SetupWrapper.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/setup/SetupWrapper.java @@ -6,10 +6,11 @@ import eu.cloudnetservice.cloudnet.v2.setup.Setup; import eu.cloudnetservice.cloudnet.v2.setup.SetupRequest; import eu.cloudnetservice.cloudnet.v2.setup.responsetype.StringResponseType; +import org.apache.commons.validator.routines.InetAddressValidator; + +import java.net.InetAddress; +import java.net.UnknownHostException; -/** - * Created by Tareko on 21.10.2017. - */ public class SetupWrapper { private final String name; @@ -20,20 +21,26 @@ public SetupWrapper(CommandSender commandSender, String name) { setup = new Setup().setupCancel(() -> System.out.println("Setup was cancelled")) .setupComplete(data -> { - String host = data.getString("address"); - String user = data.getString("user"); - - WrapperMeta wrapperMeta = new WrapperMeta(name, host, user); - CloudNet.getInstance().getConfig().createWrapper(wrapperMeta); - commandSender.sendMessage(String.format("Wrapper [%s] was registered on CloudNet", - wrapperMeta.getId())); + try{ + InetAddress host = InetAddress.getByName(data.getString("address")); + String user = data.getString("user"); + + WrapperMeta wrapperMeta = new WrapperMeta(name, host, user); + CloudNet.getInstance().getConfig().createWrapper(wrapperMeta); + commandSender.sendMessage(String.format("Wrapper [%s] was registered on CloudNet", + wrapperMeta.getId())); + }catch (UnknownHostException ex){ + ex.printStackTrace(); + } }); + InetAddressValidator validator = new InetAddressValidator(); + setup.request(new SetupRequest("address", "What is the IP address of this wrapper?", "The specified IP address is invalid!", StringResponseType.getInstance(), - key -> key.split("\\.").length == 4 && !key.equalsIgnoreCase("127.0.0.1"))); + validator::isValid)); setup.request(new SetupRequest("user", "What is the user of the wrapper?", "The specified user does not exist!", From babe28116b3f5ca2986350d0d3ba89b14284af51 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 03:26:42 +0200 Subject: [PATCH 05/10] general Development --- .../cloudnet/v2/master/network/CloudNetServer.java | 2 +- .../cloudnet/v2/master/network/NetworkInfo.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/CloudNetServer.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/CloudNetServer.java index 25209e3de..6ccfab330 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/CloudNetServer.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/CloudNetServer.java @@ -87,7 +87,7 @@ protected void initChannel(Channel channel) { InetSocketAddress address = (InetSocketAddress) channel.remoteAddress(); for (Wrapper wrapper : CloudNet.getInstance().getWrappers().values()) { - if (wrapper.getNetworkInfo().getHostName().equalsIgnoreCase(address.getAddress().getHostAddress())) { + if (wrapper.getNetworkInfo().getHostName().getHostAddress().equals(address.getAddress().getHostAddress())) { NetworkUtils.initChannel(channel); channel.pipeline().addLast("client", new CloudNetClientAuth(channel)); diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/NetworkInfo.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/NetworkInfo.java index 7d2b5af53..54614dcc9 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/NetworkInfo.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/network/NetworkInfo.java @@ -1,21 +1,21 @@ package eu.cloudnetservice.cloudnet.v2.master.network; -/** - * Created by Tareko on 27.05.2017. - */ + +import java.net.InetAddress; + public class NetworkInfo { private final String serverId; - private final String hostName; + private final InetAddress hostName; private final int port; - public NetworkInfo(String serverId, String hostName, int port) { + public NetworkInfo(String serverId, InetAddress hostName, int port) { this.serverId = serverId; this.hostName = hostName; this.port = port; } - public String getHostName() { + public InetAddress getHostName() { return hostName; } From 0c267a177775fb74bc4ced244e60c6a53ddbd349 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 03:36:34 +0200 Subject: [PATCH 06/10] general Development --- .../cloudnet/v2/bridge/BukkitBootstrap.java | 34 ++++++++++--------- .../cloudnet/v2/bridge/ProxiedBootstrap.java | 11 ++++-- .../cloudnet/v2/api/CloudAPI.java | 7 ++-- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/BukkitBootstrap.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/BukkitBootstrap.java index 47a9e9935..b81343f6b 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/BukkitBootstrap.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/BukkitBootstrap.java @@ -12,11 +12,9 @@ import org.bukkit.plugin.java.JavaPlugin; import java.net.InetSocketAddress; +import java.net.UnknownHostException; import java.nio.file.Paths; -/** - * Created by Tareko on 17.08.2017. - */ public final class BukkitBootstrap extends JavaPlugin { /** @@ -27,9 +25,13 @@ public final class BukkitBootstrap extends JavaPlugin { @Override public void onLoad() { - api = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD", "connection.json"), - Paths.get("CLOUD", "config.json"), - ConfigTypeLoader.INTERNAL), getLogger()); + try { + api = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD", "connection.json"), + Paths.get("CLOUD", "config.json"), + ConfigTypeLoader.INTERNAL), getLogger()); + } catch (UnknownHostException e) { + e.printStackTrace(); + } } @Override @@ -63,16 +65,6 @@ public void onEnable() { loadPlayers(); } - /** - * If players are joined on the Bukkit server prior to this plugin being enabled (ie. a reload just happened), - * loads all players from the cloud into the cache. - */ - private void loadPlayers() { - for (Player all : getServer().getOnlinePlayers()) { - api.getOnlinePlayer(all.getUniqueId()); - } - } - /** * Starts the update task for this server. */ @@ -89,6 +81,16 @@ private void startUpdateTask() { } } + /** + * If players are joined on the Bukkit server prior to this plugin being enabled (ie. a reload just happened), + * loads all players from the cloud into the cache. + */ + private void loadPlayers() { + for (Player all : getServer().getOnlinePlayers()) { + api.getOnlinePlayer(all.getUniqueId()); + } + } + /** * Returns the runnable to be executed when updating the server instance. * diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/ProxiedBootstrap.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/ProxiedBootstrap.java index 74fc08508..114d1dc45 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/ProxiedBootstrap.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/ProxiedBootstrap.java @@ -11,6 +11,7 @@ import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; +import java.net.UnknownHostException; import java.nio.file.Paths; import java.util.logging.Level; @@ -32,9 +33,13 @@ public class ProxiedBootstrap extends Plugin { @Override public void onLoad() { - this.api = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD", "connection.json"), - Paths.get("CLOUD", "config.json"), - ConfigTypeLoader.INTERNAL), this.getLogger()); + try { + this.api = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD", "connection.json"), + Paths.get("CLOUD", "config.json"), + ConfigTypeLoader.INTERNAL), this.getLogger()); + } catch (UnknownHostException e) { + e.printStackTrace(); + } getLogger().setLevel(Level.INFO); } diff --git a/cloudnet-api/cloudnet-api-core/src/main/java/eu/cloudnetservice/cloudnet/v2/api/CloudAPI.java b/cloudnet-api/cloudnet-api-core/src/main/java/eu/cloudnetservice/cloudnet/v2/api/CloudAPI.java index 1610dac57..b3d2b7fc2 100644 --- a/cloudnet-api/cloudnet-api-core/src/main/java/eu/cloudnetservice/cloudnet/v2/api/CloudAPI.java +++ b/cloudnet-api/cloudnet-api-core/src/main/java/eu/cloudnetservice/cloudnet/v2/api/CloudAPI.java @@ -32,6 +32,8 @@ import org.bukkit.Bukkit; import java.lang.reflect.Type; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -62,7 +64,7 @@ public final class CloudAPI { //Init private CloudNetwork cloudNetwork = new CloudNetwork(); - public CloudAPI(CloudConfigLoader loader, final Logger logger) { + public CloudAPI(CloudConfigLoader loader, final Logger logger) throws UnknownHostException { if (instance != null) { throw new IllegalStateException("CloudAPI already instantiated."); } @@ -70,7 +72,8 @@ public CloudAPI(CloudConfigLoader loader, final Logger logger) { this.cloudConfigLoader = loader; this.logger = logger; this.config = loader.loadConfig(); - this.networkConnection = new NetworkConnection(loader.loadConnnection(), new ConnectableAddress("0.0.0.0", 0)); + this.networkConnection = new NetworkConnection(loader.loadConnnection(), + new ConnectableAddress(InetAddress.getByName("0.0.0.0"), 0)); this.serviceId = config.getObject("serviceId", ServiceId.TYPE); this.memory = config.getInt("memory"); From cc21cee7364d9655f56103ef5a41ff0004e9c9f9 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 03:43:19 +0200 Subject: [PATCH 07/10] general Development --- .../cloudnet/v2/bridge/CloudProxy.java | 55 +++++++++++-------- .../cloudnet/v2/bridge/CloudServer.java | 5 +- cloudnet-api/pom.xml | 6 ++ 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudProxy.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudProxy.java index 2af275129..c66a2cc0a 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudProxy.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudProxy.java @@ -21,8 +21,11 @@ import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; +import org.apache.commons.validator.routines.InetAddressValidator; +import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.UnknownHostException; import java.util.List; import java.util.Map; import java.util.UUID; @@ -228,11 +231,13 @@ private String getDefaultFallbackServer(final String kickedFrom) { } } - @Override - public CompletableFuture waitForProxy(final UUID uuid) { - final CompletableFuture future = new CompletableFuture<>(); - this.waitingProxies.put(uuid, future); - return future; + /** + * Returns the instance of this {@link CloudProxy}. + * + * @return the singleton instance of this class. + */ + public static CloudProxy getInstance() { + return instance; } /** @@ -294,14 +299,22 @@ public void updateAsync() { * Updates this proxy instance with all of its' state using the API. */ public void update() { - new ProxyInfo(this.cloudAPI.getServiceId(), - this.cloudAPI.getConfig().getString("host"), - 0, - true, - ProxyServer.getInstance().getPlayers().stream() - .collect(Collectors.toMap(ProxiedPlayer::getUniqueId, CommandSender::getName)), - proxyProcessMeta.getMemory()) - .fetch(this.cloudAPI::update); + String host = this.cloudAPI.getConfig().getString("host"); + + try { + if (InetAddressValidator.getInstance().isValid(host)) { + new ProxyInfo(this.cloudAPI.getServiceId(), + InetAddress.getByName(host), + 0, + true, + ProxyServer.getInstance().getPlayers().stream() + .collect(Collectors.toMap(ProxiedPlayer::getUniqueId, CommandSender::getName)), + proxyProcessMeta.getMemory()) + .fetch(this.cloudAPI::update); + } + } catch (UnknownHostException e) { + e.printStackTrace(); + } } /** @@ -355,6 +368,13 @@ public Map getServers() { return this.cachedServers; } + @Override + public CompletableFuture waitForProxy(final UUID uuid) { + final CompletableFuture future = new CompletableFuture<>(); + this.waitingProxies.put(uuid, future); + return future; + } + @Override public CompletableFuture waitForServer(final UUID uuid) { final CompletableFuture future = new CompletableFuture<>(); @@ -492,15 +512,6 @@ public void onCloudNetworkUpdate(CloudNetwork cloudNetwork) { } - /** - * Returns the instance of this {@link CloudProxy}. - * - * @return the singleton instance of this class. - */ - public static CloudProxy getInstance() { - return instance; - } - @Override public void onCustomChannelMessageReceive(String channel, String message, Document document) { if (handle(channel, message, document)) { diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudServer.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudServer.java index 415ea30f3..ac8c653a6 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudServer.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/eu/cloudnetservice/cloudnet/v2/bridge/CloudServer.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.net.InetAddress; import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; @@ -50,7 +51,7 @@ public class CloudServer implements CloudService, NetworkHandler { private final BukkitBootstrap bukkitBootstrap; private final Map cloudPlayers = new ConcurrentHashMap<>(); - private final String hostAddress; + private final InetAddress hostAddress; private final int port; private final Template template; private final int memory; @@ -210,7 +211,7 @@ public int getPort() { return port; } - public String getHostAddress() { + public InetAddress getHostAddress() { return hostAddress; } diff --git a/cloudnet-api/pom.xml b/cloudnet-api/pom.xml index 074d46be3..fb11f5b67 100644 --- a/cloudnet-api/pom.xml +++ b/cloudnet-api/pom.xml @@ -63,6 +63,12 @@ + + + commons-validator + commons-validator + 1.6 + From bf4010dac06edb8294e223af4a2540d3abab9b56 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 14:35:23 +0200 Subject: [PATCH 08/10] general Development --- .../v2/lib/network/NetworkConnection.java | 161 ++++++++++-------- .../cloudnet/v2/wrapper/CloudNetWrapper.java | 2 +- .../v2/wrapper/CloudNetWrapperConfig.java | 106 ++++++------ 3 files changed, 144 insertions(+), 125 deletions(-) diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java index 8aed390ed..dc680e4a5 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java @@ -27,8 +27,8 @@ public final class NetworkConnection implements PacketSender { private final PacketManager packetManager = new PacketManager(); private final EventLoopGroup eventLoopGroup = NetworkUtils.eventLoopGroup(2); private final ConnectableAddress localAddress; - private Channel channel; private final ConnectableAddress connectableAddress; + private Channel channel; private long connectionTries = 0; private Runnable task; @@ -94,37 +94,19 @@ public void sendPacket(Packet... packets) { } } - public boolean tryDisconnect() { - if (channel != null) { - channel.close(); - } - - try { - eventLoopGroup.shutdownGracefully().await(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return false; - } - @Override - public void send(Object object) { + public void sendPacket(Packet packet) { if (channel == null) { return; } if (channel.eventLoop().inEventLoop()) { - channel.writeAndFlush(object); + channel.writeAndFlush(packet); } else { - channel.eventLoop().execute(() -> channel.writeAndFlush(object)); + channel.eventLoop().execute(() -> channel.writeAndFlush(packet)); } } - @Override - public void sendSynchronized(Object object) { - channel.writeAndFlush(object).syncUninterruptibly(); - } - @Override public void sendPacketSynchronized(Packet packet) { if (channel == null) { @@ -142,66 +124,34 @@ public void sendPacketSynchronized(Packet packet) { } } - @Override - public void sendAsynchronous(Object object) { - NetworkUtils.getExecutor().submit(() -> { - channel.writeAndFlush(object); - }); - } - - @Override - public void send(IProtocol iProtocol, Object element) { - send(new ProtocolRequest(iProtocol.getId(), element)); - } - - @Override - public void send(int id, Object element) { - send(new ProtocolRequest(id, element)); - } - - @Override - public void sendAsynchronous(int id, Object element) { - sendAsynchronous(new ProtocolRequest(id, element)); - } - - @Override - public void sendAsynchronous(IProtocol iProtocol, Object element) { - sendAsynchronous(new ProtocolRequest(iProtocol.getId(), element)); - } - - @Override - public void sendSynchronized(int id, Object element) { - sendSynchronized(new ProtocolRequest(id, element)); - } + public boolean tryDisconnect() { + if (channel != null) { + channel.close(); + } - @Override - public void sendSynchronized(IProtocol iProtocol, Object element) { - sendSynchronized(new ProtocolRequest(iProtocol.getId(), element)); + try { + eventLoopGroup.shutdownGracefully().await(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return false; } - @Override - public void sendPacket(Packet packet) { + public void tryConnect(final NetDispatcher netDispatcher, final Auth auth) { + tryConnect(netDispatcher, auth, null); + } @Override + public void send(Object object) { if (channel == null) { return; } if (channel.eventLoop().inEventLoop()) { - channel.writeAndFlush(packet); + channel.writeAndFlush(object); } else { - channel.eventLoop().execute(() -> channel.writeAndFlush(packet)); + channel.eventLoop().execute(() -> channel.writeAndFlush(object)); } } - public void tryConnect(final NetDispatcher netDispatcher, final Auth auth) { - tryConnect(netDispatcher, auth, null); - } - - - - public boolean isConnected() { - return channel != null; - } - public boolean tryConnect(SimpleChannelInboundHandler channelInboundHandler, Auth auth, Runnable cancelTask) { try { Bootstrap bootstrap = new Bootstrap().option(ChannelOption.AUTO_READ, true) @@ -213,7 +163,24 @@ protected void initChannel(Channel channel) { } }) .channel(NetworkUtils.socketChannel()); - this.channel = bootstrap.connect(new InetSocketAddress(connectableAddress.getHostName(), connectableAddress.getPort()), + InetAddress addr = connectableAddress.getHostName(); + InetSocketAddress destination = null; + + if (addr instanceof Inet6Address) { + Inet6Address tmp = (Inet6Address) addr; + if (tmp.getScopeId() != 0) { + destination = new InetSocketAddress(InetAddress.getByAddress(tmp.getAddress()), connectableAddress.getPort()); + } + } else if (addr instanceof Inet4Address) { + Inet4Address tmp = (Inet4Address) addr; + destination = new InetSocketAddress(InetAddress.getByAddress(tmp.getAddress()), connectableAddress.getPort()); + } + + if(destination == null){ + throw new NullPointerException("NetworkConnection - No valid destination found!"); + } + + this.channel = bootstrap.connect(destination, new InetSocketAddress(localAddress.getHostName(), localAddress.getPort())) .sync() .channel() @@ -239,4 +206,56 @@ protected void initChannel(Channel channel) { return false; } } + + public boolean isConnected() { + return channel != null; + } + + @Override + public void sendSynchronized(Object object) { + channel.writeAndFlush(object).syncUninterruptibly(); + } + + + + + @Override + public void sendAsynchronous(Object object) { + NetworkUtils.getExecutor().submit(() -> { + channel.writeAndFlush(object); + }); + } + + + @Override + public void send(IProtocol iProtocol, Object element) { + send(new ProtocolRequest(iProtocol.getId(), element)); + } + + @Override + public void send(int id, Object element) { + send(new ProtocolRequest(id, element)); + } + + @Override + public void sendAsynchronous(int id, Object element) { + sendAsynchronous(new ProtocolRequest(id, element)); + } + + @Override + public void sendAsynchronous(IProtocol iProtocol, Object element) { + sendAsynchronous(new ProtocolRequest(iProtocol.getId(), element)); + } + + @Override + public void sendSynchronized(int id, Object element) { + sendSynchronized(new ProtocolRequest(id, element)); + } + + @Override + public void sendSynchronized(IProtocol iProtocol, Object element) { + sendSynchronized(new ProtocolRequest(iProtocol.getId(), element)); + } + + } diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java index fbc1e1cc4..35ea24a3e 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapper.java @@ -72,7 +72,7 @@ public CloudNetWrapper(OptionSet optionSet, CloudNetWrapperConfig cloudNetWrappe this.cloudNetLogging = cloudNetLogging; if (!cloudNetWrapperConfig.getCloudnetHost().isPresent()) { - throw new NullPointerException("No CloudNet host defined!"); + throw new NullPointerException("no cloudnet host defined!"); } InetAddress address = cloudNetWrapperConfig.getCloudnetHost().get(); diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java index b6e3b7256..d07cd96a3 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/CloudNetWrapperConfig.java @@ -61,37 +61,37 @@ public CloudNetWrapperConfig(ConsoleReader reader) throws Exception { Optional host6Name = Optional.empty(); InetAddressValidator validator = new InetAddressValidator(); - if (hostName.equals("127.0.0.1") || hostName.equals("127.0.1.1") || hostName.split("\\.").length != 4) { - String input; - System.out.println("Please provide your service ipv4, leave blank for only ipv6"); - System.out.println("Only Ipv6 is not recommended!"); - while ((input = reader.readLine()) != null) { - if (input.isEmpty()) { - host4Name = Optional.empty(); - break; - } - if (!validator.isValidInet4Address(input)) { - System.out.println("Please provide your real ipv4 address :)"); - continue; - } - host4Name = Optional.of(input); + //if (hostName.equals("127.0.0.1") || hostName.equals("127.0.1.1") || hostName.split("\\.").length != 4) { + String input; + System.out.println("Please provide your service ipv4, leave blank for only ipv6"); + System.out.println("Only Ipv6 is not recommended!"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + host4Name = Optional.empty(); break; } + if (!validator.isValidInet4Address(input)) { + System.out.println("Please provide your real ipv4 address :)"); + continue; + } + host4Name = Optional.of(input); + break; + } - System.out.println("please provide your service ipv6, leave blank for only ipv4"); - while ((input = reader.readLine()) != null) { - if (input.isEmpty()) { - host6Name = Optional.empty(); - break; - } - if (!validator.isValidInet6Address(input)) { - System.out.println("Please provide your real ipv6 address :)"); - continue; - } - host6Name = Optional.of(input); + System.out.println("please provide your service ipv6, leave blank for only ipv4"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + host6Name = Optional.empty(); break; } + if (!validator.isValidInet6Address(input)) { + System.out.println("Please provide your real ipv6 address :)"); + continue; + } + host6Name = Optional.of(input); + break; } + //} if (!host4Name.isPresent() && !host6Name.isPresent()) { //TODO: Exit or rerequest data @@ -122,37 +122,36 @@ public CloudNetWrapperConfig(ConsoleReader reader) throws Exception { Optional cloud4Host = Optional.empty(); Optional cloud6Host = Optional.empty(); - if (cloudNetHost.equals("127.0.0.1") || cloudNetHost.equals("127.0.1.1") || cloudNetHost.split("\\.").length != 4) { - String input; - System.out.println("Please provide your master ipv4, leave blank for only ipv6"); - System.out.println("Only Ipv6 is not recommended!"); - while ((input = reader.readLine()) != null) { - if (input.isEmpty()) { - cloud4Host = Optional.empty(); - break; - } - if (!validator.isValidInet4Address(input)) { - System.out.println("Please provide the real ipv4 address :)"); - continue; - } - cloud4Host = Optional.of(input); + //if (cloudNetHost.equals("127.0.0.1") || cloudNetHost.equals("127.0.1.1") || cloudNetHost.split("\\.").length != 4) { + System.out.println("Please provide your master ipv4, leave blank for only ipv6"); + System.out.println("Only Ipv6 is not recommended!"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + cloud4Host = Optional.empty(); break; } + if (!validator.isValidInet4Address(input)) { + System.out.println("Please provide the real ipv4 address :)"); + continue; + } + cloud4Host = Optional.of(input); + break; + } - System.out.println("please provide your service ipv6, leave blank for only ipv4"); - while ((input = reader.readLine()) != null) { - if (input.isEmpty()) { - cloud6Host = Optional.empty(); - break; - } - if (!validator.isValidInet6Address(input)) { - System.out.println("Please provide the real ipv6 address :)"); - continue; - } - cloud6Host = Optional.of(input); + System.out.println("please provide your service ipv6, leave blank for only ipv4"); + while ((input = reader.readLine()) != null) { + if (input.isEmpty()) { + cloud6Host = Optional.empty(); break; } + if (!validator.isValidInet6Address(input)) { + System.out.println("Please provide the real ipv6 address :)"); + continue; + } + cloud6Host = Optional.of(input); + break; } + // } if (!cloud6Host.isPresent() && !cloud4Host.isPresent()) { //TODO: Exit or rerequest data @@ -204,9 +203,9 @@ public CloudNetWrapperConfig load() { this.percentOfCPUForANewProxy = configuration.getDouble("general.percentOfCPUForANewProxy"); this.percentOfCPUForANewServer = configuration.getDouble("general.percentOfCPUForANewServer"); - this.cloudnet4Host = !configuration.getString("connection.cloudnet-4host").isEmpty() ? Optional.of(configuration.getString( + this.cloudnet4Host = !configuration.getString("connection.cloudnet-4host").equals("") ? Optional.of(configuration.getString( "connection.cloudnet-4host")) : Optional.empty(); - this.cloudnet6Host = !configuration.getString("connection.cloudnet-6host").isEmpty() ? Optional.of(configuration.getString( + this.cloudnet6Host = !configuration.getString("connection.cloudnet-4host").equals("") ? Optional.of(configuration.getString( "connection.cloudnet-6host")) : Optional.empty(); this.cloudnetPort = configuration.getInt("connection.cloudnet-port"); this.webPort = configuration.getInt("connection.cloudnet-web"); @@ -261,12 +260,13 @@ public Path getPath() { public Optional getCloudnetHost() { try { + InetAddressValidator validator = new InetAddressValidator(); if (cloudnet6Host.isPresent() && validator.isValidInet6Address(cloudnet6Host.get())) { return Optional.of(InetAddress.getByName(cloudnet6Host.get())); } - if (cloudnet4Host.isPresent() && validator.isValidInet6Address(cloudnet4Host.get())) { + if (cloudnet4Host.isPresent() && validator.isValidInet4Address(cloudnet4Host.get())) { return Optional.of(InetAddress.getByName(cloudnet4Host.get())); } } catch (UnknownHostException ignore) { From 1ee2c9eaee97d8023c1dd0298e309586d94f83e7 Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Thu, 11 Jun 2020 14:40:51 +0200 Subject: [PATCH 09/10] general Development --- .../v2/lib/network/NetworkConnection.java | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java index dc680e4a5..3a718b848 100644 --- a/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java +++ b/cloudnet-lib/src/main/java/eu/cloudnetservice/cloudnet/v2/lib/network/NetworkConnection.java @@ -12,8 +12,6 @@ import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; -import java.net.Inet4Address; -import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Collections; @@ -139,17 +137,6 @@ public boolean tryDisconnect() { public void tryConnect(final NetDispatcher netDispatcher, final Auth auth) { tryConnect(netDispatcher, auth, null); - } @Override - public void send(Object object) { - if (channel == null) { - return; - } - - if (channel.eventLoop().inEventLoop()) { - channel.writeAndFlush(object); - } else { - channel.eventLoop().execute(() -> channel.writeAndFlush(object)); - } } public boolean tryConnect(SimpleChannelInboundHandler channelInboundHandler, Auth auth, Runnable cancelTask) { @@ -164,24 +151,10 @@ protected void initChannel(Channel channel) { }) .channel(NetworkUtils.socketChannel()); InetAddress addr = connectableAddress.getHostName(); - InetSocketAddress destination = null; - - if (addr instanceof Inet6Address) { - Inet6Address tmp = (Inet6Address) addr; - if (tmp.getScopeId() != 0) { - destination = new InetSocketAddress(InetAddress.getByAddress(tmp.getAddress()), connectableAddress.getPort()); - } - } else if (addr instanceof Inet4Address) { - Inet4Address tmp = (Inet4Address) addr; - destination = new InetSocketAddress(InetAddress.getByAddress(tmp.getAddress()), connectableAddress.getPort()); - } - - if(destination == null){ - throw new NullPointerException("NetworkConnection - No valid destination found!"); - } + InetSocketAddress dest = new InetSocketAddress(addr, connectableAddress.getPort()); + InetSocketAddress localdest = new InetSocketAddress(localAddress.getHostName(), localAddress.getPort()); - this.channel = bootstrap.connect(destination, - new InetSocketAddress(localAddress.getHostName(), localAddress.getPort())) + this.channel = bootstrap.connect(dest, localdest) .sync() .channel() .writeAndFlush(new PacketOutAuth(auth)) @@ -209,16 +182,28 @@ protected void initChannel(Channel channel) { public boolean isConnected() { return channel != null; + } @Override + public void send(Object object) { + if (channel == null) { + return; + } + + if (channel.eventLoop().inEventLoop()) { + channel.writeAndFlush(object); + } else { + channel.eventLoop().execute(() -> channel.writeAndFlush(object)); + } } + + + @Override public void sendSynchronized(Object object) { channel.writeAndFlush(object).syncUninterruptibly(); } - - @Override public void sendAsynchronous(Object object) { NetworkUtils.getExecutor().submit(() -> { From f10a8d9a79f07439f52d848b657a52e94d115bfb Mon Sep 17 00:00:00 2001 From: Lukas Lanzner Date: Sat, 20 Jun 2020 14:40:43 +0200 Subject: [PATCH 10/10] update CloudBootstrap.java, altering Ipv4Stack Preferations --- .../cloudnet/v2/master/bootstrap/CloudBootstrap.java | 3 ++- .../cloudnet/v2/wrapper/bootstrap/CloudBootstrap.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/bootstrap/CloudBootstrap.java b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/bootstrap/CloudBootstrap.java index 730687ca9..0e719f927 100644 --- a/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/bootstrap/CloudBootstrap.java +++ b/cloudnet-master/src/main/java/eu/cloudnetservice/cloudnet/v2/master/bootstrap/CloudBootstrap.java @@ -24,7 +24,8 @@ public final class CloudBootstrap { public static synchronized void main(String[] args) { System.setProperty("file.encoding", "UTF-8"); - System.setProperty("java.net.preferIPv4Stack", "true"); + System.setProperty("java.net.preferIPv6Stack", "true"); + System.setProperty("java.net.preferIPv4Stack", "false"); InternalLoggerFactory.setDefaultFactory(JdkLoggerFactory.INSTANCE); diff --git a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/bootstrap/CloudBootstrap.java b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/bootstrap/CloudBootstrap.java index b327e1607..a934bcaec 100644 --- a/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/bootstrap/CloudBootstrap.java +++ b/cloudnet-wrapper/src/main/java/eu/cloudnetservice/cloudnet/v2/wrapper/bootstrap/CloudBootstrap.java @@ -22,7 +22,8 @@ public class CloudBootstrap { public static void main(String[] args) throws Exception { System.setProperty("file.encoding", "UTF-8"); - System.setProperty("java.net.preferIPv4Stack", "true"); + System.setProperty("java.net.preferIPv6Stack", "true"); + System.setProperty("java.net.preferIPv4Stack", "false"); OptionParser optionParser = new OptionParser();