diff --git a/brain/pom.xml b/brain/pom.xml index 800d89d..577e2fc 100644 --- a/brain/pom.xml +++ b/brain/pom.xml @@ -16,6 +16,25 @@ ${asys.version} + + + org.projectlombok + lombok + 1.16.10 + provided + + + commons-io + commons-io + 2.5 + + + asys + core + 0.3 + + + ${project.groupId}.${project.artifactId}-${project.version} diff --git a/brain/src/main/java/asys/brain/Brain.java b/brain/src/main/java/asys/brain/Brain.java index c096754..13dd5cf 100644 --- a/brain/src/main/java/asys/brain/Brain.java +++ b/brain/src/main/java/asys/brain/Brain.java @@ -4,11 +4,47 @@ */ package asys.brain; +import asys.core.buildscript.BuildScript; +import asys.core.buildscript.CommandException; +import lombok.Getter; +import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.IOException; +import java.util.Map; + class Brain { private Logger logger = LoggerFactory.getLogger(Brain.class); + @Getter @Setter + private File buildscriptDir; + @Getter @Setter + private Map environment; + + public void deployServers(Map data) { + File[] buildscriptFiles = buildscriptDir.listFiles(file -> file.isFile() && file.getName().endsWith(".bs")); + if (buildscriptFiles == null) return; + + for (File buildFile : buildscriptFiles) { + String serverName = buildFile.getName().substring(0,buildFile.getName().lastIndexOf('.')); + Integer count = data.get(serverName); + if (count == null) continue; + + try { + BuildScript buildScript = BuildScript.loadFromFile(buildFile); + buildScript.setVariables(environment); + + for (int id = 1; id <= count; id++) { + logger.debug("Deploy \"{}{}\" server", serverName, id); + buildScript.setVariable("id", String.valueOf(id)); + buildScript.execute(); + } + } catch (IOException | CommandException e) { + logger.error("Error deploy server", e); + } + } + } void start() { logger.trace("Brain module started"); diff --git a/brain/src/main/java/asys/brain/BrainActivator.java b/brain/src/main/java/asys/brain/BrainActivator.java index cc7339f..57957aa 100644 --- a/brain/src/main/java/asys/brain/BrainActivator.java +++ b/brain/src/main/java/asys/brain/BrainActivator.java @@ -7,6 +7,9 @@ package asys.brain; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import java.io.FileInputStream; +import java.util.Properties; + public class BrainActivator implements BundleActivator { @Override diff --git a/brain/src/test/java/asys/brain/TestBrain.java b/brain/src/test/java/asys/brain/TestBrain.java new file mode 100644 index 0000000..eda3869 --- /dev/null +++ b/brain/src/test/java/asys/brain/TestBrain.java @@ -0,0 +1,51 @@ +/* + * DmitriyMX + * 2016-07-17 + */ +package asys.brain; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +/* + * Логика работы модуля + * + * Вначале происходит загрузка конфига, где прописаны папка со скриптами + * и папка с серверами. Затем он проверяет кол-во уже развёрнутых серверов с кол-вом + * указанным в конфиге. Проверка простая: если папка есть и в ней есть необходимые файлы + * для запуска - значит система полноценно развернута. В ином случае, папка затирается + * и разворачиватеся по новому. Помимо разворачивания серверов, "мозг" запускает минимальное кол-во серверов, которые + * должы быть активными. + */ + +public class TestBrain { + private static Brain brain; + + @BeforeClass + public static void beforeClass() { + File tmpDir = new File("D:/tmp"); + brain = new Brain(); + brain.setBuildscriptDir(new File(tmpDir, "scripts")); + + Map env = new HashMap<>(); + env.put("servers", new File(tmpDir, "servers").toString()); + env.put("distrib", new File(tmpDir, "distrib").toString()); + + brain.setEnvironment(env); + } + + @Test + public void test() { + Map data = new HashMap<>(); + data.put("bedwars", 19); + + brain.deployServers(data); + } +} diff --git a/brain/src/test/resources/brain.conf b/brain/src/test/resources/brain.conf new file mode 100644 index 0000000..35778d1 --- /dev/null +++ b/brain/src/test/resources/brain.conf @@ -0,0 +1,10 @@ +# Папка в которой находятся скрипты разворачивания серверов +buildscript.folder = templates +# +# Папка в которую разворачиваются сервера +servers.folder = servers +# +# Число серверов, которое необходимо сразу развернуть. +# Имя параметра формируется по шаблону: server.название_шаблона +server.skywars = 9 +server.bedwars = 7 diff --git a/core/src/main/java/asys/core/ASysCore.java b/core/src/main/java/asys/core/ASysCore.java index b652357..f9cfc66 100644 --- a/core/src/main/java/asys/core/ASysCore.java +++ b/core/src/main/java/asys/core/ASysCore.java @@ -5,6 +5,7 @@ package asys.core; import asys.core.api.ICore; +import org.apache.commons.io.FileUtils; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; diff --git a/core/src/main/java/asys/core/buildscript/BuildScript.java b/core/src/main/java/asys/core/buildscript/BuildScript.java index 49454b9..d4ca3f9 100644 --- a/core/src/main/java/asys/core/buildscript/BuildScript.java +++ b/core/src/main/java/asys/core/buildscript/BuildScript.java @@ -9,13 +9,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -32,7 +30,11 @@ import java.util.zip.ZipInputStream; public class BuildScript { private Logger logger = LoggerFactory.getLogger(BuildScript.class); List scriptLines = new ArrayList<>(); - private Map variables; + private Map variables = new HashMap<>(); + + public static BuildScript loadFromFile(File file) throws IOException, UnknowCommandException { + return new BuildScript(FileUtils.readFileToString(file, Charset.forName("UTF-8"))); + } public BuildScript(String script) throws UnknowCommandException { if (script == null || script.trim().isEmpty()) { @@ -54,6 +56,10 @@ public class BuildScript { this.variables = variables; } + public void setVariable(String name, String value) { + this.variables.put(name, value); + } + private String[] parseCommandLine(String line) throws UnknowCommandException { final StringTokenizer strTok = new StringTokenizer(line, " \"\'", true); final List preArr = new ArrayList<>(); @@ -243,6 +249,7 @@ public class BuildScript { ZipEntry ze; while ((ze = zis.getNextEntry()) != null) { + if (ze.isDirectory()) continue; String fileName = ze.getName(); File newFile = new File(targetPath.toFile(), fileName); Files.createDirectories(Paths.get(newFile.getParent())); diff --git a/core/src/main/java/asys/core/buildscript/CommandException.java b/core/src/main/java/asys/core/buildscript/CommandException.java index 3ecef67..3980d54 100644 --- a/core/src/main/java/asys/core/buildscript/CommandException.java +++ b/core/src/main/java/asys/core/buildscript/CommandException.java @@ -4,7 +4,7 @@ */ package asys.core.buildscript; -class CommandException extends Exception { +public class CommandException extends Exception { CommandException(String message) { super(message); } diff --git a/core/src/main/java/asys/core/buildscript/UnknowCommandException.java b/core/src/main/java/asys/core/buildscript/UnknowCommandException.java index 81d8555..50becf1 100644 --- a/core/src/main/java/asys/core/buildscript/UnknowCommandException.java +++ b/core/src/main/java/asys/core/buildscript/UnknowCommandException.java @@ -4,7 +4,7 @@ */ package asys.core.buildscript; -class UnknowCommandException extends CommandException { +public class UnknowCommandException extends CommandException { UnknowCommandException(String message) { super(message); }