diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml
index 99e27316..c0c4a989 100644
--- a/SubServers.Bungee/pom.xml
+++ b/SubServers.Bungee/pom.xml
@@ -29,6 +29,12 @@
0.8.16
compile
+
+ com.dosse.upnp
+ WaifUPnP
+ 1.1
+ compile
+
com.imaginarycode.minecraft
RedisBungee
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
index 2c77bc8f..6381e6ba 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
@@ -86,7 +86,7 @@ public class ExternalHost extends Host implements ClientHandler {
clean = true;
}
for (SubServer server : servers.values()) {
- client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
+ client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
}
while (queue.size() != 0) {
client.get().sendPacket(queue.get(0));
@@ -148,7 +148,7 @@ public class ExternalHost extends Host implements ClientHandler {
SubAddServerEvent event = new SubAddServerEvent(player, this, server);
plugin.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
- queue(new PacketExAddServer(name, enabled, log, directory, executable, stopcmd, (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
+ queue(new PacketExAddServer(name, enabled, port, log, directory, executable, stopcmd, (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
servers.put(name.toLowerCase(), server);
return server;
} else {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java
index fbca3894..fcdbe9f1 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Bungee.Host.Internal;
+import com.dosse.upnp.UPnP;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
import net.ME1312.SubServers.Bungee.Host.Executable;
@@ -101,6 +102,7 @@ public class InternalHost extends Host {
plugin.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
servers.put(name.toLowerCase(), server);
+ if (UPnP.isUPnPAvailable() && plugin.config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(port);
return server;
} else {
return null;
@@ -118,6 +120,8 @@ public class InternalHost extends Host {
getSubServer(server).stop();
getSubServer(server).waitFor();
}
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort()))
+ UPnP.closePortTCP(getSubServer(server).getAddress().getPort());
servers.remove(server.toLowerCase());
return true;
} else return false;
@@ -132,6 +136,8 @@ public class InternalHost extends Host {
if (getSubServer(server).isRunning()) {
getSubServer(server).terminate();
}
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort()))
+ UPnP.closePortTCP(getSubServer(server).getAddress().getPort());
servers.remove(server.toLowerCase());
return true;
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml
index afb3aab4..8b14a373 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml
@@ -2,6 +2,10 @@ Settings:
Version: '2.11.2a+'
Log-Creator: true
Override-Bungee-Commands: true
+ UPnP:
+ Forward-Proxy: true
+ Forward-SubData: false
+ Forward-Servers: false
SubData:
Address: '127.0.0.1:4391'
Password: 'default'
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExAddServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExAddServer.java
index a9a912d2..cbe4c8f4 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExAddServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExAddServer.java
@@ -19,6 +19,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
private static HashMap[]> callbacks = new HashMap[]>();
private String name;
private boolean enabled;
+ private int port;
private boolean log;
private String directory;
private Executable executable;
@@ -41,10 +42,11 @@ public class PacketExAddServer implements PacketIn, PacketOut {
* @param executable Executable
*/
@SafeVarargs
- public PacketExAddServer(String name, boolean enabled, boolean log, String directory, Executable executable, String stopcmd, UUID running, Callback... callback) {
+ public PacketExAddServer(String name, boolean enabled, int port, boolean log, String directory, Executable executable, String stopcmd, UUID running, Callback... callback) {
if (Util.isNull(name, enabled, log, directory, executable, callback)) throw new NullPointerException();
this.name = name;
this.enabled = enabled;
+ this.port = port;
this.log = log;
this.directory = directory;
this.executable = executable;
@@ -61,6 +63,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
YAMLSection server = new YAMLSection();
server.set("name", name);
server.set("enabled", enabled);
+ server.set("port", port);
server.set("log", log);
server.set("dir", directory);
server.set("exec", executable.toString());
@@ -78,6 +81,6 @@ public class PacketExAddServer implements PacketIn, PacketOut {
@Override
public Version getVersion() {
- return new Version("2.11.0a");
+ return new Version("2.13.1b");
}
}
\ No newline at end of file
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
index b2130c0e..152bf833 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Bungee.Network;
+import com.dosse.upnp.UPnP;
import com.google.gson.Gson;
import net.ME1312.SubServers.Bungee.Event.SubNetworkConnectEvent;
import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent;
@@ -56,6 +57,7 @@ public final class SubDataServer {
server = new ServerSocket(port, MAX_QUEUE, address);
allowConnection(address.getHostAddress());
}
+ if (UPnP.isUPnPAvailable() && plugin.config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-SubData", false)) UPnP.openPortTCP(port);
this.plugin = plugin;
this.cipher = (cipher != null)?cipher:new Cipher() {
@Override
@@ -478,6 +480,7 @@ public final class SubDataServer {
removeClient((Client) clients.values().toArray()[0]);
}
server.close();
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getLocalPort())) UPnP.closePortTCP(server.getLocalPort());
System.out.println("SubServers > The SubData Listener has been closed");
plugin.subdata = null;
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
index 876c484f..65387d8a 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Bungee;
+import com.dosse.upnp.UPnP;
import com.google.gson.Gson;
import net.ME1312.SubServers.Bungee.Event.SubAddProxyEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent;
@@ -11,24 +12,19 @@ import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.SubServers.Bungee.Library.Version.Version;
-import net.ME1312.SubServers.Bungee.Library.Version.VersionType;
import net.ME1312.SubServers.Bungee.Network.Cipher;
import net.ME1312.SubServers.Bungee.Network.ClientHandler;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutReload;
import net.ME1312.SubServers.Bungee.Network.SubDataServer;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.BungeeServerInfo;
+import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
@@ -61,7 +57,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
public final SubAPI api = new SubAPI(this);
public SubDataServer subdata = null;
public SubServer sudo = null;
- public static final Version version = Version.fromString("2.13.1a");
+ public static final Version version = Version.fromString("2.13.1b");
public Proxy redis = null;
public boolean canSudo = false;
@@ -519,6 +515,13 @@ public final class SubPlugin extends BungeeCord implements Listener {
for (Server server : api.getServers().values()) if (server.getSubData() != null) server.getSubData().sendPacket(new PacketOutReload(null));
}
+ if (UPnP.isUPnPAvailable()) {
+ if (config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Proxy", true)) for (ListenerInfo listener : getConfig().getListeners()) {
+ UPnP.openPortTCP(listener.getHost().getPort());
+ }
+ } else {
+ getLogger().warning("UPnP is currently unavailable; Ports may not be automatically forwarded on this device");
+ }
System.out.println("SubServers > " + ((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + ((proxies > 1)?proxies+" Proxies, ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
}
@@ -592,6 +595,10 @@ public final class SubPlugin extends BungeeCord implements Listener {
shutdown();
subdata.destroy();
+
+ for (ListenerInfo listener : getConfig().getListeners()) {
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort());
+ }
} catch (Exception e) {
e.printStackTrace();
}
@@ -614,6 +621,10 @@ public final class SubPlugin extends BungeeCord implements Listener {
getPluginManager().callEvent(new SubRemoveProxyEvent(proxies.get(proxy)));
}
proxies.clear();
+
+ for (ListenerInfo listener : getConfig().getListeners()) {
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort());
+ }
}
String getNewSignature() {
@@ -709,7 +720,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
@SuppressWarnings("deprecation")
- @EventHandler(priority = Byte.MAX_VALUE)
+ @EventHandler(priority = Byte.MIN_VALUE)
public void fallback(ServerKickEvent e) {
if (e.getPlayer().getPendingConnection().getListener().isForceDefault()) {
int i = 0;
diff --git a/SubServers.Client/Bukkit/src/plugin.yml b/SubServers.Client/Bukkit/src/plugin.yml
index ea36679a..23a5a172 100644
--- a/SubServers.Client/Bukkit/src/plugin.yml
+++ b/SubServers.Client/Bukkit/src/plugin.yml
@@ -1,6 +1,6 @@
name: 'SubServers-Client-Bukkit'
main: 'net.ME1312.SubServers.Client.Bukkit.SubPlugin'
-version: '2.13.1a'
+version: '2.13.1b'
authors: [ME1312]
softdepend: [Vault, TitleManager]
website: 'https://github.com/ME1312/SubServers-2'
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
index 694df15e..dd78173a 100644
--- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
@@ -46,7 +46,7 @@ import java.util.concurrent.TimeUnit;
/**
* SubServers Client Plugin Class
*/
-@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.13.1a", url = "https://github.com/ME1312/SubServers-2", description = "Access your SubServers from Anywhere")
+@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.13.1b", url = "https://github.com/ME1312/SubServers-2", description = "Access your SubServers from Anywhere")
public final class SubPlugin {
protected NamedContainer>> lang = null;
public YAMLConfig config;
diff --git a/SubServers.Host/pom.xml b/SubServers.Host/pom.xml
index 76213809..1669de7a 100644
--- a/SubServers.Host/pom.xml
+++ b/SubServers.Host/pom.xml
@@ -29,6 +29,12 @@
0.8.16
compile
+
+ com.dosse.upnp
+ WaifUPnP
+ 1.1
+ compile
+
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
index a8b2a047..9d712988 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Host;
+import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLConfig;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
@@ -32,7 +33,7 @@ import java.util.jar.Manifest;
/**
* SubServers.Host Main Class
*/
-@Plugin(name = "SubServers.Host", version = "2.13.1a", authors = "ME1312", description = "Host SubServers from other Machines", website = "https://github.com/ME1312/SubServers-2")
+@Plugin(name = "SubServers.Host", version = "2.13.1b", authors = "ME1312", description = "Host SubServers from other Machines", website = "https://github.com/ME1312/SubServers-2")
public final class ExHost {
protected NamedContainer>> lang = null;
public HashMap templates = new HashMap();
@@ -209,6 +210,10 @@ public final class ExHost {
});
engine.start(this::stop);
+
+ if (!UPnP.isUPnPAvailable()) {
+ log.warn.println("UPnP is currently unavailable; Ports may not be automatically forwarded on this device");
+ }
} catch (Exception e) {
log.error.println(e);
stop();
@@ -256,6 +261,7 @@ public final class ExHost {
} catch (Exception e) {
log.error.println(e);
}
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(servers.get(server).getPort())) UPnP.closePortTCP(servers.get(server).getPort());
}
servers.clear();
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubServer.java
index b2d25976..622ab6fd 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubServer.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubServer.java
@@ -22,6 +22,7 @@ public class SubServer {
private ExHost host;
private String name;
private boolean enabled;
+ private int port;
private Container log;
private String dir;
private File directory;
@@ -46,11 +47,12 @@ public class SubServer {
* @param stopcmd Stop Command
* @throws InvalidServerException
*/
- public SubServer(ExHost host, String name, boolean enabled, boolean log, String directory, Executable executable, String stopcmd) throws InvalidServerException {
+ public SubServer(ExHost host, String name, boolean enabled, int port, boolean log, String directory, Executable executable, String stopcmd) throws InvalidServerException {
if (Util.isNull(host, name, enabled, log, directory, executable)) throw new NullPointerException();
this.host = host;
this.name = name;
this.enabled = enabled;
+ this.port = port;
this.log = new Container(log);
this.dir = directory;
this.directory = new File(host.host.getRawString("Directory"), directory);
@@ -237,6 +239,15 @@ public class SubServer {
enabled = value;
}
+ /**
+ * Get the Port of the Server
+ *
+ * @return Server Port Number
+ */
+ public int getPort() {
+ return port;
+ }
+
/**
* If the Server is Logging
*
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Files/config.yml b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Files/config.yml
index 98796dde..5ff70930 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Files/config.yml
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Files/config.yml
@@ -3,6 +3,8 @@ Settings:
Console-Log: true
Network-Log: true
Server-Bind: '127.0.0.1'
+ UPnP:
+ Forward-Servers: false
SubData:
Name: 'undefined'
Address: '127.0.0.1:4391'
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExAddServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExAddServer.java
index fff66eae..b62c3fff 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExAddServer.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExAddServer.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Host.Network.Packet;
+import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
@@ -69,9 +70,10 @@ public class PacketExAddServer implements PacketIn, PacketOut {
if (host.servers.keySet().contains(data.getSection("server").getRawString("name").toLowerCase())) {
host.subdata.sendPacket(new PacketExAddServer(0, "Server Already Added", (data.contains("id"))?data.getRawString("id"):null));
} else {
- SubServer server = new SubServer(host, data.getSection("server").getRawString("name"), data.getSection("server").getBoolean("enabled"), data.getSection("server").getBoolean("log"),
+ SubServer server = new SubServer(host, data.getSection("server").getRawString("name"), data.getSection("server").getBoolean("enabled"), data.getSection("server").getInt("port"), data.getSection("server").getBoolean("log"),
data.getSection("server").getRawString("dir"), new Executable(data.getSection("server").getRawString("exec")), data.getSection("server").getRawString("stopcmd"));
host.servers.put(data.getSection("server").getRawString("name").toLowerCase(), server);
+ if (UPnP.isUPnPAvailable() && host.config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(server.getPort());
log.info.println("Added SubServer: " + data.getSection("server").getRawString("name"));
if (data.getSection("server").contains("running")) server.start(UUID.fromString(data.getSection("server").getRawString("running")));
host.subdata.sendPacket(new PacketExAddServer(0, "Server Added Successfully", (data.contains("id"))?data.getRawString("id"):null));
@@ -84,6 +86,6 @@ public class PacketExAddServer implements PacketIn, PacketOut {
@Override
public Version getVersion() {
- return new Version("2.11.0a");
+ return new Version("2.13.1b");
}
}
\ No newline at end of file
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDeleteServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDeleteServer.java
index 4a253ee4..2779464c 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDeleteServer.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDeleteServer.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Host.Network.Packet;
+import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
@@ -102,6 +103,7 @@ public class PacketExDeleteServer implements PacketIn, PacketOut {
} catch (Exception e) {
e.printStackTrace();
}
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getPort())) UPnP.closePortTCP(server.getPort());
log.info.println("Deleted SubServer: " + data.getRawString("server"));
host.subdata.sendPacket(new PacketExDeleteServer(0, "Server Deleted Successfully", (data.contains("id"))?data.getRawString("id"):null));
}).start();
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExRemoveServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExRemoveServer.java
index b9a1d706..c517d57f 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExRemoveServer.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExRemoveServer.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Host.Network.Packet;
+import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
@@ -68,6 +69,8 @@ public class PacketExRemoveServer implements PacketIn, PacketOut {
} else if (host.servers.get(data.getRawString("server").toLowerCase()).isRunning()) {
host.subdata.sendPacket(new PacketExRemoveServer(2, "That server is still running.", (data.contains("id"))?data.getRawString("id"):null));
} else {
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(host.servers.get(data.getRawString("server").toLowerCase()).getPort()))
+ UPnP.closePortTCP(host.servers.get(data.getRawString("server").toLowerCase()).getPort());
host.servers.remove(data.getRawString("server").toLowerCase());
log.info.println("Removed SubServer: " + data.getRawString("server"));
host.subdata.sendPacket(new PacketExRemoveServer(0, "Server Removed Successfully", (data.contains("id"))?data.getRawString("id"):null));
diff --git a/SubServers.Sync/pom.xml b/SubServers.Sync/pom.xml
index 4939f3c8..ce574f40 100644
--- a/SubServers.Sync/pom.xml
+++ b/SubServers.Sync/pom.xml
@@ -37,6 +37,12 @@
0.8.16
compile
+
+ com.dosse.upnp
+ WaifUPnP
+ 1.1
+ compile
+
com.imaginarycode.minecraft
RedisBungee
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Files/config.yml b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Files/config.yml
index 5eb4ecf7..1d757a70 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Files/config.yml
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Files/config.yml
@@ -1,6 +1,8 @@
Settings:
Version: '2.11.2a+'
Override-Bungee-Commands: true
+ UPnP:
+ Forward-Proxy: true
SubData:
Address: '127.0.0.1:4391'
Password: 'default'
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
index 3538c534..b0c8c9ab 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
@@ -1,5 +1,6 @@
package net.ME1312.SubServers.Sync;
+import com.dosse.upnp.UPnP;
import com.google.gson.Gson;
import net.ME1312.SubServers.Sync.Event.*;
import net.ME1312.SubServers.Sync.Library.Config.YAMLConfig;
@@ -16,6 +17,7 @@ import net.ME1312.SubServers.Sync.Network.SubDataClient;
import net.ME1312.SubServers.Sync.Server.Server;
import net.ME1312.SubServers.Sync.Server.SubServer;
import net.md_5.bungee.BungeeCord;
+import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
@@ -50,7 +52,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
public boolean redis = false;
public final SubAPI api = new SubAPI(this);
public SubDataClient subdata = null;
- public static final Version version = Version.fromString("2.13.1a");
+ public static final Version version = Version.fromString("2.13.1b");
public final boolean isPatched;
public long lastReload = -1;
@@ -110,6 +112,15 @@ public final class SubPlugin extends BungeeCord implements Listener {
Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
super.startListeners();
+
+ if (UPnP.isUPnPAvailable()) {
+ if (config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Proxy", true)) for (ListenerInfo listener : getConfig().getListeners()) {
+ UPnP.openPortTCP(listener.getHost().getPort());
+ }
+ } else {
+ getLogger().warning("UPnP is currently unavailable; Ports may not be automatically forwarded on this device");
+ }
+
if (!posted) {
posted = true;
post();
@@ -224,6 +235,10 @@ public final class SubPlugin extends BungeeCord implements Listener {
servers.clear();
subdata.destroy(0);
+
+ for (ListenerInfo listener : getConfig().getListeners()) {
+ if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort());
+ }
} catch (Exception e) {
e.printStackTrace();
}
@@ -245,7 +260,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
@SuppressWarnings("deprecation")
- @EventHandler(priority = Byte.MAX_VALUE)
+ @EventHandler(priority = Byte.MIN_VALUE)
public void fallback(ServerKickEvent e) {
if (e.getPlayer().getPendingConnection().getListener().isForceDefault()) {
int i = 0;