From b636a81ec5e9f45faf2e9e8a53b56e244686c973 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sun, 2 Jan 2022 02:23:37 +0100 Subject: [PATCH] Adding Update and installer --- .gitignore | 1 + src/main/java/de/chaos/swlnmngr/Main.java | 11 ++- .../de/chaos/swlnmngr/config/CLIConfig.java | 16 ++++ .../java/de/chaos/swlnmngr/config/Config.java | 33 ++++++-- .../java/de/chaos/swlnmngr/route/Router.java | 28 +++++++ .../swlnmngr/route/routes/InstallRoute.java | 53 +++++++++++++ .../chaos/swlnmngr/route/routes/Routes.java | 5 -- .../swlnmngr/route/routes/UpdateRoute.java | 77 +++++++++++++++++++ src/main/resources/default_config.json | 1 - src/main/resources/default_swlnmngr.bat | 1 + src/main/resources/default_swlnmngr.sh | 2 + src/test/java/RunWithArgs.java | 11 +++ test.sh | 1 + 13 files changed, 224 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/chaos/swlnmngr/route/routes/InstallRoute.java delete mode 100644 src/main/java/de/chaos/swlnmngr/route/routes/Routes.java create mode 100644 src/main/java/de/chaos/swlnmngr/route/routes/UpdateRoute.java create mode 100644 src/test/java/RunWithArgs.java create mode 100644 test.sh diff --git a/.gitignore b/.gitignore index 9fdf634..e3267c7 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,4 @@ fabric.properties .idea/caches/build_file_checksums.ser /config.json /.idea/ +/test/ \ No newline at end of file diff --git a/src/main/java/de/chaos/swlnmngr/Main.java b/src/main/java/de/chaos/swlnmngr/Main.java index dddcc2e..8a7ecdc 100644 --- a/src/main/java/de/chaos/swlnmngr/Main.java +++ b/src/main/java/de/chaos/swlnmngr/Main.java @@ -1,7 +1,7 @@ package de.chaos.swlnmngr; import de.chaos.swlnmngr.config.CLIConfig; -import de.chaos.swlnmngr.config.Config; +import de.chaos.swlnmngr.route.Router; import lombok.Getter; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -19,12 +19,15 @@ public class Main { public static void main(String[] args) { logger.log(Level.INFO, "SteamWarLinkManager by Chaoscaot"); - allArgs = new String[args.length + Config.ADDITIONAL_ARGS.length]; - System.arraycopy(args, 0, allArgs, 0, args.length); - System.arraycopy(Config.ADDITIONAL_ARGS, 0, allArgs, args.length, Config.ADDITIONAL_ARGS.length); + allArgs = args; if(CLIConfig.IS_DEBUG) { Configurator.setRootLevel(Level.DEBUG); } logger.debug("Arguments: {}", Arrays.toString(allArgs)); + if(CLIConfig.ARGS.length > 0) { + Router.route(CLIConfig.ARGS); + } else { + + } } } diff --git a/src/main/java/de/chaos/swlnmngr/config/CLIConfig.java b/src/main/java/de/chaos/swlnmngr/config/CLIConfig.java index 5216278..9f15fa6 100644 --- a/src/main/java/de/chaos/swlnmngr/config/CLIConfig.java +++ b/src/main/java/de/chaos/swlnmngr/config/CLIConfig.java @@ -3,16 +3,22 @@ package de.chaos.swlnmngr.config; import de.chaos.swlnmngr.Main; import org.apache.commons.cli.*; +import java.io.File; + public class CLIConfig { public static final boolean IS_DEBUG; public static final boolean UPDATE; + public static final File CONFIG; + public static final File INSTALL_DIR; public static final String[] ARGS; static { Options options = new Options(); options.addOption(new Option("d", "debug", false, "Set the Log Level to Debug")); options.addOption(new Option("u", "update", false, "Update the Default libs")); + options.addOption(new Option("c", "config", true, "Use another Config File")); + options.addOption(new Option("i", "installdir", true, "Use other Install Dir")); CommandLine cli = null; CommandLineParser parser = new DefaultParser(); @@ -29,5 +35,15 @@ public class CLIConfig { ARGS = cli.getArgs(); IS_DEBUG = cli.hasOption("d"); UPDATE = cli.hasOption("u"); + if(cli.hasOption("i")) { + INSTALL_DIR = new File(cli.getOptionValue("i")); + } else { + INSTALL_DIR = new File("~/.swlnmngr/"); + } + if(cli.hasOption("c")) { + CONFIG = new File(cli.getOptionValue("c")); + } else { + CONFIG = new File(INSTALL_DIR, "config.json"); + } } } diff --git a/src/main/java/de/chaos/swlnmngr/config/Config.java b/src/main/java/de/chaos/swlnmngr/config/Config.java index 7008d8f..dcb52b6 100644 --- a/src/main/java/de/chaos/swlnmngr/config/Config.java +++ b/src/main/java/de/chaos/swlnmngr/config/Config.java @@ -1,24 +1,36 @@ package de.chaos.swlnmngr.config; import de.chaos.swlnmngr.Main; +import org.apache.logging.log4j.Level; import org.json.JSONObject; import org.json.JSONTokener; import java.io.File; import java.io.FileInputStream; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.StandardOpenOption; public class Config { - private static final File CONFIG_FILE = new File("config.json"); + private static final File CONFIG_FILE = new File(CLIConfig.INSTALL_DIR, "config.json"); - public static final String[] ADDITIONAL_ARGS; + public static final String PROJECT_PATH; + public static final File LIB_PATH; + public static final String DEFAULTS; + public static final URI LIB_URL; + + public static final String USERNAME; + public static final String PASSWORD; static { JSONObject config = null; try { if(!CONFIG_FILE.exists()) { + if(CONFIG_FILE.getParentFile().mkdir()) { + Main.getLogger().log(Level.DEBUG, "Created Config Folder"); + } Files.write(CONFIG_FILE.toPath(), Config.class.getResourceAsStream("/default_config.json").readAllBytes(), StandardOpenOption.CREATE_NEW); } @@ -28,10 +40,19 @@ public class Config { System.exit(1); } - ADDITIONAL_ARGS = config.getJSONArray("additionalArgs").toList().toArray(new String[0]); - } - - public static void reset() { + PROJECT_PATH = config.getString("projectPath"); + LIB_PATH = new File(config.getString("libPath")); + DEFAULTS = config.getString("defaultName"); + try { + LIB_URL = new URI(config.getString("libUrl")); + } catch (URISyntaxException e) { + Main.getLogger().error("libUrl is not a URL", e); + System.exit(1); + throw new SecurityException(e); + } + JSONObject credentials = config.getJSONObject("credentials"); + USERNAME = credentials.getString("username"); + PASSWORD = credentials.getString("password"); } } diff --git a/src/main/java/de/chaos/swlnmngr/route/Router.java b/src/main/java/de/chaos/swlnmngr/route/Router.java index 70bf301..4fff1c4 100644 --- a/src/main/java/de/chaos/swlnmngr/route/Router.java +++ b/src/main/java/de/chaos/swlnmngr/route/Router.java @@ -1,4 +1,32 @@ package de.chaos.swlnmngr.route; +import de.chaos.swlnmngr.Main; +import de.chaos.swlnmngr.route.routes.InstallRoute; +import de.chaos.swlnmngr.route.routes.Route; +import de.chaos.swlnmngr.route.routes.UpdateRoute; + +import java.util.*; + public class Router { + + private static final List ROUTES; + + static { + ROUTES = List.of(new InstallRoute(), new UpdateRoute()); + } + + public static void route(String[] args) { + for (Route route : ROUTES) { + if(route.getName().equalsIgnoreCase(args[0])) { + String[] rArgs = new String[args.length - 1]; + System.arraycopy(args, 1, rArgs, 0, args.length - 1); + Main.getLogger().info("Running: {}", route.getName()); + if(route.route(rArgs)) { + System.exit(0); + } else { + System.exit(1); + } + } + } + } } diff --git a/src/main/java/de/chaos/swlnmngr/route/routes/InstallRoute.java b/src/main/java/de/chaos/swlnmngr/route/routes/InstallRoute.java new file mode 100644 index 0000000..e4e942e --- /dev/null +++ b/src/main/java/de/chaos/swlnmngr/route/routes/InstallRoute.java @@ -0,0 +1,53 @@ +package de.chaos.swlnmngr.route.routes; + +import com.sun.nio.file.ExtendedCopyOption; +import de.chaos.swlnmngr.Main; +import de.chaos.swlnmngr.config.CLIConfig; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.Objects; + +public class InstallRoute implements Route { + + private static final String[] defaultFiles = new String[] {"default_config.json", "default_swlnmngr.bat", "default_swlnmngr.sh"}; + + @Override + public String getName() { + return "install"; + } + + @Override + public boolean route(String[] args) { + File installDir = CLIConfig.INSTALL_DIR; + if(!installDir.exists()) { + installDir.mkdir(); + } + + for (String defaultFile : defaultFiles) { + String normalName = defaultFile.replace("default_", ""); + try { + Files.copy(Objects.requireNonNull(InstallRoute.class.getResourceAsStream("/" + defaultFile)), new File(CLIConfig.INSTALL_DIR, normalName).toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + Main.getLogger().error("Could not create File", e); + return false; + } + } + + try { + File jar = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); + Main.getLogger().debug(jar); + Files.copy(jar.toPath(), new File(CLIConfig.INSTALL_DIR, "SteamWarLinkManager.jar").toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (URISyntaxException e) { + Main.getLogger().error("Could parse Jar Location", e); + return false; + } catch (IOException e) { + Main.getLogger().error("Could not Copy JarFile", e); + return false; + } + return true; + } +} diff --git a/src/main/java/de/chaos/swlnmngr/route/routes/Routes.java b/src/main/java/de/chaos/swlnmngr/route/routes/Routes.java deleted file mode 100644 index 6822cf1..0000000 --- a/src/main/java/de/chaos/swlnmngr/route/routes/Routes.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.chaos.swlnmngr.route.routes; - -public enum Routes { - -} diff --git a/src/main/java/de/chaos/swlnmngr/route/routes/UpdateRoute.java b/src/main/java/de/chaos/swlnmngr/route/routes/UpdateRoute.java new file mode 100644 index 0000000..c4dd52a --- /dev/null +++ b/src/main/java/de/chaos/swlnmngr/route/routes/UpdateRoute.java @@ -0,0 +1,77 @@ +package de.chaos.swlnmngr.route.routes; + +import de.chaos.swlnmngr.Main; +import de.chaos.swlnmngr.config.Config; +import org.apache.http.Header; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class UpdateRoute implements Route { + + @Override + public String getName() { + return "update"; + } + + @Override + public boolean route(String[] args) { + File defaultLibs = new File(Config.LIB_PATH, Config.DEFAULTS); + if (!defaultLibs.mkdirs()) { + for (File file : defaultLibs.listFiles()) { + file.delete(); + } + } + CredentialsProvider provider = new BasicCredentialsProvider(); + provider.setCredentials( + new AuthScope(Config.LIB_URL.getHost(), Config.LIB_URL.getPort()), + new UsernamePasswordCredentials(Config.USERNAME, Config.PASSWORD)); + try (CloseableHttpClient client = HttpClients.custom() + .setDefaultCredentialsProvider(provider) + .build()) { + HttpGet httpGet = new HttpGet(Config.LIB_URL); + try (CloseableHttpResponse response = client.execute(httpGet)) { + Main.getLogger().debug(response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase()); + for (Header allHeader : response.getAllHeaders()) { + Main.getLogger().debug(allHeader.getName() + ": " + allHeader.getValue()); + } + + Main.getLogger().info("Writing libs..."); + + ZipInputStream zis = new ZipInputStream(response.getEntity().getContent()); + byte[] buffer = new byte[2048]; + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + Path filePath = defaultLibs.toPath().resolve(entry.getName()); + Main.getLogger().debug("Inflating {}...", entry.getName()); + + try (FileOutputStream fos = new FileOutputStream(filePath.toFile()); + BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length)) { + + int len; + while ((len = zis.read(buffer)) > 0) { + bos.write(buffer, 0, len); + } + } + + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return true; + } +} diff --git a/src/main/resources/default_config.json b/src/main/resources/default_config.json index 1ea9b61..62115ca 100644 --- a/src/main/resources/default_config.json +++ b/src/main/resources/default_config.json @@ -3,7 +3,6 @@ "libPath": "~/libs/", "defaultName": "default", "libUrl": "https://steamwar.de/lib.php", - "additionalArgs": [], "credentials": { "username": "[EnterName]", "password": "[EnterPW]" diff --git a/src/main/resources/default_swlnmngr.bat b/src/main/resources/default_swlnmngr.bat index e69de29..2a53abe 100644 --- a/src/main/resources/default_swlnmngr.bat +++ b/src/main/resources/default_swlnmngr.bat @@ -0,0 +1 @@ +java -jar ./SteamWarLinkManager.jar \ No newline at end of file diff --git a/src/main/resources/default_swlnmngr.sh b/src/main/resources/default_swlnmngr.sh index e69de29..efbd049 100644 --- a/src/main/resources/default_swlnmngr.sh +++ b/src/main/resources/default_swlnmngr.sh @@ -0,0 +1,2 @@ +#!/bin/bash +java -jar ./SteamWarLinkManager.jar \ No newline at end of file diff --git a/src/test/java/RunWithArgs.java b/src/test/java/RunWithArgs.java new file mode 100644 index 0000000..f51d457 --- /dev/null +++ b/src/test/java/RunWithArgs.java @@ -0,0 +1,11 @@ +import de.chaos.swlnmngr.Main; + +import java.util.Scanner; + +public class RunWithArgs { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String arg = scanner.nextLine(); + Main.main(arg.split(" ")); + } +} diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..16cc0ab --- /dev/null +++ b/test.sh @@ -0,0 +1 @@ +java -jar target/SteamWarLinkManager.jar -i /home/chaos/IdeaProjects/swlnmngr/test/ install \ No newline at end of file