Check for craftbukkit updates along with plugin updates

This commit is contained in:
Dan Mulloy 2018-06-20 19:57:15 -04:00 committed by Alexander Meech
parent e20cae8be9
commit 50b9148c7d
2 changed files with 110 additions and 142 deletions

View File

@ -43,6 +43,8 @@ public class FileUpdater extends MiniPlugin
BVERSION_COMMAND, BVERSION_COMMAND,
} }
private static final FilenameFilter JAR_FILTER = (file, name) -> name.endsWith(".jar");
private Portal _portal; private Portal _portal;
private NautHashMap<String, String> _jarMd5Map = new NautHashMap<String, String>(); private NautHashMap<String, String> _jarMd5Map = new NautHashMap<String, String>();
@ -65,10 +67,12 @@ public class FileUpdater extends MiniPlugin
_region = region; _region = region;
_transferHub = transferHub; _transferHub = transferHub;
GetPluginMd5s(); getJarHashes();
if (new File("IgnoreUpdates.dat").exists()) if (new File("IgnoreUpdates.dat").exists())
{
_enabled = false; _enabled = false;
}
// Register the server command type for future use // Register the server command type for future use
ServerCommandManager.getInstance().registerCommandType("RestartCommand", RestartCommand.class, new RestartHandler(plugin, _serverName, _region)); ServerCommandManager.getInstance().registerCommandType("RestartCommand", RestartCommand.class, new RestartHandler(plugin, _serverName, _region));
@ -114,10 +118,14 @@ public class FileUpdater extends MiniPlugin
public void tryToRestart(UpdateEvent event) public void tryToRestart(UpdateEvent event)
{ {
if (event.getType() != UpdateType.SLOWER) if (event.getType() != UpdateType.SLOWER)
{
return; return;
}
if (!_needUpdate || !_enabled || _restartTriggered) if (!_needUpdate || !_enabled || _restartTriggered)
{
return; return;
}
if (UtilServer.CallEvent(new RestartTriggerEvent(RestartTriggerEvent.RestartReason.UPDATE)).isCancelled()) if (UtilServer.CallEvent(new RestartTriggerEvent(RestartTriggerEvent.RestartReason.UPDATE)).isCancelled())
{ {
@ -159,122 +167,80 @@ public class FileUpdater extends MiniPlugin
} }
@EventHandler @EventHandler
public void CheckForNewFiles(UpdateEvent event) public void checkForUpdates(UpdateEvent event)
{ {
if (event.getType() != UpdateType.MIN_01) if (event.getType() != UpdateType.MIN_01)
{
return; return;
}
if (_needUpdate || !_enabled) if (_needUpdate || !_enabled)
{
return; return;
}
boolean windows = System.getProperty("os.name").startsWith("Windows"); boolean windows = System.getProperty("os.name").startsWith("Windows");
File updateDir = new File((windows ? "C:" : File.separator + "home" + File.separator + "mineplex") + File.separator + "update"); File updateDir = new File((windows ? "C:" : File.separator + "home" + File.separator + "mineplex") + File.separator + "update");
File[] files = updateDir.listFiles(JAR_FILTER);
updateDir.mkdirs();
if (files == null)
FilenameFilter statsFilter = new FilenameFilter() {
{ return;
public boolean accept(File paramFile, String paramString) }
{
if (paramString.endsWith("jar")) for (File file : files)
{ {
return true; String hash = _jarMd5Map.get(file.getName());
} if (hash != null)
{
return false; try (FileInputStream stream = new FileInputStream(file))
} {
}; String newHash = DigestUtils.md5Hex(stream);
if (!hash.equals(newHash))
for (File f : updateDir.listFiles(statsFilter))
{
FileInputStream fis = null;
try
{
if (_jarMd5Map.containsKey(f.getName()))
{
fis = new FileInputStream(f);
String md5 = DigestUtils.md5Hex(fis);
if (!md5.equals(_jarMd5Map.get(f.getName())))
{
System.out.println(f.getName() + " old jar : " + _jarMd5Map.get(f.getName()));
System.out.println(f.getName() + " new jar : " + md5);
_needUpdate = true;
}
}
}
catch (Exception ex)
{
System.out.println(F.main(getName(), "Error parsing jar md5's"));
ex.printStackTrace();
}
finally
{
if (fis != null)
{
try
{ {
fis.close(); System.out.println(file.getName() + " old hash : " + hash);
} System.out.println(file.getName() + " new hash : " + newHash);
catch (IOException e) _needUpdate = true;
{ }
e.printStackTrace(); }
} catch (IOException ex)
} {
} System.err.println("Failed to parse hash for file: " + file.getName() + ":");
} ex.printStackTrace();
}
}
}
}
private void collectHashes(File[] files)
{
if (files == null)
{
return;
}
for (File file : files)
{
try (FileInputStream stream = new FileInputStream(file))
{
_jarMd5Map.put(file.getName(), DigestUtils.md5Hex(stream));
}
catch (IOException ex)
{
System.err.println("Failed to parse hash for file: " + file.getName() + ":");
ex.printStackTrace();
}
}
} }
private void GetPluginMd5s() private void getJarHashes()
{ {
File pluginDir = new File("plugins"); File base = new File(".");
collectHashes(base.listFiles(JAR_FILTER));
pluginDir.mkdirs();
File plugins = new File("plugins");
FilenameFilter statsFilter = new FilenameFilter() collectHashes(plugins.listFiles(JAR_FILTER));
{
public boolean accept(File paramFile, String paramString)
{
if (paramString.endsWith("jar"))
{
return true;
}
return false;
}
};
for (File f : pluginDir.listFiles(statsFilter))
{
FileInputStream fis = null;
try
{
fis = new FileInputStream(f);
_jarMd5Map.put(f.getName(), DigestUtils.md5Hex(fis));
}
catch (Exception ex)
{
System.out.println(F.main(getName(), "Error parsing jar md5's"));
ex.printStackTrace();
}
finally
{
if (fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
} }
private void loadBuildProperties() private void loadBuildProperties()

View File

@ -20,7 +20,7 @@ import mineplex.serverdata.commands.CommandCallback;
import mineplex.serverdata.commands.RestartCommand; import mineplex.serverdata.commands.RestartCommand;
import mineplex.serverdata.commands.ServerCommand; import mineplex.serverdata.commands.ServerCommand;
public class RestartHandler implements CommandCallback, Listener public class RestartHandler implements CommandCallback<RestartCommand>, Listener
{ {
private JavaPlugin _plugin; private JavaPlugin _plugin;
private String _serverName; private String _serverName;
@ -41,45 +41,47 @@ public class RestartHandler implements CommandCallback, Listener
public void reflectMotd(ServerListPingEvent event) public void reflectMotd(ServerListPingEvent event)
{ {
if (_restarting) if (_restarting)
event.setMotd("Restarting soon");
}
public void run(ServerCommand command)
{
if (command instanceof RestartCommand)
{ {
String serverName = ((RestartCommand)command).getServerName(); event.setMotd("Restarting soon");
Region region = ((RestartCommand)command).getRegion();
if (!serverName.equalsIgnoreCase(_serverName) || _region != region)
return;
if (UtilServer.CallEvent(new RestartTriggerEvent(RestartTriggerEvent.RestartReason.COMMAND)).isCancelled())
{
return;
}
if (UtilServer.CallEvent(new RestartServerEvent(RestartServerEvent.RestartReason.COMMAND)).isCancelled())
{
return;
}
_restarting = true;
for (Player player : Bukkit.getOnlinePlayers())
{
player.sendMessage(F.main("Restart", "Server is restarting, you're being sent to a lobby."));
}
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(UtilServer.getPlugin(), () ->
{
Portal.getInstance().sendAllPlayersToGenericServer(GenericServer.HUB, Intent.KICK);
}, 60L);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(UtilServer.getPlugin(), () ->
{
Bukkit.getServer().shutdown();
}, 100L);
} }
} }
@Override
public void run(RestartCommand command)
{
String serverName = command.getServerName();
Region region = command.getRegion();
if (!serverName.equalsIgnoreCase(_serverName) || _region != region)
{
return;
}
if (UtilServer.CallEvent(new RestartTriggerEvent(RestartTriggerEvent.RestartReason.COMMAND)).isCancelled())
{
return;
}
if (UtilServer.CallEvent(new RestartServerEvent(RestartServerEvent.RestartReason.COMMAND)).isCancelled())
{
return;
}
_restarting = true;
for (Player player : Bukkit.getOnlinePlayers())
{
player.sendMessage(F.main("Restart", "Server is restarting, you're being sent to a lobby."));
}
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(UtilServer.getPlugin(), () ->
{
Portal.getInstance().sendAllPlayersToGenericServer(GenericServer.HUB, Intent.KICK);
}, 60L);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(UtilServer.getPlugin(), () ->
{
Bukkit.getServer().shutdown();
}, 100L);
}
} }