Merge pull request 'Reduce checkpoint exceptions, use "new" Reflection utils in CommandRemover' (#256) from reduceCheckpointExceptions into master
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Reviewed-on: #256 Reviewed-by: YoyoNow <jwsteam@nidido.de>
Dieser Commit ist enthalten in:
Commit
b4ba508cec
@ -69,7 +69,16 @@ public class CheckpointUtils {
|
|||||||
try {
|
try {
|
||||||
freezeInternal(path);
|
freezeInternal(path);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
String message = e.getMessage() != null ? e.getMessage() : "";
|
||||||
|
if(message.contains("Connected TCP socket")) {
|
||||||
|
Core.getInstance().getLogger().log(Level.INFO, "Connected TCP socket, waiting for checkpointing");
|
||||||
|
Bukkit.getScheduler().runTaskLater(Core.getInstance(), CheckpointUtils::freeze, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Bukkit.shutdown();
|
Bukkit.shutdown();
|
||||||
|
|
||||||
|
if(message.contains("Can't dump ghost file")) // File/Jar has been updated
|
||||||
throw new SecurityException(e);
|
throw new SecurityException(e);
|
||||||
} finally {
|
} finally {
|
||||||
// Delete checkpoint
|
// Delete checkpoint
|
||||||
@ -109,8 +118,6 @@ public class CheckpointUtils {
|
|||||||
try {
|
try {
|
||||||
criu.checkpointJVM();
|
criu.checkpointJVM();
|
||||||
} catch (JVMCRIUException e) {
|
} catch (JVMCRIUException e) {
|
||||||
Bukkit.shutdown();
|
|
||||||
|
|
||||||
Path logfile = path.resolve("criu.log");
|
Path logfile = path.resolve("criu.log");
|
||||||
if(logfile.toFile().exists())
|
if(logfile.toFile().exists())
|
||||||
throw new IllegalStateException("Could not create checkpoint, criu log:\n" + new String(Files.readAllBytes(logfile)), e);
|
throw new IllegalStateException("Could not create checkpoint, criu log:\n" + new String(Files.readAllBytes(logfile)), e);
|
||||||
|
@ -19,41 +19,22 @@
|
|||||||
|
|
||||||
package de.steamwar.core;
|
package de.steamwar.core;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.SimpleCommandMap;
|
import org.bukkit.command.SimpleCommandMap;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
public class CommandRemover {
|
public class CommandRemover {
|
||||||
private CommandRemover(){}
|
private static final Reflection.FieldAccessor<SimpleCommandMap> commandMap = Reflection.getField("{obc}.CraftServer", "commandMap", SimpleCommandMap.class);
|
||||||
|
private static final Reflection.FieldAccessor<Map> knownCommands = Reflection.getField(SimpleCommandMap.class, "knownCommands", Map.class);
|
||||||
private static String packageName = Bukkit.getServer().getClass().getPackage().getName();
|
public static void removeAll(String... cmds) {
|
||||||
private static String version = packageName.substring(packageName.lastIndexOf('.') + 1);
|
Map<String, Command> knownCmds = knownCommands.get(commandMap.get(Bukkit.getServer()));
|
||||||
|
for (String cmd : cmds) {
|
||||||
public static void removeAll(String... cmds){
|
knownCmds.remove(cmd.toLowerCase());
|
||||||
for (String cmd : cmds) removeCommand(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static void removeCommand(String command) {
|
|
||||||
try {
|
|
||||||
Class<?> serverClass = Class.forName("org.bukkit.craftbukkit." + version + ".CraftServer");
|
|
||||||
|
|
||||||
|
|
||||||
Field f1 = serverClass.getDeclaredField("commandMap");
|
|
||||||
f1.setAccessible(true);
|
|
||||||
SimpleCommandMap commandMap = (SimpleCommandMap) f1.get(Bukkit.getServer());
|
|
||||||
|
|
||||||
Field f2 = SimpleCommandMap.class.getDeclaredField("knownCommands");
|
|
||||||
f2.setAccessible(true);
|
|
||||||
Map<String, Command> knownCommands = (Map<String, Command>) f2.get(commandMap);
|
|
||||||
|
|
||||||
knownCommands.remove(command.toLowerCase());
|
|
||||||
} catch (Exception e) {
|
|
||||||
Bukkit.getLogger().log(Level.SEVERE, "Could not remove command", e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren