Skip to content

Commit

Permalink
Reduce dependance on SubServers.Bungee
Browse files Browse the repository at this point in the history
SubServers.Host can now seamlessly reconnect to SubServers.Bungee, even if it's been restarted, without restarting uneffected servers.

Also, you can now shutdown SubServers.Bungee without turning off remote servers. Isn't that neat?
  • Loading branch information
ME1312 committed Aug 30, 2019
1 parent 3ff2459 commit 81d37b8
Show file tree
Hide file tree
Showing 20 changed files with 234 additions and 127 deletions.
Expand Up @@ -19,6 +19,7 @@
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExRemoveServer;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExReset;
import net.ME1312.SubServers.Bungee.SubPlugin;
import net.md_5.bungee.BungeeCord;

import java.net.InetAddress;
import java.util.*;
Expand Down Expand Up @@ -106,7 +107,9 @@ private void requeue() {
clean = true;
}
for (SubServer server : servers.values()) {
client.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));
client.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, data -> {
if (data.contains(0x0002)) ((ExternalSubServer) server).started(data.getUUID(0x0002));
}));
}
while (queue.size() != 0) {
client.sendPacket(queue.get(0));
Expand Down Expand Up @@ -164,11 +167,13 @@ public SubServer getSubServer(String name) {
@Override
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 {
if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!");
SubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
ExternalSubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
SubAddServerEvent event = new SubAddServerEvent(player, this, server);
plugin.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
queue(new PacketExAddServer(name, enabled, port, 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, data -> {
if (data.contains(0x0002)) server.started(data.getUUID(0x0002));
}));
servers.put(name.toLowerCase(), server);
return server;
} else {
Expand Down Expand Up @@ -367,6 +372,14 @@ public boolean forceDeleteSubServer(UUID player, String name) throws Interrupted
return true;
}

@Override
public boolean destroy() {
if (Util.getDespiteException(() -> Util.reflect(BungeeCord.class.getDeclaredField("isRunning"), plugin), true)) {
return super.destroy();
}
return true;
}

@Override
public ObjectMap<String> forSubData() {
ObjectMap<String> hinfo = super.forSubData();
Expand Down
Expand Up @@ -79,14 +79,18 @@ public boolean start(UUID player) {
lock = false;
if (!event.isCancelled()) {
Logger.get("SubServers").info("Now starting " + getName());
started = false;
running = true;
logger.start();
started(null);
host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.START, logger.getExternalAddress().toString()));
return true;
} else return false;
} else return false;
}
void started(UUID address) {
started = false;
running = true;
logger.start();
if (address != null && address != logger.getExternalAddress()) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_LOGGING_ADDRESS, logger.getExternalAddress().toString()));
}
private void falsestart() {
Logger.get("SubServers").info("Couldn't start " + getName() + " - See the " + host.getName() + " console for more details");
running = false;
Expand Down
27 changes: 24 additions & 3 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java
Expand Up @@ -13,9 +13,7 @@
import net.ME1312.SubServers.Bungee.SubPlugin;

import java.net.InetAddress;
import java.util.LinkedList;
import java.util.Map;
import java.util.UUID;
import java.util.*;

/**
* Host Layout Class
Expand Down Expand Up @@ -390,6 +388,29 @@ public boolean forceDeleteSubServer(String name) throws InterruptedException {
*/
public abstract boolean forceDeleteSubServer(UUID player, String name) throws InterruptedException;

/**
* Resets this Host object
*
* @return Success Status
*/
public boolean destroy() {
try {
List<String> subservers = new ArrayList<String>();
subservers.addAll(getSubServers().keySet());

for (String server : subservers) {
forceRemoveSubServer(server);
}
subservers.clear();
getCreator().terminate();
getCreator().waitFor();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

/**
* Get the Signature of this Object
*
Expand Down
Expand Up @@ -11,6 +11,7 @@
import net.ME1312.SubServers.Bungee.SubPlugin;

import java.util.Arrays;
import java.util.UUID;

/**
* Edit External Server Packet
Expand All @@ -31,7 +32,8 @@ public enum UpdateType {
// Data Manipulation
SET_ENABLED(0, Boolean.class),
SET_LOGGING(5, Boolean.class),
SET_STOP_COMMAND(6, String.class);
SET_LOGGING_ADDRESS(6, String.class),
SET_STOP_COMMAND(7, String.class);

private short value;
private Class<?>[] args;
Expand Down
28 changes: 4 additions & 24 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java
Expand Up @@ -272,20 +272,10 @@ public boolean removeHost(UUID player, String name) {
SubRemoveHostEvent event = new SubRemoveHostEvent(player, getHost(name));
plugin.getPluginManager().callEvent(event);
if (event.isCancelled()) {
try {
List<String> subservers = new ArrayList<String>();
subservers.addAll(getHost(name).getSubServers().keySet());

for (String server : subservers) {
getHost(name).removeSubServer(server);
}
subservers.clear();
getHost(name).getCreator().terminate();
getHost(name).getCreator().waitFor();
if (getHost(name).destroy()) {
plugin.hosts.remove(name.toLowerCase());
return true;
} catch (Exception e) {
e.printStackTrace();
} else {
return false;
}
} else return false;
Expand All @@ -312,20 +302,10 @@ public boolean forceRemoveHost(UUID player, String name) {
if (Util.isNull(name, getHost(name))) throw new NullPointerException();
SubRemoveHostEvent event = new SubRemoveHostEvent(player, getHost(name));
plugin.getPluginManager().callEvent(event);
try {
List<String> subservers = new ArrayList<String>();
subservers.addAll(getHost(name).getSubServers().keySet());

for (String server : subservers) {
getHost(name).removeSubServer(server);
}
subservers.clear();
getHost(name).getCreator().terminate();
getHost(name).getCreator().waitFor();
if (getHost(name).destroy()) {
plugin.hosts.remove(name.toLowerCase());
return true;
} catch (Exception e) {
e.printStackTrace();
} else {
return false;
}
}
Expand Down
8 changes: 2 additions & 6 deletions SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
Expand Up @@ -2,9 +2,7 @@

import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Engine.GalaxiOption;
import net.ME1312.Galaxi.Event.GalaxiReloadEvent;
import net.ME1312.Galaxi.Galaxi;
import net.ME1312.Galaxi.Library.Config.YAMLConfig;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
Expand All @@ -18,18 +16,16 @@
import net.ME1312.Galaxi.Plugin.PluginInfo;
import net.ME1312.SubData.Client.Encryption.AES;
import net.ME1312.SubData.Client.Encryption.RSA;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubCreator;
import net.ME1312.SubServers.Host.Executable.SubLogger;
import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Executable.SubServerImpl;
import net.ME1312.SubServers.Host.Library.*;
import net.ME1312.SubServers.Host.Library.Updates.ConfigUpdater;
import net.ME1312.SubServers.Host.Network.SubProtocol;
import org.json.JSONObject;

import java.io.*;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.URL;
import java.nio.charset.Charset;
Expand All @@ -46,7 +42,7 @@ public final class ExHost {
HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
NamedContainer<Long, Map<String, Map<String, String>>> lang = null;
public HashMap<String, SubCreator.ServerTemplate> templates = new HashMap<String, SubCreator.ServerTemplate>();
public HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
public HashMap<String, SubServerImpl> servers = new HashMap<String, SubServerImpl>();
public SubCreator creator;

public Logger log;
Expand Down
Expand Up @@ -196,7 +196,7 @@ private static ObjectMap<String> toRaw(String name, boolean enabled, String icon
}

private class CreatorTask extends Thread {
private final SubServer update;
private final SubServerImpl update;
private final String name;
private final ServerTemplate template;
private final Version version;
Expand All @@ -214,7 +214,7 @@ private CreatorTask(String name, ServerTemplate template, Version version, int p
this.template = template;
this.version = version;
this.port = port;
this.dir = new File(host.host.getRawString("Directory"), dir.replace("$address$", host.config.get().getMap("Settings").getRawString("Server-Bind")));
this.dir = new File(host.host.getRawString("Directory"), dir);
this.log = new SubLogger(null, this, name + File.separator + ((update == null)?"Creator":"Updater"), address, new Container<Boolean>(true), null);
this.address = address;
this.tracker = tracker;
Expand Down
@@ -1,17 +1,25 @@
package net.ME1312.SubServers.Host.Executable;

import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Callback.ReturnCallback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Container;
import net.ME1312.Galaxi.Library.Log.LogStream;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubData.Client.Library.DisconnectReason;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.Library.TextColor;
import net.ME1312.SubServers.Host.Network.API.Host;
import net.ME1312.SubServers.Host.Network.Packet.PacketOutExLogMessage;
import net.ME1312.SubServers.Host.SubAPI;

import java.io.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -59,7 +67,6 @@ protected SubLogger(Process process, Object user, String name, UUID address, Con
*/
public void start() {
started = true;
if (logn) Util.isException(() -> channel = (SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0].newChannel());
if (file != null && writer == null) {
try {
this.writer = new PrintWriter(file, "UTF-8");
Expand All @@ -69,6 +76,36 @@ public void start() {
logger.error.println(e);
}
}
Process process = this.process;
ExHost host = SubAPI.getInstance().getInternals();
if (logn) Util.isException(() -> {
channel = (SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0].newChannel();
channel.on.closed(new Callback<NamedContainer<DisconnectReason, DataClient>>() {
@Override
public void run(NamedContainer<DisconnectReason, DataClient> client) {
if (started && SubLogger.this.process != null && process == SubLogger.this.process && process.isAlive()) {
int reconnect = host.config.get().getMap("Settings").getMap("SubData").getInt("Reconnect", 30);
if (Util.getDespiteException(() -> Util.reflect(ExHost.class.getDeclaredField("reconnect"), host), false) && reconnect > 0
&& client.name() != DisconnectReason.PROTOCOL_MISMATCH && client.name() != DisconnectReason.ENCRYPTION_MISMATCH) {
Timer timer = new Timer(SubAPI.getInstance().getAppInfo().getName() + "::Log_Reconnect_Handler");
Callback<NamedContainer<DisconnectReason, DataClient>> run = this;
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (!started || SubLogger.this.process == null || process != SubLogger.this.process || !process.isAlive()) {
timer.cancel();
} else try {
channel = (SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0].newChannel();
channel.on.closed(run);
timer.cancel();
} catch (NullPointerException | IOException e) {}
}
}, TimeUnit.SECONDS.toMillis(reconnect), TimeUnit.SECONDS.toMillis(reconnect));
}
}
}
});
});
if (out == null) (out = new Thread(() -> start(process.getInputStream(), false), SubAPI.getInstance().getAppInfo().getName() + "::Log_Spooler(" + name + ')')).start();
if (err == null) (err = new Thread(() -> start(process.getErrorStream(), true), SubAPI.getInstance().getAppInfo().getName() + "::Error_Spooler(" + name + ')')).start();
}
Expand Down Expand Up @@ -194,4 +231,13 @@ public String getName() {
public boolean isLogging() {
return log.get();
}

/**
* Get the Logging Address
*
* @return Address
*/
public UUID getAddress() {
return address;
}
}
Expand Up @@ -19,7 +19,7 @@
/**
* Internal SubServer Class
*/
public class SubServer {
public class SubServerImpl {
private ExHost host;
private String name;
private boolean enabled;
Expand Down Expand Up @@ -48,7 +48,7 @@ public class SubServer {
* @param stopcmd Stop Command
* @throws InvalidServerException
*/
public SubServer(ExHost host, String name, boolean enabled, int port, boolean log, String directory, String executable, String stopcmd) throws InvalidServerException {
public SubServerImpl(ExHost host, String name, boolean enabled, int port, boolean log, String directory, String executable, String stopcmd) throws InvalidServerException {
if (Util.isNull(host, name, enabled, log, directory, executable)) throw new NullPointerException();
this.host = host;
this.name = name;
Expand Down Expand Up @@ -133,7 +133,8 @@ private void run() {
if (falsestart) ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExEditServer(this, PacketExEditServer.UpdateType.LAUNCH_EXCEPTION));
}

((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExEditServer(this, PacketExEditServer.UpdateType.STOPPED, (Integer) process.exitValue(), (Boolean) allowrestart));
if (SubAPI.getInstance().getSubDataNetwork()[0] != null)
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExEditServer(this, PacketExEditServer.UpdateType.STOPPED, (Integer) process.exitValue(), (Boolean) allowrestart));
host.log.info.println(name + " has stopped");
process = null;
command = null;
Expand All @@ -159,6 +160,7 @@ public void stop() {
try {
allowrestart = false;
if (process != null && process.isAlive()) {
System.out.println(stopcmd);
command.write(stopcmd);
command.newLine();
command.flush();
Expand Down Expand Up @@ -289,6 +291,15 @@ public String getDirectory() {
return dir;
}

/**
* Get the Server's Executable String
*
* @return Executable String
*/
public String getExecutable() {
return executable;
}

/**
* Grab the Command to Stop the Server
*
Expand Down

0 comments on commit 81d37b8

Please sign in to comment.