mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-23 09:01:08 +03:00
[FEATURE] ServerWrapperSetup
This commit is contained in:
parent
1a3bf0b055
commit
d6ef1fd99d
3 changed files with 211 additions and 12 deletions
|
@ -9,6 +9,7 @@
|
||||||
import ru.gravit.launcher.profiles.ClientProfile;
|
import ru.gravit.launcher.profiles.ClientProfile;
|
||||||
import ru.gravit.launcher.request.auth.AuthServerRequest;
|
import ru.gravit.launcher.request.auth.AuthServerRequest;
|
||||||
import ru.gravit.launcher.request.update.ProfilesRequest;
|
import ru.gravit.launcher.request.update.ProfilesRequest;
|
||||||
|
import ru.gravit.launcher.server.setup.ServerWrapperSetup;
|
||||||
import ru.gravit.utils.PublicURLClassLoader;
|
import ru.gravit.utils.PublicURLClassLoader;
|
||||||
import ru.gravit.utils.helper.CommonHelper;
|
import ru.gravit.utils.helper.CommonHelper;
|
||||||
import ru.gravit.utils.helper.IOHelper;
|
import ru.gravit.utils.helper.IOHelper;
|
||||||
|
@ -33,12 +34,14 @@ public class ServerWrapper {
|
||||||
public static PublicURLClassLoader ucp;
|
public static PublicURLClassLoader ucp;
|
||||||
public static ClassLoader loader;
|
public static ClassLoader loader;
|
||||||
public static ClientPermissions permissions;
|
public static ClientPermissions permissions;
|
||||||
|
public static ServerWrapper wrapper;
|
||||||
private static Gson gson;
|
private static Gson gson;
|
||||||
private static GsonBuilder gsonBuiler;
|
private static GsonBuilder gsonBuiler;
|
||||||
|
|
||||||
public static Path modulesDir = Paths.get(System.getProperty("serverwrapper.modulesDir", "modules"));
|
public static Path modulesDir = Paths.get(System.getProperty("serverwrapper.modulesDir", "modules"));
|
||||||
public static Path configFile = Paths.get(System.getProperty("serverwrapper.configFile", "ServerWrapperConfig.json"));
|
public static Path configFile = Paths.get(System.getProperty("serverwrapper.configFile", "ServerWrapperConfig.json"));
|
||||||
public static Path publicKeyFile = Paths.get(System.getProperty("serverwrapper.publicKeyFile", "public.key"));
|
public static Path publicKeyFile = Paths.get(System.getProperty("serverwrapper.publicKeyFile", "public.key"));
|
||||||
|
public static boolean disableSetup = Boolean.valueOf(System.getProperty("serverwrapper.disableSetup", "false"));
|
||||||
|
|
||||||
public static boolean auth(ServerWrapper wrapper) {
|
public static boolean auth(ServerWrapper wrapper) {
|
||||||
try {
|
try {
|
||||||
|
@ -93,18 +96,29 @@ public static void initGson() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String... args) throws Throwable {
|
public static void main(String... args) throws Throwable {
|
||||||
ServerWrapper wrapper = new ServerWrapper();
|
|
||||||
LogHelper.printVersion("ServerWrapper");
|
LogHelper.printVersion("ServerWrapper");
|
||||||
LogHelper.printLicense("ServerWrapper");
|
LogHelper.printLicense("ServerWrapper");
|
||||||
|
wrapper = new ServerWrapper();
|
||||||
|
gsonBuiler = new GsonBuilder();
|
||||||
|
gsonBuiler.setPrettyPrinting();
|
||||||
|
gson = gsonBuiler.create();
|
||||||
|
initGson();
|
||||||
|
if(args.length > 0 && args[0].equals("setup"))
|
||||||
|
{
|
||||||
|
generateConfigIfNotExists();
|
||||||
|
LogHelper.debug("Read ServerWrapperConfig.json");
|
||||||
|
try (Reader reader = IOHelper.newReader(configFile)) {
|
||||||
|
config = gson.fromJson(reader, Config.class);
|
||||||
|
}
|
||||||
|
ServerWrapperSetup setup = new ServerWrapperSetup();
|
||||||
|
setup.run();
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
modulesManager = new ModulesManager(wrapper);
|
modulesManager = new ModulesManager(wrapper);
|
||||||
modulesManager.autoload(modulesDir);
|
modulesManager.autoload(modulesDir);
|
||||||
Launcher.modulesManager = modulesManager;
|
Launcher.modulesManager = modulesManager;
|
||||||
modulesManager.preInitModules();
|
modulesManager.preInitModules();
|
||||||
LogHelper.debug("Read ServerWrapperConfig.json");
|
LogHelper.debug("Read ServerWrapperConfig.json");
|
||||||
gsonBuiler = new GsonBuilder();
|
|
||||||
gsonBuiler.setPrettyPrinting();
|
|
||||||
gson = gsonBuiler.create();
|
|
||||||
initGson();
|
|
||||||
generateConfigIfNotExists();
|
generateConfigIfNotExists();
|
||||||
try (Reader reader = IOHelper.newReader(configFile)) {
|
try (Reader reader = IOHelper.newReader(configFile)) {
|
||||||
config = gson.fromJson(reader, Config.class);
|
config = gson.fromJson(reader, Config.class);
|
||||||
|
@ -160,11 +174,15 @@ public static void main(String... args) throws Throwable {
|
||||||
LogHelper.debug("Invoke main method %s", mainClass.getName());
|
LogHelper.debug("Invoke main method %s", mainClass.getName());
|
||||||
if(config.args == null)
|
if(config.args == null)
|
||||||
{
|
{
|
||||||
String[] real_args = new String[args.length - 1];
|
String[] real_args;
|
||||||
System.arraycopy(args, 1, real_args, 0, args.length - 1);
|
if(args.length > 0)
|
||||||
|
{
|
||||||
|
real_args = new String[args.length - 1];
|
||||||
|
System.arraycopy(args, 1, real_args, 0, args.length - 1);
|
||||||
|
} else real_args = args;
|
||||||
|
|
||||||
mainMethod.invoke(real_args);
|
mainMethod.invoke(real_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mainMethod.invoke(config.args);
|
mainMethod.invoke(config.args);
|
||||||
|
@ -194,10 +212,7 @@ private static void generateConfigIfNotExists() throws IOException {
|
||||||
LogHelper.warning("Title is not set. Please show ServerWrapper.cfg");
|
LogHelper.warning("Title is not set. Please show ServerWrapper.cfg");
|
||||||
|
|
||||||
// Write LaunchServer config
|
// Write LaunchServer config
|
||||||
LogHelper.info("Writing ServerWrapper config file");
|
newConfig.save();
|
||||||
try (Writer writer = IOHelper.newWriter(configFile)) {
|
|
||||||
gson.toJson(newConfig, writer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Config {
|
public static final class Config {
|
||||||
|
@ -220,6 +235,13 @@ public static final class Config {
|
||||||
public String password;
|
public String password;
|
||||||
public String auth_id = "";
|
public String auth_id = "";
|
||||||
public LauncherConfig.LauncherEnvironment env;
|
public LauncherConfig.LauncherEnvironment env;
|
||||||
|
public void save() throws IOException
|
||||||
|
{
|
||||||
|
LogHelper.info("Writing ServerWrapper config file");
|
||||||
|
try (Writer writer = IOHelper.newWriter(configFile)) {
|
||||||
|
gson.toJson(this, writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClientProfile profile;
|
public ClientProfile profile;
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package ru.gravit.launcher.server.setup;
|
||||||
|
|
||||||
|
import ru.gravit.utils.command.CommandHandler;
|
||||||
|
import ru.gravit.utils.command.JLineCommandHandler;
|
||||||
|
import ru.gravit.utils.command.StdCommandHandler;
|
||||||
|
import ru.gravit.utils.helper.LogHelper;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ServerWrapperCommands {
|
||||||
|
public final CommandHandler commandHandler;
|
||||||
|
public void registerCommands()
|
||||||
|
{
|
||||||
|
//FUTURE
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerWrapperCommands(CommandHandler commandHandler) {
|
||||||
|
this.commandHandler = commandHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerWrapperCommands() throws IOException {
|
||||||
|
// Set command handler
|
||||||
|
CommandHandler localCommandHandler;
|
||||||
|
try {
|
||||||
|
Class.forName("jline.Terminal");
|
||||||
|
|
||||||
|
// JLine2 available
|
||||||
|
localCommandHandler = new JLineCommandHandler();
|
||||||
|
LogHelper.info("JLine2 terminal enabled");
|
||||||
|
} catch (ClassNotFoundException ignored) {
|
||||||
|
localCommandHandler = new StdCommandHandler(true);
|
||||||
|
LogHelper.warning("JLine2 isn't in classpath, using std");
|
||||||
|
}
|
||||||
|
commandHandler = localCommandHandler;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
package ru.gravit.launcher.server.setup;
|
||||||
|
|
||||||
|
import ru.gravit.launcher.Launcher;
|
||||||
|
import ru.gravit.launcher.LauncherConfig;
|
||||||
|
import ru.gravit.launcher.server.ServerWrapper;
|
||||||
|
import ru.gravit.utils.PublicURLClassLoader;
|
||||||
|
import ru.gravit.utils.helper.IOHelper;
|
||||||
|
import ru.gravit.utils.helper.JVMHelper;
|
||||||
|
import ru.gravit.utils.helper.LogHelper;
|
||||||
|
import ru.gravit.utils.helper.SecurityHelper;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
|
public class ServerWrapperSetup {
|
||||||
|
public ServerWrapperCommands commands;
|
||||||
|
public PublicURLClassLoader urlClassLoader;
|
||||||
|
public void run() throws IOException
|
||||||
|
{
|
||||||
|
System.out.println("Print jar filename:");
|
||||||
|
String jarName = commands.commandHandler.readLine();
|
||||||
|
Path jarPath = Paths.get(jarName);
|
||||||
|
JarFile file = new JarFile(jarPath.toFile());
|
||||||
|
URL jarURL = jarPath.toUri().toURL();
|
||||||
|
urlClassLoader = new PublicURLClassLoader(new URL[]{jarURL});
|
||||||
|
LogHelper.info("Check jar MainClass");
|
||||||
|
String mainClassName = file.getManifest().getMainAttributes().getValue("Main-Class");
|
||||||
|
if(mainClassName == null)
|
||||||
|
{
|
||||||
|
LogHelper.error("Main-Class not found in MANIFEST");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Class mainClass = Class.forName(mainClassName, false, urlClassLoader);
|
||||||
|
} catch (ClassNotFoundException e)
|
||||||
|
{
|
||||||
|
LogHelper.error(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LogHelper.info("Found MainClass %s", mainClassName);
|
||||||
|
System.out.println("Print launchserver host:");
|
||||||
|
String address = commands.commandHandler.readLine();
|
||||||
|
System.out.println("Print launchserver port:");
|
||||||
|
int port = Integer.valueOf(commands.commandHandler.readLine());
|
||||||
|
ServerWrapper.config.mainclass = mainClassName;
|
||||||
|
ServerWrapper.config.address = address;
|
||||||
|
ServerWrapper.config.port = port;
|
||||||
|
if(!Files.exists(ServerWrapper.publicKeyFile))
|
||||||
|
{
|
||||||
|
LogHelper.error("public.key not found");
|
||||||
|
for(int i=0;i<10;++i)
|
||||||
|
{
|
||||||
|
System.out.println("Print F to continue:");
|
||||||
|
String printF = commands.commandHandler.readLine();
|
||||||
|
if(printF.equals("stop")) return;
|
||||||
|
if(Files.exists(ServerWrapper.publicKeyFile)) break;
|
||||||
|
else LogHelper.error("public.key not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean stopOnError = ServerWrapper.config.stopOnError;
|
||||||
|
for(int i=0;i<10;++i)
|
||||||
|
{
|
||||||
|
System.out.println("Print server account login:");
|
||||||
|
String login = commands.commandHandler.readLine();
|
||||||
|
System.out.println("Print server account password:");
|
||||||
|
String password = commands.commandHandler.readLine();
|
||||||
|
System.out.println("Print profile title:");
|
||||||
|
String title = commands.commandHandler.readLine();
|
||||||
|
ServerWrapper.config.login = login;
|
||||||
|
ServerWrapper.config.password = password;
|
||||||
|
ServerWrapper.config.title = title;
|
||||||
|
ServerWrapper.config.stopOnError = false;
|
||||||
|
LauncherConfig cfg = null;
|
||||||
|
try {
|
||||||
|
cfg = new LauncherConfig(ServerWrapper.config.address, ServerWrapper.config.port, SecurityHelper.toPublicRSAKey(IOHelper.read(ServerWrapper.publicKeyFile)), new HashMap<>(), ServerWrapper.config.projectname);
|
||||||
|
} catch (InvalidKeySpecException e) {
|
||||||
|
LogHelper.error(e);
|
||||||
|
}
|
||||||
|
Launcher.setConfig(cfg);
|
||||||
|
if(ServerWrapper.auth(ServerWrapper.wrapper))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.error("Auth error. Recheck account params");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ServerWrapper.config.stopOnError = stopOnError;
|
||||||
|
ServerWrapper.config.save();
|
||||||
|
LogHelper.info("Generate start script");
|
||||||
|
Path startScript;
|
||||||
|
if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE) startScript = Paths.get("start.bat");
|
||||||
|
else startScript = Paths.get("start.sh");
|
||||||
|
if(Files.exists(startScript))
|
||||||
|
{
|
||||||
|
LogHelper.warning("start script found. Move to start.bak");
|
||||||
|
Path startScriptBak = Paths.get("start.bak");
|
||||||
|
IOHelper.move(startScript, startScriptBak);
|
||||||
|
}
|
||||||
|
try(Writer writer = IOHelper.newWriter(startScript))
|
||||||
|
{
|
||||||
|
if(JVMHelper.OS_TYPE == JVMHelper.OS.LINUX)
|
||||||
|
{
|
||||||
|
writer.append("#!/bin/sh\n\n");
|
||||||
|
}
|
||||||
|
writer.append("java ");
|
||||||
|
if(mainClassName.contains("bungee"))
|
||||||
|
{
|
||||||
|
LogHelper.info("Found BungeeCord mainclass. Modules dir change to modules_srv");
|
||||||
|
writer.append(JVMHelper.jvmProperty("serverwrapper.modulesDir", "modules_srv"));
|
||||||
|
writer.append(" ");
|
||||||
|
}
|
||||||
|
//More args
|
||||||
|
writer.append("-cp ");
|
||||||
|
String pathServerWrapper = IOHelper.getCodeSource(ServerWrapper.class).getFileName().toString();
|
||||||
|
writer.append(pathServerWrapper);
|
||||||
|
if(JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE)
|
||||||
|
{
|
||||||
|
writer.append(";");
|
||||||
|
} else writer.append(":");
|
||||||
|
writer.append(jarName);
|
||||||
|
writer.append(" ");
|
||||||
|
writer.append(ServerWrapper.class.getName());
|
||||||
|
writer.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerWrapperSetup() throws IOException {
|
||||||
|
commands = new ServerWrapperCommands();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue