mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-22 16:41:46 +03:00
[FEATURE] Profile delete and profile list commands
This commit is contained in:
parent
31285a8066
commit
11382d3465
11 changed files with 111 additions and 116 deletions
|
@ -476,6 +476,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
|
||||||
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
|
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
|
||||||
}
|
}
|
||||||
profile.verify();
|
profile.verify();
|
||||||
|
profile.setProfileFilePath(file);
|
||||||
|
|
||||||
// Add SIGNED profile to result list
|
// Add SIGNED profile to result list
|
||||||
result.add(profile);
|
result.add(profile);
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package pro.gravit.launchserver.command.profiles;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import pro.gravit.launcher.base.profiles.ClientProfile;
|
||||||
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
|
import pro.gravit.launchserver.command.Command;
|
||||||
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
|
||||||
|
public class DeleteProfileCommand extends Command {
|
||||||
|
private final transient Logger logger = LogManager.getLogger(ListProfilesCommand.class);
|
||||||
|
public DeleteProfileCommand(LaunchServer server) {
|
||||||
|
super(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getArgsDescription() {
|
||||||
|
return "[uuid/title]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsageDescription() {
|
||||||
|
return "permanently delete profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(String... args) throws Exception {
|
||||||
|
verifyArgs(args, 1);
|
||||||
|
ClientProfile profile = null;
|
||||||
|
for(var p : server.getProfiles()) {
|
||||||
|
if(p.getUUID().toString().equals(args[0]) || p.getTitle().equals(args[1])) {
|
||||||
|
profile = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(profile == null) {
|
||||||
|
logger.error("Profile {} not found", args[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var clientDir = server.updatesDir.resolve(profile.getDir()).toAbsolutePath();
|
||||||
|
logger.warn("THIS ACTION DELETE PROFILE AND ALL FILES IN {}", clientDir);
|
||||||
|
if(!showApplyDialog("Continue?")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.info("Delete {}", clientDir);
|
||||||
|
IOHelper.deleteDir(clientDir, true);
|
||||||
|
var profileFile = profile.getProfileFilePath();
|
||||||
|
if(profileFile == null) {
|
||||||
|
profileFile = server.profilesDir.resolve(profile.getTitle().concat(".json"));
|
||||||
|
}
|
||||||
|
logger.info("Delete {}", profileFile);
|
||||||
|
Files.deleteIfExists(profileFile);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package pro.gravit.launchserver.command.profiles;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
|
import pro.gravit.launchserver.command.Command;
|
||||||
|
|
||||||
|
public class ListProfilesCommand extends Command {
|
||||||
|
private final transient Logger logger = LogManager.getLogger(ListProfilesCommand.class);
|
||||||
|
public ListProfilesCommand(LaunchServer server) {
|
||||||
|
super(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getArgsDescription() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsageDescription() {
|
||||||
|
return "show all profiles";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(String... args) throws Exception {
|
||||||
|
for(var profile : server.getProfiles()) {
|
||||||
|
logger.info("{} ({}) {}", profile.getTitle(), profile.getVersion().toString(), profile.isLimited() ? "limited" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,8 @@ public ProfilesCommand(LaunchServer server) {
|
||||||
this.childCommands.put("make", new MakeProfileCommand(server));
|
this.childCommands.put("make", new MakeProfileCommand(server));
|
||||||
this.childCommands.put("save", new SaveProfilesCommand(server));
|
this.childCommands.put("save", new SaveProfilesCommand(server));
|
||||||
this.childCommands.put("clone", new CloneProfileCommand(server));
|
this.childCommands.put("clone", new CloneProfileCommand(server));
|
||||||
|
this.childCommands.put("list", new ListProfilesCommand(server));
|
||||||
|
this.childCommands.put("delete", new DeleteProfileCommand(server));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
import pro.gravit.launcher.core.LauncherTrustManager;
|
import pro.gravit.launcher.core.LauncherTrustManager;
|
||||||
import pro.gravit.launcher.base.modules.*;
|
import pro.gravit.launcher.base.modules.*;
|
||||||
import pro.gravit.utils.PublicURLClassLoader;
|
|
||||||
import pro.gravit.utils.Version;
|
import pro.gravit.utils.Version;
|
||||||
import pro.gravit.utils.helper.IOHelper;
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
import pro.gravit.utils.helper.LogHelper;
|
import pro.gravit.utils.helper.LogHelper;
|
||||||
|
|
|
@ -12,12 +12,13 @@
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public final class ClientProfile implements Comparable<ClientProfile> {
|
public final class ClientProfile implements Comparable<ClientProfile> {
|
||||||
private static final FileNameMatcher ASSET_MATCHER = new FileNameMatcher(
|
private static final FileNameMatcher ASSET_MATCHER = new FileNameMatcher(
|
||||||
new String[0], new String[]{"indexes", "objects"}, new String[0]);
|
new String[0], new String[]{"indexes", "objects"}, new String[0]);
|
||||||
|
private transient Path profileFilePath;
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
private String title;
|
private String title;
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
|
@ -461,6 +462,14 @@ public List<CompatibilityFlags> getFlags() {
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Path getProfileFilePath() {
|
||||||
|
return profileFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProfileFilePath(Path profileFilePath) {
|
||||||
|
this.profileFilePath = profileFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
public enum ClassLoaderConfig {
|
public enum ClassLoaderConfig {
|
||||||
AGENT, LAUNCHER, MODULE, SYSTEM_ARGS
|
AGENT, LAUNCHER, MODULE, SYSTEM_ARGS
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
package pro.gravit.utils;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLClassLoader;
|
|
||||||
|
|
||||||
public class PublicURLClassLoader extends URLClassLoader {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new URLClassLoader for the specified URLs using the
|
|
||||||
* default delegation parent {@code ClassLoader}. The URLs will
|
|
||||||
* be searched in the order specified for classes and resources after
|
|
||||||
* first searching in the parent class loader. Any URL that ends with
|
|
||||||
* a '/' is assumed to refer to a directory. Otherwise, the URL is
|
|
||||||
* assumed to refer to a JAR file which will be downloaded and opened
|
|
||||||
* as needed.
|
|
||||||
*
|
|
||||||
* <p>If there is a security manager, this method first
|
|
||||||
* calls the security manager's {@code checkCreateClassLoader} method
|
|
||||||
* to ensure creation of a class loader is allowed.
|
|
||||||
*
|
|
||||||
* @param urls the URLs from which to load classes and resources
|
|
||||||
* @throws SecurityException if a security manager exists and its
|
|
||||||
* {@code checkCreateClassLoader} method doesn't allow
|
|
||||||
* creation of a class loader.
|
|
||||||
* @throws NullPointerException if {@code urls} is {@code null}.
|
|
||||||
*/
|
|
||||||
public PublicURLClassLoader(URL[] urls) {
|
|
||||||
super(urls);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new URLClassLoader for the given URLs. The URLs will be
|
|
||||||
* searched in the order specified for classes and resources after first
|
|
||||||
* searching in the specified parent class loader. Any {@code jar:}
|
|
||||||
* scheme URL is assumed to refer to a JAR file. Any {@code file:} scheme
|
|
||||||
* URL that ends with a '/' is assumed to refer to a directory. Otherwise,
|
|
||||||
* the URL is assumed to refer to a JAR file which will be downloaded and
|
|
||||||
* opened as needed.
|
|
||||||
*
|
|
||||||
* <p>If there is a security manager, this method first
|
|
||||||
* calls the security manager's {@code checkCreateClassLoader} method
|
|
||||||
* to ensure creation of a class loader is allowed.
|
|
||||||
*
|
|
||||||
* @param urls the URLs from which to load classes and resources
|
|
||||||
* @param parent the parent class loader for delegation
|
|
||||||
* @throws SecurityException if a security manager exists and its
|
|
||||||
* {@code checkCreateClassLoader} method doesn't allow
|
|
||||||
* creation of a class loader.
|
|
||||||
* @throws NullPointerException if {@code urls} is {@code null}.
|
|
||||||
*/
|
|
||||||
public PublicURLClassLoader(URL[] urls, ClassLoader parent) {
|
|
||||||
super(urls, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addURL(URL url) {
|
|
||||||
super.addURL(url);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,6 +12,8 @@
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.jar.Manifest;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.zip.Deflater;
|
import java.util.zip.Deflater;
|
||||||
|
@ -82,6 +84,15 @@ public static void close(OutputStream out) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Manifest getManifest(Class<?> clazz) {
|
||||||
|
Path path = getCodeSource(clazz);
|
||||||
|
try(JarFile jar = new JarFile(path.toFile())) {
|
||||||
|
return jar.getManifest();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static URL convertToURL(String url) {
|
public static URL convertToURL(String url) {
|
||||||
try {
|
try {
|
||||||
return new URL(url);
|
return new URL(url);
|
||||||
|
|
|
@ -1,17 +1,12 @@
|
||||||
package pro.gravit.utils.helper;
|
package pro.gravit.utils.helper;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.lang.management.ManagementFactory;
|
import java.lang.management.ManagementFactory;
|
||||||
import java.lang.management.OperatingSystemMXBean;
|
import java.lang.management.OperatingSystemMXBean;
|
||||||
import java.lang.management.RuntimeMXBean;
|
import java.lang.management.RuntimeMXBean;
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public final class JVMHelper {
|
public final class JVMHelper {
|
||||||
|
|
||||||
|
@ -77,45 +72,11 @@ public static String getNativePrefix(JVMHelper.OS OS_TYPE) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void appendVars(ProcessBuilder builder, Map<String, String> vars) {
|
|
||||||
builder.environment().putAll(vars);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> firstClass(String... names) throws ClassNotFoundException {
|
|
||||||
for (String name : names)
|
|
||||||
try {
|
|
||||||
return Class.forName(name, false, LOADER);
|
|
||||||
} catch (ClassNotFoundException ignored) {
|
|
||||||
// Expected
|
|
||||||
}
|
|
||||||
throw new ClassNotFoundException(Arrays.toString(names));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void fullGC() {
|
public static void fullGC() {
|
||||||
RUNTIME.gc();
|
RUNTIME.gc();
|
||||||
LogHelper.debug("Used heap: %d MiB", RUNTIME.totalMemory() - RUNTIME.freeMemory() >> 20);
|
LogHelper.debug("Used heap: %d MiB", RUNTIME.totalMemory() - RUNTIME.freeMemory() >> 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String[] getClassPath() {
|
|
||||||
return System.getProperty("java.class.path").split(File.pathSeparator);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static URL[] getClassPathURL() {
|
|
||||||
String[] cp = System.getProperty("java.class.path").split(File.pathSeparator);
|
|
||||||
URL[] list = new URL[cp.length];
|
|
||||||
|
|
||||||
for (int i = 0; i < cp.length; i++) {
|
|
||||||
URL url = null;
|
|
||||||
try {
|
|
||||||
url = new URL(cp[i]);
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
list[i] = url;
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static X509Certificate[] getCertificates(Class<?> clazz) {
|
public static X509Certificate[] getCertificates(Class<?> clazz) {
|
||||||
Object[] signers = clazz.getSigners();
|
Object[] signers = clazz.getSigners();
|
||||||
if (signers == null) return null;
|
if (signers == null) return null;
|
||||||
|
@ -140,10 +101,6 @@ private static int getCorrectOSArch() {
|
||||||
return System.getProperty("os.arch").contains("64") ? 64 : 32;
|
return System.getProperty("os.arch").contains("64") ? 64 : 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getEnvPropertyCaseSensitive(String name) {
|
|
||||||
return System.getenv().get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isJVMMatchesSystemArch() {
|
public static boolean isJVMMatchesSystemArch() {
|
||||||
return JVM_BITS == OS_BITS;
|
return JVM_BITS == OS_BITS;
|
||||||
}
|
}
|
||||||
|
@ -152,16 +109,6 @@ public static String jvmProperty(String name, String value) {
|
||||||
return String.format("-D%s=%s", name, value);
|
return String.format("-D%s=%s", name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String systemToJvmProperty(String name) {
|
|
||||||
return String.format("-D%s=%s", name, System.getProperties().getProperty(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addSystemPropertyToArgs(Collection<String> args, String name) {
|
|
||||||
String property = System.getProperty(name);
|
|
||||||
if (property != null)
|
|
||||||
args.add(String.format("-D%s=%s", name, property));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void verifySystemProperties(Class<?> mainClass, boolean requireSystem) {
|
public static void verifySystemProperties(Class<?> mainClass, boolean requireSystem) {
|
||||||
Locale.setDefault(Locale.US);
|
Locale.setDefault(Locale.US);
|
||||||
// Verify class loader
|
// Verify class loader
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
import pro.gravit.launcher.base.request.auth.GetPublicKeyRequest;
|
import pro.gravit.launcher.base.request.auth.GetPublicKeyRequest;
|
||||||
import pro.gravit.launcher.base.request.websockets.StdWebSocketService;
|
import pro.gravit.launcher.base.request.websockets.StdWebSocketService;
|
||||||
import pro.gravit.launcher.server.ServerWrapper;
|
import pro.gravit.launcher.server.ServerWrapper;
|
||||||
import pro.gravit.utils.PublicURLClassLoader;
|
|
||||||
import pro.gravit.utils.helper.IOHelper;
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
import pro.gravit.utils.helper.JVMHelper;
|
import pro.gravit.utils.helper.JVMHelper;
|
||||||
import pro.gravit.utils.helper.LogHelper;
|
import pro.gravit.utils.helper.LogHelper;
|
||||||
|
|
2
modules
2
modules
|
@ -1 +1 @@
|
||||||
Subproject commit 875cbb463dc432bc48300e4f3a7e5b3b21c6267e
|
Subproject commit c176ddfef61247e98e3832921877ec4a79cdcc63
|
Loading…
Reference in a new issue