From 2c1c92fef64353e05bf6c0e2fa3bc6a5e7145aae Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Tue, 29 Sep 2020 19:09:40 +0200 Subject: [PATCH] Fix auto-updater failing - Implemented a new self-reload system, which will boot up a separate plugin to load ServerUtils back up again. --- .../bukkit/commands/CommandServerUtils.java | 4 +-- .../bukkit/entities/BukkitPlugin.java | 6 ++++ .../bukkit/managers/BukkitPluginManager.java | 5 +-- .../bungee/entities/BungeePlugin.java | 12 +++++++ .../bungee/managers/BungeePluginManager.java | 13 ++++++++ Common/build.gradle | 8 +++++ .../common/entities/ServerUtilsPlugin.java | 2 ++ .../managers/AbstractPluginManager.java | 2 ++ .../common/tasks/UpdateCheckerTask.java | 30 ++++++++++++++++-- .../src/main/resources/ServerUtilsUpdater.jar | Bin 0 -> 6240 bytes 10 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 Common/src/main/resources/ServerUtilsUpdater.jar diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/CommandServerUtils.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/CommandServerUtils.java index 914a6fc..9c2a03c 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/CommandServerUtils.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/CommandServerUtils.java @@ -177,7 +177,7 @@ public class CommandServerUtils extends BaseCommand { public void onUnloadPlugin(CommandSender commandSender, String pluginName) { ServerCommandSender sender = BukkitUtils.wrap(commandSender); - Result disableResult = BukkitPluginManager.disablePlugin(pluginName); + Result disableResult = BukkitPluginManager.get().disablePlugin(pluginName); if (disableResult != Result.SUCCESS && disableResult != Result.ALREADY_DISABLED) { disableResult.sendTo(sender, "disabl", pluginName); return; @@ -234,7 +234,7 @@ public class CommandServerUtils extends BaseCommand { @CommandPermission("serverutils.disableplugin") @Description("Disables the specified plugin.") public void onDisablePlugin(CommandSender sender, String pluginName) { - Result result = BukkitPluginManager.disablePlugin(pluginName); + Result result = BukkitPluginManager.get().disablePlugin(pluginName); result.sendTo(BukkitUtils.wrap(sender), "disabl", pluginName); } diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java index 5e36bdc..6e79684 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java @@ -67,4 +67,10 @@ public class BukkitPlugin extends ServerUtilsPlugin { public File getDataFolder() { return plugin.getDataFolder(); } + + @Override + @SuppressWarnings("unchecked") + public File fetchUpdaterData() { + return pluginManager.getPluginFile("ServerUtils"); + } } diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java index c5c0316..49597bc 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java @@ -98,7 +98,7 @@ public class BukkitPluginManager extends AbstractPluginManager { * @param pluginName The plugin to disable. * @return The result of the disable call. */ - public static Result disablePlugin(String pluginName) { + public Result disablePlugin(String pluginName) { return disablePlugin(Bukkit.getPluginManager().getPlugin(pluginName)); } @@ -107,7 +107,8 @@ public class BukkitPluginManager extends AbstractPluginManager { * @param plugin The plugin to disable. * @return The result of the disable call. */ - public static Result disablePlugin(Plugin plugin) { + @Override + public Result disablePlugin(Plugin plugin) { if (plugin == null) return Result.NOT_ENABLED; if (!plugin.isEnabled()) return Result.ALREADY_DISABLED; try { diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java index 97cff29..b634969 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java @@ -8,6 +8,7 @@ import net.frankheijden.serverutils.bungee.managers.BungeePluginManager; import net.frankheijden.serverutils.bungee.managers.BungeeTaskManager; import net.frankheijden.serverutils.bungee.managers.BungeeVersionManager; import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin; +import net.md_5.bungee.api.plugin.PluginDescription; public class BungeePlugin extends ServerUtilsPlugin { @@ -67,4 +68,15 @@ public class BungeePlugin extends ServerUtilsPlugin { public File getDataFolder() { return plugin.getDataFolder(); } + + @Override + @SuppressWarnings("unchecked") + public PluginDescription fetchUpdaterData() { + try { + return BungeePluginManager.getPluginDescription(pluginManager.getPluginFile("ServerUtils")); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } } diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java index 7722841..cd56fc7 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java @@ -114,6 +114,19 @@ public class BungeePluginManager extends AbstractPluginManager { } } + @Override + public Result disablePlugin(Plugin plugin) { + PluginDescription desc = plugin.getDescription(); + String name = desc.getName(); + try { + plugin.onDisable(); + return Result.SUCCESS; + } catch (Throwable th) { + proxy.getLogger().log(Level.WARNING, "Exception encountered when disabling plugin: " + name, th); + return Result.ERROR; + } + } + @Override public Result reloadPlugin(String pluginName) { Plugin plugin = proxy.getPluginManager().getPlugin(pluginName); diff --git a/Common/build.gradle b/Common/build.gradle index 00e06fe..f785317 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -4,8 +4,16 @@ archivesBaseName = rootProject.name + '-Common' repositories { mavenCentral() + flatDir { dirs 'src/main/resources' } } dependencies { + compileOnly name: 'ServerUtilsUpdater' compileOnly 'com.google.code.gson:gson:2.8.0' } + +shadowJar { + exclude 'net/frankheijden/serverutilsupdater/**' + exclude 'plugin.yml' + exclude 'bungee.yml' +} \ No newline at end of file diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java b/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java index bf11bd3..1318db6 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java @@ -27,6 +27,8 @@ public abstract class ServerUtilsPlugin { public abstract File getDataFolder(); + public abstract T fetchUpdaterData(); + public void createDataFolderIfNotExists() { if (getDataFolder().exists()) return; getDataFolder().mkdirs(); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/managers/AbstractPluginManager.java b/Common/src/main/java/net/frankheijden/serverutils/common/managers/AbstractPluginManager.java index 280a856..06de32d 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/managers/AbstractPluginManager.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/managers/AbstractPluginManager.java @@ -20,6 +20,8 @@ public abstract class AbstractPluginManager extends PluginProvider { public abstract Result enablePlugin(T plugin); + public abstract Result disablePlugin(T plugin); + public abstract Result reloadPlugin(String pluginName); public abstract Result reloadPlugin(T plugin); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java b/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java index 6819ee1..a37fc63 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -21,6 +22,7 @@ import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin; import net.frankheijden.serverutils.common.managers.AbstractVersionManager; import net.frankheijden.serverutils.common.utils.FileUtils; import net.frankheijden.serverutils.common.utils.VersionUtils; +import net.frankheijden.serverutilsupdater.common.Updater; public class UpdateCheckerTask implements Runnable { @@ -118,7 +120,7 @@ public class UpdateCheckerTask implements Runnable { File target = new File(plugin.getPluginManager().getPluginsFolder(), asset.name); downloadPlugin(githubVersion, asset.downloadUrl, target); plugin.getPluginManager().getPluginFile((Object) ServerUtilsApp.getPlatformPlugin()).delete(); - tryReloadPlugin(); + tryReloadPlugin(target); } else if (!isStartupCheck()) { Messenger.sendMessage(sender, "serverutils.update.available", "%old%", current, @@ -175,13 +177,35 @@ public class UpdateCheckerTask implements Runnable { versionManager.setDownloaded(githubVersion); } - private void tryReloadPlugin() { + private static final String UPDATER_FILE_NAME = "ServerUtilsUpdater.jar"; + + private File saveUpdater() { + InputStream in = getClass().getClassLoader().getResourceAsStream(UPDATER_FILE_NAME); + File file = new File(plugin.getDataFolder().getParent(), UPDATER_FILE_NAME); + try { + FileUtils.saveResource(in, file); + } catch (IOException ex) { + ex.printStackTrace(); + } + return file; + } + + private void tryReloadPlugin(File pluginFile) { plugin.getTaskManager().runTask(() -> { String downloadedVersion = versionManager.getDownloadedVersion(); if (isStartupCheck()) { plugin.getLogger().info(String.format(DOWNLOADED_RESTART, downloadedVersion)); - plugin.getPluginManager().reloadPlugin((Object)ServerUtilsApp.getPlatformPlugin()); + + File file = saveUpdater(); + Updater updater = (Updater) plugin.getPluginManager().loadPlugin(file).get(); + plugin.getPluginManager().enablePlugin(updater); + + plugin.getPluginManager().disablePlugin(ServerUtilsApp.getPlatformPlugin()); + plugin.getPluginManager().unloadPlugin((Object)ServerUtilsApp.getPlatformPlugin()).tryClose(); + updater.update(pluginFile); + file.delete(); + plugin.getLogger().info(String.format(UPGRADE_SUCCESS, downloadedVersion)); } else { broadcastDownloadStatus(downloadedVersion, false); diff --git a/Common/src/main/resources/ServerUtilsUpdater.jar b/Common/src/main/resources/ServerUtilsUpdater.jar new file mode 100644 index 0000000000000000000000000000000000000000..87efb9d20b7579c2e459450a35ce65d5ee41dcda GIT binary patch literal 6240 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 literal 0 HcmV?d00001