2016-12-24 05:55:17 +01:00
|
|
|
package net.ME1312.SubServers.Bungee.Host.Internal;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2018-10-08 01:25:08 +02:00
|
|
|
import com.dosse.upnp.UPnP;
|
2019-01-05 22:04:45 +01:00
|
|
|
import com.google.common.collect.Range;
|
2019-04-18 16:02:09 +02:00
|
|
|
import net.ME1312.Galaxi.Library.Config.YAMLSection;
|
2016-12-24 05:55:17 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
|
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
|
2019-04-18 16:02:09 +02:00
|
|
|
import net.ME1312.Galaxi.Library.Map.ObjectMap;
|
2019-05-17 00:36:41 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger;
|
2016-12-24 05:55:17 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.Host;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.SubCreator;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.SubServer;
|
2019-04-18 16:02:09 +02:00
|
|
|
import net.ME1312.Galaxi.Library.UniversalFile;
|
|
|
|
import net.ME1312.Galaxi.Library.Util;
|
2019-08-30 21:44:54 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.SubProxy;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-04-01 18:50:09 +02:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileWriter;
|
2016-12-05 04:21:04 +01:00
|
|
|
import java.net.InetAddress;
|
2017-04-01 18:50:09 +02:00
|
|
|
import java.util.*;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-07 20:06:54 +01:00
|
|
|
/**
|
|
|
|
* Internal Host Class
|
|
|
|
*/
|
2016-12-05 04:21:04 +01:00
|
|
|
public class InternalHost extends Host {
|
2018-09-15 03:05:39 +02:00
|
|
|
public static final boolean DRM_ALLOW = System.getProperty("RM.subservers", "true").equalsIgnoreCase("true");
|
2017-01-06 21:44:34 +01:00
|
|
|
private HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
|
2016-12-05 04:21:04 +01:00
|
|
|
private String name;
|
|
|
|
private boolean enabled;
|
|
|
|
private InetAddress address;
|
2017-01-30 21:22:36 +01:00
|
|
|
private SubCreator creator;
|
2016-12-15 22:04:39 +01:00
|
|
|
private String directory;
|
2019-08-30 21:44:54 +02:00
|
|
|
protected SubProxy plugin;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-07 20:06:54 +01:00
|
|
|
/**
|
|
|
|
* Creates an Internal Host
|
|
|
|
*
|
2019-01-05 22:04:45 +01:00
|
|
|
* @param plugin SubServers Internals
|
|
|
|
* @param name The Name of your Host
|
|
|
|
* @param ports The range of ports to auto-select from
|
|
|
|
* @param log Whether apps like SubCreator should log to console (does not apply to servers)
|
|
|
|
* @param enabled If your host is Enabled
|
|
|
|
* @param address The address of your Host
|
|
|
|
* @param directory The runtime directory of your Host
|
|
|
|
* @param gitBash The Git Bash directory
|
2017-01-07 20:06:54 +01:00
|
|
|
*/
|
2019-08-30 21:44:54 +02:00
|
|
|
public InternalHost(SubProxy plugin, String name, boolean enabled, Range<Integer> ports, boolean log, InetAddress address, String directory, String gitBash) {
|
2019-01-05 22:04:45 +01:00
|
|
|
super(plugin, name, enabled, ports, log, address, directory, gitBash);
|
2018-09-15 03:05:39 +02:00
|
|
|
if (!DRM_ALLOW) throw new IllegalStateException("SubServers' hosting capabilities have been disabled by your provider");
|
2016-12-05 04:21:04 +01:00
|
|
|
this.plugin = plugin;
|
|
|
|
this.name = name;
|
|
|
|
this.enabled = enabled;
|
|
|
|
this.address = address;
|
2019-01-05 22:04:45 +01:00
|
|
|
this.creator = new InternalSubCreator(this, ports, log, gitBash);
|
2016-12-05 04:21:04 +01:00
|
|
|
this.directory = directory;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isEnabled() {
|
|
|
|
return enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setEnabled(boolean value) {
|
|
|
|
this.enabled = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public InetAddress getAddress() {
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
2016-12-15 22:04:39 +01:00
|
|
|
@Override
|
2017-04-24 18:28:16 +02:00
|
|
|
public String getPath() {
|
2016-12-15 22:04:39 +01:00
|
|
|
return directory;
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
@Override
|
|
|
|
public String getName() {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SubCreator getCreator() {
|
|
|
|
return creator;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Map<String, ? extends SubServer> getSubServers() {
|
|
|
|
return new TreeMap<String, SubServer>(servers);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SubServer getSubServer(String name) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
return getSubServers().get(name.toLowerCase());
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-01-04 22:51:58 +01:00
|
|
|
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
|
2016-12-15 22:04:39 +01:00
|
|
|
if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!");
|
2018-08-30 03:55:59 +02:00
|
|
|
SubServer server = new InternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
|
2016-12-15 22:04:39 +01:00
|
|
|
SubAddServerEvent event = new SubAddServerEvent(player, this, server);
|
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
|
|
servers.put(name.toLowerCase(), server);
|
2019-04-18 16:02:09 +02:00
|
|
|
if (UPnP.isUPnPAvailable() && plugin.config.get().getMap("Settings").getMap("UPnP", new ObjectMap<String>()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(port);
|
2016-12-15 22:04:39 +01:00
|
|
|
return server;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-20 00:31:01 +01:00
|
|
|
public boolean removeSubServer(UUID player, String name) throws InterruptedException {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
2018-08-30 03:55:59 +02:00
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server));
|
2016-12-20 00:31:01 +01:00
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2018-08-30 03:55:59 +02:00
|
|
|
if (getSubServer(server).isRunning()) {
|
|
|
|
getSubServer(server).stop();
|
|
|
|
getSubServer(server).waitFor();
|
2016-12-20 00:31:01 +01:00
|
|
|
}
|
2018-10-08 01:25:08 +02:00
|
|
|
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort()))
|
|
|
|
UPnP.closePortTCP(getSubServer(server).getAddress().getPort());
|
2018-08-30 03:55:59 +02:00
|
|
|
servers.remove(server.toLowerCase());
|
2016-12-20 00:31:01 +01:00
|
|
|
return true;
|
|
|
|
} else return false;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-20 00:31:01 +01:00
|
|
|
public boolean forceRemoveSubServer(UUID player, String name) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
2018-08-30 03:55:59 +02:00
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server));
|
2016-12-20 00:31:01 +01:00
|
|
|
plugin.getPluginManager().callEvent(event);
|
2018-08-30 03:55:59 +02:00
|
|
|
if (getSubServer(server).isRunning()) {
|
|
|
|
getSubServer(server).terminate();
|
2017-04-24 18:28:16 +02:00
|
|
|
}
|
2018-10-08 01:25:08 +02:00
|
|
|
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort()))
|
|
|
|
UPnP.closePortTCP(getSubServer(server).getAddress().getPort());
|
2018-08-30 03:55:59 +02:00
|
|
|
servers.remove(server.toLowerCase());
|
2017-04-24 18:28:16 +02:00
|
|
|
return true;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
2017-04-01 18:50:09 +02:00
|
|
|
|
2019-04-18 16:02:09 +02:00
|
|
|
@Override
|
|
|
|
public boolean recycleSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
|
|
|
|
if (removeSubServer(player, server)) {
|
|
|
|
new Thread(() -> {
|
|
|
|
UniversalFile to = new UniversalFile(plugin.dir, "SubServers:Recently Deleted:" + server.toLowerCase());
|
|
|
|
try {
|
|
|
|
if (from.exists()) {
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Moving Files...");
|
2019-04-18 16:02:09 +02:00
|
|
|
if (to.exists()) {
|
|
|
|
if (to.isDirectory()) Util.deleteDirectory(to);
|
|
|
|
else to.delete();
|
|
|
|
}
|
|
|
|
to.mkdirs();
|
|
|
|
Util.copyDirectory(from, to);
|
|
|
|
Util.deleteDirectory(from);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Saving...");
|
2019-04-29 17:05:06 +02:00
|
|
|
YAMLSection info = (plugin.servers.get().getMap("Servers").getKeys().contains(server))?new YAMLSection(plugin.servers.get().getMap("Servers").getMap(server).get()):new YAMLSection();
|
2019-04-18 16:02:09 +02:00
|
|
|
info.set("Name", server);
|
|
|
|
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
|
|
|
|
try {
|
2019-04-29 17:05:06 +02:00
|
|
|
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.servers.get().getMap("Servers").remove(server);
|
|
|
|
plugin.servers.save();
|
2019-04-18 16:02:09 +02:00
|
|
|
}
|
|
|
|
if (!to.exists()) to.mkdirs();
|
|
|
|
FileWriter writer = new FileWriter(new File(to, "info.json"));
|
|
|
|
writer.write(info.toJSON().toString());
|
|
|
|
writer.close();
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Deleted SubServer: " + server);
|
2019-04-18 16:02:09 +02:00
|
|
|
}, "SubServers.Bungee::Internal_Server_Recycler(" + name + ')').start();
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean forceRecycleSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
|
|
|
|
if (forceRemoveSubServer(player, server)) {
|
|
|
|
new Thread(() -> {
|
|
|
|
UniversalFile to = new UniversalFile(plugin.dir, "SubServers:Recently Deleted:" + server.toLowerCase());
|
|
|
|
try {
|
|
|
|
if (from.exists()) {
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Moving Files...");
|
2019-04-18 16:02:09 +02:00
|
|
|
if (to.exists()) {
|
|
|
|
if (to.isDirectory()) Util.deleteDirectory(to);
|
|
|
|
else to.delete();
|
|
|
|
}
|
|
|
|
to.mkdirs();
|
|
|
|
Util.copyDirectory(from, to);
|
|
|
|
Util.deleteDirectory(from);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Saving...");
|
2019-04-29 17:05:06 +02:00
|
|
|
YAMLSection info = (plugin.servers.get().getMap("Servers").getKeys().contains(server))?new YAMLSection(plugin.servers.get().getMap("Servers").getMap(server).get()):new YAMLSection();
|
2019-04-18 16:02:09 +02:00
|
|
|
info.set("Name", server);
|
|
|
|
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
|
|
|
|
try {
|
2019-04-29 17:05:06 +02:00
|
|
|
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.servers.get().getMap("Servers").remove(server);
|
|
|
|
plugin.servers.save();
|
2019-04-18 16:02:09 +02:00
|
|
|
}
|
|
|
|
if (!to.exists()) to.mkdirs();
|
|
|
|
FileWriter writer = new FileWriter(new File(to, "info.json"), false);
|
|
|
|
writer.write(info.toJSON().toString());
|
|
|
|
writer.close();
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Deleted SubServer: " + server);
|
2019-04-18 16:02:09 +02:00
|
|
|
}, "SubServers.Bungee::Internal_Server_Recycler(" + name + ')').start();
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
2017-04-01 18:50:09 +02:00
|
|
|
@Override
|
|
|
|
public boolean deleteSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
2017-04-14 04:39:51 +02:00
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
2017-04-24 18:28:16 +02:00
|
|
|
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
|
2017-04-14 04:39:51 +02:00
|
|
|
if (removeSubServer(player, server)) {
|
2017-04-01 18:50:09 +02:00
|
|
|
new Thread(() -> {
|
|
|
|
try {
|
|
|
|
if (from.exists()) {
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Removing Files...");
|
2018-03-14 08:01:44 +01:00
|
|
|
Util.deleteDirectory(from);
|
2017-04-01 18:50:09 +02:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Saving...");
|
2017-04-24 18:28:16 +02:00
|
|
|
try {
|
2019-04-29 17:05:06 +02:00
|
|
|
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.servers.get().getMap("Servers").remove(server);
|
|
|
|
plugin.servers.save();
|
2017-04-24 18:28:16 +02:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Deleted SubServer: " + server);
|
2019-01-06 07:58:13 +01:00
|
|
|
}, "SubServers.Bungee::Internal_Server_Deletion(" + name + ')').start();
|
2017-04-24 18:28:16 +02:00
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean forceDeleteSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
|
|
|
|
if (forceRemoveSubServer(player, server)) {
|
|
|
|
new Thread(() -> {
|
|
|
|
try {
|
|
|
|
if (from.exists()) {
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Removing Files...");
|
2018-03-14 08:01:44 +01:00
|
|
|
Util.deleteDirectory(from);
|
2017-04-24 18:28:16 +02:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Saving...");
|
2017-04-01 18:50:09 +02:00
|
|
|
try {
|
2019-04-29 17:05:06 +02:00
|
|
|
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.servers.get().getMap("Servers").remove(server);
|
|
|
|
plugin.servers.save();
|
2017-04-01 18:50:09 +02:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2019-05-17 00:36:41 +02:00
|
|
|
Logger.get("SubServers").info("Deleted SubServer: " + server);
|
2019-01-06 07:58:13 +01:00
|
|
|
}, "SubServers.Bungee::Internal_Server_Deletion(" + name + ')').start();
|
2017-04-01 18:50:09 +02:00
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|