Progress on automatic config setting propagation

This commit is contained in:
Rsl1122 2017-09-24 15:50:46 +03:00
parent 63f8482c4b
commit 6380457ccc
12 changed files with 156 additions and 39 deletions

View File

@ -430,4 +430,10 @@ public class Plan extends BukkitPlugin<Plan> implements IPlan {
public InformationManager getInfoManager() {
return infoManager;
}
public void restart() {
onDisable();
reloadConfig();
onEnable();
}
}

View File

@ -77,6 +77,8 @@ public class PlanBungee extends BungeePlugin<PlanBungee> implements IPlan {
webServer.initServer();
infoManager.attemptConnection();
if (!webServer.isEnabled()) {
Log.error("WebServer was not successfully initialized.");
disablePlugin();

View File

@ -7,7 +7,6 @@ package main.java.com.djrapitops.plan;
import com.djrapitops.plugin.config.IConfig;
import com.djrapitops.plugin.config.fileconfig.IFileConfig;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.api.IPlan;
import java.io.IOException;
import java.util.Map;
@ -23,7 +22,23 @@ import java.util.UUID;
*/
public class ServerSpecificSettings {
public void updateSettings(IPlan plugin, Map<String, String> settings) {
public void addOriginalBukkitSettings(PlanBungee plugin, UUID serverUUID, Map<String, Object> settings) {
try {
IConfig iConfig = plugin.getIConfig();
IFileConfig config = iConfig.getConfig();
if (!Verify.isEmpty(config.getString("Servers." + serverUUID + ".ServerName"))) {
return;
}
for (Map.Entry<String, Object> entry : settings.entrySet()) {
config.set("Servers." + serverUUID + "." + entry.getKey(), entry.getValue());
}
iConfig.save();
} catch (IOException e) {
Log.toLog(this.getClass().getName(), e);
}
}
public void updateSettings(Plan plugin, Map<String, String> settings) {
try {
IFileConfig config = plugin.getIConfig().getConfig();
boolean changedSomething = false;
@ -42,8 +57,7 @@ public class ServerSpecificSettings {
Log.info("----------------------------------");
Log.info("The Received Bungee Settings changed the config values, restarting Plan..");
Log.info("----------------------------------");
plugin.onDisable();
plugin.onEnable();
plugin.restart();
}
} catch (IOException e) {
Log.toLog(this.getClass().getName(), e);

View File

@ -34,9 +34,7 @@ public class ReloadCommand extends SubCommand {
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
plugin.onDisable();
plugin.reloadConfig();
plugin.onEnable();
plugin.restart();
sender.sendMessage(Locale.get(Msg.CMD_INFO_RELOAD_COMPLETE).toString());
return true;
}

View File

@ -24,10 +24,7 @@ import main.java.com.djrapitops.plan.systems.webserver.response.Response;
import main.java.com.djrapitops.plan.systems.webserver.theme.Theme;
import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPIManager;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.RequestInspectPluginsTabBukkitWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.IsCachedWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.PostHtmlWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.PostInspectPluginsTabWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.RequestPluginsTabWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.*;
import main.java.com.djrapitops.plan.systems.webserver.webapi.universal.PingWebAPI;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.Analysis;
@ -226,7 +223,9 @@ public class BukkitInformationManager extends InformationManager {
PingWebAPI api = getWebAPI().getAPI(PingWebAPI.class);
try {
api.sendRequest(webServerAddress);
getWebAPI().getAPI(PostOriginalBukkitSettingsWebAPI.class).sendRequest(webServerAddress);
Log.info("Bungee Connection OK");
plugin.getServerInfoManager().resetConnectionFails();
return true;
} catch (WebAPIConnectionFailException e) {
plugin.getServerInfoManager().markConnectionFail();

View File

@ -5,6 +5,7 @@
package main.java.com.djrapitops.plan.systems.info.server;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.ServerVariableHolder;
import main.java.com.djrapitops.plan.Settings;
@ -123,7 +124,25 @@ public class BukkitServerInfoManager {
}
public void markConnectionFail() {
serverInfoFile.markConnectionFail();
int timesFailed = serverInfoFile.markConnectionFail();
if (timesFailed == -1) {
return;
}
if (timesFailed >= 10) {
try {
serverInfoFile.saveInfo(serverInfo, new ServerInfo(-1, null, "Bungee", "", -1));
Log.info("----------------------------------");
Log.info("Bungee connection has failed 10 times in a row, assuming Bungee uninstalled - Restarting Plan..");
Log.info("----------------------------------");
plugin.restart();
} catch (IOException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}
public void resetConnectionFails() {
serverInfoFile.resetConnectionFails();
}
public int getServerID() {

View File

@ -13,6 +13,7 @@ import main.java.com.djrapitops.plan.api.exceptions.PlanEnableException;
import main.java.com.djrapitops.plan.api.exceptions.WebAPIException;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.ServerTable;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.ConfigurationWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.universal.PingWebAPI;
import java.sql.SQLException;
@ -94,6 +95,20 @@ public class BungeeServerInfoManager {
}
}
private void sendConfigSettings(UUID serverUUID) {
try {
ServerInfo server = bukkitServers.get(serverUUID);
if (server == null) {
return;
}
String webAddress = server.getWebAddress();
Log.debug("Sending config settings to " + webAddress + "");
plugin.getWebServer().getWebAPI().getAPI(ConfigurationWebAPI.class).sendRequest(webAddress, serverUUID);
} catch (WebAPIException e) {
serverHasGoneOffline(serverUUID);
}
}
public void connectedToServer(ServerInfo server) {
Log.info("Connection to Bukkit (" + server.getWebAddress() + ") OK");
bukkitServers.put(server.getUuid(), server);
@ -110,6 +125,7 @@ public class BungeeServerInfoManager {
@Override
public void run() {
attemptConnection(server);
sendConfigSettings(serverUUID);
this.cancel();
}
}).runTaskLaterAsynchronously(TimeAmount.SECOND.ticks() * 3L);

View File

@ -67,12 +67,24 @@ public class ServerInfoFile extends BukkitConfig {
return getConfig().getString("Bungee.WebAddress");
}
public void markConnectionFail() {
public int markConnectionFail() {
try {
IFileConfig config = getConfig();
int fails = config.getInt("Bungee.Fail");
config.set("Bungee.Fail", fails + 1);
save();
return fails;
} catch (IOException e) {
Log.toLog(this.getClass().getName(), e);
}
return -1;
}
public void resetConnectionFails() {
try {
IFileConfig config = getConfig();
config.set("Bungee.Fail", 0);
save();
} catch (IOException e) {
Log.toLog(this.getClass().getName(), e);
}

View File

@ -11,10 +11,7 @@ import main.java.com.djrapitops.plan.locale.Locale;
import main.java.com.djrapitops.plan.locale.Msg;
import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPIManager;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.*;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.IsCachedWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.PostHtmlWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.PostInspectPluginsTabWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.RequestPluginsTabWebAPI;
import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.*;
import main.java.com.djrapitops.plan.systems.webserver.webapi.universal.PingWebAPI;
import main.java.com.djrapitops.plan.utilities.html.HtmlUtils;
@ -68,6 +65,7 @@ public class WebServer {
webAPI.registerNewAPI(new PostHtmlWebAPI());
webAPI.registerNewAPI(new PostInspectPluginsTabWebAPI());
webAPI.registerNewAPI(new RequestPluginsTabWebAPI());
webAPI.registerNewAPI(new PostOriginalBukkitSettingsWebAPI());
}
/**

View File

@ -5,6 +5,8 @@
package main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit;
import com.djrapitops.plugin.utilities.Compatibility;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.ServerSpecificSettings;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.api.IPlan;
@ -21,18 +23,17 @@ import java.util.UUID;
*/
public class ConfigurationWebAPI extends WebAPI {
private Map<String, Object> configValues = new HashMap<>();
@Override
public Response onRequest(IPlan plugin, Map<String, String> variables) {
if (!Compatibility.isBukkitAvailable()) {
return badRequest("Called a Bungee Server");
}
if (Settings.BUNGEE_COPY_CONFIG.isFalse() || Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isTrue()) {
Log.debug("Bungee Config settings overridden on this server.");
return success();
}
variables.remove("sender");
Settings.serverSpecific().updateSettings(plugin, variables);
Settings.serverSpecific().updateSettings((Plan) plugin, variables);
return success();
}
@ -41,23 +42,24 @@ public class ConfigurationWebAPI extends WebAPI {
throw new IllegalStateException("Wrong method call for this WebAPI, call sendRequest(String, UUID, UUID) instead.");
}
public void sendRequest(String address, UUID serverUUID, int newPort) throws WebAPIException {
setConfigValues(serverUUID, newPort);
public void sendRequest(String address, UUID serverUUID) throws WebAPIException {
Map<String, Object> configValues = getConfigValues(serverUUID);
for (Map.Entry<String, Object> entry : configValues.entrySet()) {
addVariable(entry.getKey(), entry.getValue().toString());
}
super.sendRequest(address);
}
private void addConfigValue(Settings setting, Object value) {
private void addConfigValue(Map<String, Object> configValues, Settings setting, Object value) {
configValues.put(setting.getPath(), value);
}
public void setConfigValues(UUID serverUUID, int newPort) throws WebAPIException {
private Map<String, Object> getConfigValues(UUID serverUUID) throws WebAPIException {
Map<String, Object> configValues = new HashMap<>();
if (!Compatibility.isBungeeAvailable()) {
throw new WebAPIException("Attempted to send config values from Bukkit to Bungee.");
}
addConfigValue(Settings.DB_TYPE, "mysql");
addConfigValue(configValues, Settings.DB_TYPE, "mysql");
Settings[] sameStrings = new Settings[]{
Settings.DB_HOST, Settings.DB_USER, Settings.DB_PASS,
Settings.DB_DATABASE, Settings.FORMAT_DECIMALS, Settings.FORMAT_SECONDS,
@ -66,16 +68,18 @@ public class ConfigurationWebAPI extends WebAPI {
Settings.FORMAT_YEAR, Settings.FORMAT_YEARS,
};
for (Settings setting : sameStrings) {
addConfigValue(setting, setting.toString());
addConfigValue(configValues, setting, setting.toString());
}
addConfigValue(Settings.DB_PORT, Settings.DB_PORT.getNumber());
addServerSpecificValues(serverUUID);
addConfigValue(configValues, Settings.DB_PORT, Settings.DB_PORT.getNumber());
addServerSpecificValues(configValues, serverUUID);
return configValues;
}
private void addServerSpecificValues(UUID serverUUID) {
private void addServerSpecificValues(Map<String, Object> configValues, UUID serverUUID) {
ServerSpecificSettings settings = Settings.serverSpecific();
addConfigValue(Settings.THEME_BASE, settings.getString(serverUUID, Settings.THEME_BASE));
addConfigValue(Settings.WEBSERVER_PORT, settings.getInt(serverUUID, Settings.WEBSERVER_PORT));
addConfigValue(Settings.SERVER_NAME, settings.getString(serverUUID, Settings.SERVER_NAME));
addConfigValue(configValues, Settings.THEME_BASE, settings.getString(serverUUID, Settings.THEME_BASE));
addConfigValue(configValues, Settings.WEBSERVER_PORT, settings.getInt(serverUUID, Settings.WEBSERVER_PORT));
addConfigValue(configValues, Settings.SERVER_NAME, settings.getString(serverUUID, Settings.SERVER_NAME));
}
}

View File

@ -0,0 +1,56 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.systems.webserver.webapi.bungee;
import com.djrapitops.plugin.utilities.Compatibility;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.PlanBungee;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.api.IPlan;
import main.java.com.djrapitops.plan.api.exceptions.WebAPIException;
import main.java.com.djrapitops.plan.systems.webserver.response.Response;
import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPI;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class PostOriginalBukkitSettingsWebAPI extends WebAPI {
@Override
public Response onRequest(IPlan plugin, Map<String, String> variables) {
if (Compatibility.isBukkitAvailable()) {
return badRequest("Called a Bukkit Server");
}
Map<String, Object> settings = new HashMap<>();
String webServerPortS = variables.get("WebServerPort");
String serverName = variables.get("ServerName");
String themeBase = variables.get("ThemeBase");
if (!Verify.notNull(webServerPortS, serverName, themeBase)) {
return badRequest("Not all variables were set");
}
int webServerPort = Integer.parseInt(webServerPortS);
settings.put("WebServerPort", webServerPort);
settings.put("ServerName", serverName);
settings.put("ThemeBase", themeBase);
Settings.serverSpecific().addOriginalBukkitSettings((PlanBungee) plugin, UUID.fromString(variables.get("sender")), settings);
return success();
}
@Override
public void sendRequest(String address) throws WebAPIException {
addVariable("WebServerPort", Integer.toString(Settings.WEBSERVER_PORT.getNumber()));
addVariable("ServerName", Settings.SERVER_NAME.toString());
addVariable("ThemeBase", Settings.THEME_BASE.toString());
super.sendRequest(address);
}
}

View File

@ -4,7 +4,6 @@ Server:
Plugin:
Debug: 'false'
Locale: default
WriteNewLocaleFileOnEnable: false
WebServer:
Port: 8804
@ -15,12 +14,6 @@ WebServer:
KeyPass: 'default'
StorePass: 'default'
Alias: 'alias'
Servers:
TODO: TODO AUTO GENERATE
Server1:
Port: 8805
Server2:
Port: 8806
Database:
MySQL: