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