[FEATURE] ServerWrapperSetup

This commit is contained in:
Gravit 2019-04-03 15:46:18 +07:00
parent 1a3bf0b055
commit d6ef1fd99d
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
3 changed files with 211 additions and 12 deletions

View file

@ -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;
if(args.length > 0)
{
real_args = new String[args.length - 1];
System.arraycopy(args, 1, real_args, 0, 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;

View file

@ -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;
}
}

View file

@ -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();
}
}