Compare commits
15 Commits
c14d5866e6
...
archived
Author | SHA1 | Date | |
---|---|---|---|
7142cd06dd | |||
8f9d7d5297 | |||
e5abc4823d | |||
c6eb4c8fdb | |||
626bb3e25a | |||
2eddf3cc2a | |||
ad208f9580 | |||
724d303433 | |||
232f7340f0 | |||
8221fb8ff7 | |||
9b92bdc625 | |||
bf34e278a4 | |||
57a813d0f8 | |||
44063af186 | |||
f615c39a84 |
22
.idea/artifacts/SysBackup_jar.xml
generated
Normal file
22
.idea/artifacts/SysBackup_jar.xml
generated
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<component name="ArtifactManager">
|
||||||
|
<artifact type="jar" name="SysBackup:jar">
|
||||||
|
<output-path>$PROJECT_DIR$/out/artifacts/SysBackup_jar</output-path>
|
||||||
|
<root id="archive" name="SysBackup.jar">
|
||||||
|
<element id="module-output" name="SysBackup" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tomlj/tomlj/1.0.0/tomlj-1.0.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/net/lingala/zip4j/zip4j/2.11.1/zip4j-2.11.1.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/me/tongfei/progressbar/0.9.3/progressbar-0.9.3.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jline/jline/3.21.0/jline-3.21.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" path-in-jar="/" />
|
||||||
|
</root>
|
||||||
|
</artifact>
|
||||||
|
</component>
|
61
pom.xml
61
pom.xml
@@ -7,6 +7,7 @@
|
|||||||
<groupId>net.horizoncode</groupId>
|
<groupId>net.horizoncode</groupId>
|
||||||
<artifactId>SysBackup</artifactId>
|
<artifactId>SysBackup</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>SysBackup</name>
|
<name>SysBackup</name>
|
||||||
|
|
||||||
@@ -58,6 +59,11 @@
|
|||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>3.12.0</version>
|
<version>3.12.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.diogonunes</groupId>
|
||||||
|
<artifactId>JColor</artifactId>
|
||||||
|
<version>5.5.1</version>
|
||||||
|
</dependency>
|
||||||
<!-- testing dependencies -->
|
<!-- testing dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
@@ -70,44 +76,25 @@
|
|||||||
<build>
|
<build>
|
||||||
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
||||||
<plugins>
|
<plugins>
|
||||||
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-clean-plugin</artifactId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<version>3.1.0</version>
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
</plugin>
|
<version>3.3.0</version>
|
||||||
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
<executions>
|
||||||
<plugin>
|
<execution>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<goals>
|
||||||
<version>3.0.2</version>
|
<goal>shade</goal>
|
||||||
</plugin>
|
</goals>
|
||||||
<plugin>
|
<configuration>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||||
<version>3.8.0</version>
|
<transformers>
|
||||||
</plugin>
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
<plugin>
|
<mainClass>Bootstrapper</mainClass>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
</transformer>
|
||||||
<version>2.22.1</version>
|
</transformers>
|
||||||
</plugin>
|
</configuration>
|
||||||
<plugin>
|
</execution>
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
</executions>
|
||||||
<version>3.0.2</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-install-plugin</artifactId>
|
|
||||||
<version>2.5.2</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-deploy-plugin</artifactId>
|
|
||||||
<version>2.8.2</version>
|
|
||||||
</plugin>
|
|
||||||
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-site-plugin</artifactId>
|
|
||||||
<version>3.7.1</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
|
||||||
<version>3.0.0</version>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</pluginManagement>
|
</pluginManagement>
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
import net.horizoncode.sysbackup.cli.CLIProcessor;
|
import net.horizoncode.sysbackup.SysBackup;
|
||||||
|
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
public class Bootstrapper {
|
public class Bootstrapper {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws URISyntaxException {
|
||||||
CLIProcessor cliProcessor = new CLIProcessor();
|
new SysBackup().start(args);
|
||||||
cliProcessor.startCLI(args);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
src/main/java/net/horizoncode/sysbackup/SysBackup.java
Normal file
29
src/main/java/net/horizoncode/sysbackup/SysBackup.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package net.horizoncode.sysbackup;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import net.horizoncode.sysbackup.cli.CLIProcessor;
|
||||||
|
import net.horizoncode.sysbackup.logging.Logger;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
public class SysBackup {
|
||||||
|
|
||||||
|
@Getter private static final Logger logger = Logger.builder().logFile(new File("log")).build();
|
||||||
|
|
||||||
|
public void start(String[] args) throws URISyntaxException {
|
||||||
|
File jarFile =
|
||||||
|
new File(SysBackup.class.getProtectionDomain().getCodeSource().getLocation().toURI());
|
||||||
|
|
||||||
|
File executionPath =
|
||||||
|
new File(
|
||||||
|
new File(SysBackup.class.getProtectionDomain().getCodeSource().getLocation().toURI())
|
||||||
|
.getParent());
|
||||||
|
|
||||||
|
if (!jarFile.isFile()) getLogger().log(Logger.LogLevel.INFO, "Dev environment detected!");
|
||||||
|
|
||||||
|
CLIProcessor cliProcessor = new CLIProcessor();
|
||||||
|
cliProcessor.startCLI(
|
||||||
|
args, jarFile.isFile() ? executionPath : new File(System.getProperty("user.dir")));
|
||||||
|
}
|
||||||
|
}
|
@@ -1,13 +1,17 @@
|
|||||||
package net.horizoncode.sysbackup.cli;
|
package net.horizoncode.sysbackup.cli;
|
||||||
|
|
||||||
|
import net.horizoncode.sysbackup.SysBackup;
|
||||||
import net.horizoncode.sysbackup.config.Config;
|
import net.horizoncode.sysbackup.config.Config;
|
||||||
|
import net.horizoncode.sysbackup.logging.Logger;
|
||||||
import net.horizoncode.sysbackup.tasks.TaskBuilder;
|
import net.horizoncode.sysbackup.tasks.TaskBuilder;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.tomlj.Toml;
|
import org.tomlj.Toml;
|
||||||
import org.tomlj.TomlParseResult;
|
import org.tomlj.TomlParseResult;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -25,86 +29,102 @@ public class CLIProcessor {
|
|||||||
" java -jar sysbackup.jar generateTaskConf magento",
|
" java -jar sysbackup.jar generateTaskConf magento",
|
||||||
" java -jar sysbackup.jar backup magento"
|
" java -jar sysbackup.jar backup magento"
|
||||||
};
|
};
|
||||||
for (String u : usage) {
|
Arrays.stream(usage).forEach(System.out::println);
|
||||||
System.out.println(u);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startCLI(String[] args) {
|
public void startCLI(String[] args, File executionPath) {
|
||||||
try {
|
try {
|
||||||
if ((args == null) || (args.length == 0)) {
|
if ((args == null) || (args.length == 0)) {
|
||||||
usage();
|
usage();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger logger = SysBackup.getLogger();
|
||||||
|
|
||||||
for (int index = 0; index < args.length; index++) {
|
for (int index = 0; index < args.length; index++) {
|
||||||
switch (args[index].toLowerCase(Locale.ROOT)) {
|
switch (args[index].toLowerCase(Locale.ROOT)) {
|
||||||
case "backup":
|
case "backup":
|
||||||
{
|
{
|
||||||
if (args.length <= 1) {
|
if (args.length <= 1) {
|
||||||
System.err.println("Please specify a output task config name!");
|
logger.log(Logger.LogLevel.WARN, "Please specify a output task config name!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String fileName = args[1];
|
String fileName = args[1];
|
||||||
File tasksFolder = new File("tasks");
|
File tasksFolder = new File(executionPath, "tasks");
|
||||||
if (!tasksFolder.exists())
|
if (!tasksFolder.exists())
|
||||||
if (!tasksFolder.mkdir()) System.err.println("Failed to create tasks folder!");
|
if (!tasksFolder.mkdir())
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "Failed to create tasks folder!");
|
||||||
File taskFile = new File(tasksFolder, fileName + ".toml");
|
File taskFile = new File(tasksFolder, fileName + ".toml");
|
||||||
if (!taskFile.exists()) {
|
if (!taskFile.exists()) {
|
||||||
System.err.println("TaskFile " + fileName + ".toml does not exist!");
|
logger.log(Logger.LogLevel.ERROR, "TaskFile %s.toml does not exist!", fileName);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.log(Logger.LogLevel.INFO, "setupping TaskBuilder...");
|
||||||
Config taskConfig = new Config(taskFile);
|
Config taskConfig = new Config(taskFile);
|
||||||
TaskBuilder taskBuilder = TaskBuilder.builder().taskConfig(taskConfig).build();
|
TaskBuilder taskBuilder =
|
||||||
|
TaskBuilder.builder()
|
||||||
|
.executionPath(executionPath)
|
||||||
|
.taskName(FilenameUtils.removeExtension(taskFile.getName()))
|
||||||
|
.taskConfig(taskConfig)
|
||||||
|
.build();
|
||||||
taskBuilder.start();
|
taskBuilder.start();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "generatetaskconf":
|
case "generatetaskconf":
|
||||||
{
|
{
|
||||||
if (args.length <= 1) {
|
if (args.length <= 1) {
|
||||||
System.err.println("Please specify a output task config name!");
|
logger.log(Logger.LogLevel.ERROR, "Please specify a output task config name!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String fileName = args[1];
|
String fileName = args[1];
|
||||||
File tasksFolder = new File("tasks");
|
File tasksFolder = new File(executionPath, "tasks");
|
||||||
if (!tasksFolder.exists())
|
if (!tasksFolder.exists())
|
||||||
if (!tasksFolder.mkdir()) System.err.println("Failed to create tasks folder!");
|
if (!tasksFolder.mkdir())
|
||||||
System.out.println("Saving task config " + fileName + ".toml...");
|
logger.log(Logger.LogLevel.ERROR, "Failed to create tasks folder!");
|
||||||
FileUtils.copyInputStreamToFile(
|
logger.log(Logger.LogLevel.INFO, "Saving task config %s.toml...", fileName);
|
||||||
Objects.requireNonNull(getClass().getResourceAsStream("/" + "exampletask.toml")),
|
try {
|
||||||
new File(tasksFolder, fileName + ".toml"));
|
FileUtils.copyInputStreamToFile(
|
||||||
System.out.println(fileName + ".toml saved!");
|
Objects.requireNonNull(
|
||||||
|
getClass().getResourceAsStream("/" + "exampletask.toml")),
|
||||||
|
new File(tasksFolder, fileName + ".toml"));
|
||||||
|
} catch (IOException exception) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "Failed to save task config.");
|
||||||
|
}
|
||||||
|
logger.log(Logger.LogLevel.INFO, "%s.toml saved!", fileName);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "checktaskconf":
|
case "checktaskconf":
|
||||||
{
|
{
|
||||||
if (args.length <= 1) {
|
if (args.length <= 1) {
|
||||||
System.err.println("Please specify a output task config name!");
|
logger.log(Logger.LogLevel.ERROR, "Please specify a output task config name!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String fileName = args[1];
|
String fileName = args[1];
|
||||||
File tasksFolder = new File("tasks");
|
File tasksFolder = new File(executionPath, "tasks");
|
||||||
if (!tasksFolder.exists())
|
if (!tasksFolder.exists())
|
||||||
if (!tasksFolder.mkdir()) System.err.println("Failed to create tasks folder!");
|
if (!tasksFolder.mkdir())
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "Failed to create tasks folder!");
|
||||||
File taskFile = new File(tasksFolder, fileName + ".toml");
|
File taskFile = new File(tasksFolder, fileName + ".toml");
|
||||||
if (!taskFile.exists()) {
|
if (!taskFile.exists()) {
|
||||||
System.err.println("TaskFile " + fileName + ".toml does not exist!");
|
logger.log(Logger.LogLevel.ERROR, "TaskFile %s.toml does not exist!", fileName);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TomlParseResult toml;
|
TomlParseResult toml;
|
||||||
try {
|
try {
|
||||||
toml = Toml.parse(taskFile.toPath());
|
toml = Toml.parse(taskFile.toPath());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.err.println("failed to read TaskFile.");
|
logger.log(Logger.LogLevel.ERROR, "failed to read TaskFile.");
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
if (toml.hasErrors()) {
|
if (toml.hasErrors()) {
|
||||||
System.err.printf(
|
logger.log(
|
||||||
"TaskFile checked: found %d issues!:\n", (long) toml.errors().size());
|
Logger.LogLevel.ERROR,
|
||||||
toml.errors().forEach(error -> System.err.println(error.toString()));
|
"TaskFile checked: found %d issues!:\n",
|
||||||
|
(long) toml.errors().size());
|
||||||
|
toml.errors().forEach(error -> logger.log(Logger.LogLevel.ERROR, error.toString()));
|
||||||
} else {
|
} else {
|
||||||
System.out.println("TaskFile checked successfully: no issues found!");
|
logger.log(Logger.LogLevel.INFO, "TaskFile checked successfully: no issues found!");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -116,6 +136,7 @@ public class CLIProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
SysBackup.getLogger().log(Logger.LogLevel.ERROR, t.getMessage());
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
48
src/main/java/net/horizoncode/sysbackup/logging/Logger.java
Normal file
48
src/main/java/net/horizoncode/sysbackup/logging/Logger.java
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package net.horizoncode.sysbackup.logging;
|
||||||
|
|
||||||
|
import com.diogonunes.jcolor.Ansi;
|
||||||
|
import com.diogonunes.jcolor.Attribute;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
public class Logger {
|
||||||
|
private File logFile;
|
||||||
|
|
||||||
|
public void log(LogLevel logLevel, String message, Object... args) {
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
String prefix =
|
||||||
|
String.format(
|
||||||
|
"[%s - %s] ",
|
||||||
|
sdf.format(new Date()), Ansi.colorize(logLevel.name(), logLevel.getColor()));
|
||||||
|
String line = prefix + message;
|
||||||
|
System.out.printf(line + "\r\n", args);
|
||||||
|
|
||||||
|
// append to logfile
|
||||||
|
try {
|
||||||
|
FileUtils.writeStringToFile(
|
||||||
|
logFile, line.replaceAll("\u001B\\[[;\\d]*m", "") + "\r\n", StandardCharsets.UTF_8, true);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LogLevel {
|
||||||
|
INFO(Attribute.CYAN_TEXT()),
|
||||||
|
WARN(Attribute.YELLOW_TEXT()),
|
||||||
|
ERROR(Attribute.RED_TEXT());
|
||||||
|
|
||||||
|
@Getter private final Attribute color;
|
||||||
|
|
||||||
|
LogLevel(Attribute color) {
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2,13 +2,19 @@ package net.horizoncode.sysbackup.tasks;
|
|||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import net.horizoncode.sysbackup.SysBackup;
|
||||||
import net.horizoncode.sysbackup.config.Config;
|
import net.horizoncode.sysbackup.config.Config;
|
||||||
|
import net.horizoncode.sysbackup.logging.Logger;
|
||||||
|
import net.horizoncode.sysbackup.tasks.impl.DatabaseTask;
|
||||||
import net.horizoncode.sysbackup.tasks.impl.FileSystemTask;
|
import net.horizoncode.sysbackup.tasks.impl.FileSystemTask;
|
||||||
|
import net.horizoncode.sysbackup.tasks.impl.VacuumTask;
|
||||||
|
import net.horizoncode.sysbackup.threading.ThreadPool;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.tomlj.TomlArray;
|
import org.tomlj.TomlArray;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
@@ -19,14 +25,28 @@ public class TaskBuilder {
|
|||||||
|
|
||||||
private final Config taskConfig;
|
private final Config taskConfig;
|
||||||
|
|
||||||
|
private final String taskName;
|
||||||
|
|
||||||
@Builder.Default private final LinkedBlockingQueue<Task> taskList = new LinkedBlockingQueue<>();
|
@Builder.Default private final LinkedBlockingQueue<Task> taskList = new LinkedBlockingQueue<>();
|
||||||
|
@Builder.Default @Getter private final ThreadPool threadPool = new ThreadPool(3, 10);
|
||||||
|
|
||||||
|
private final File executionPath;
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
|
|
||||||
File backupDir = new File("backups");
|
Logger logger = SysBackup.getLogger();
|
||||||
|
|
||||||
|
File rootBackupDir = new File(executionPath, "backups");
|
||||||
|
if (!rootBackupDir.exists())
|
||||||
|
if (!rootBackupDir.mkdir()) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "Failed to create root backup directory!");
|
||||||
|
System.exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
File backupDir = new File(rootBackupDir, getTaskName());
|
||||||
if (!backupDir.exists())
|
if (!backupDir.exists())
|
||||||
if (!backupDir.mkdir()) {
|
if (!backupDir.mkdir()) {
|
||||||
System.err.println("Failed to create backups directory!");
|
logger.log(Logger.LogLevel.ERROR, "Failed to create backup directory!");
|
||||||
System.exit(2);
|
System.exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +54,10 @@ public class TaskBuilder {
|
|||||||
new SimpleDateFormat(
|
new SimpleDateFormat(
|
||||||
getTaskConfig().getStringOrDefault("general.dateFormat", "yyyy-MM-dd HH-mm-ss"));
|
getTaskConfig().getStringOrDefault("general.dateFormat", "yyyy-MM-dd HH-mm-ss"));
|
||||||
String fileName =
|
String fileName =
|
||||||
getTaskConfig().getStringOrDefault("filesystem.fileName", "{date} - {taskName}") + ".zip";
|
getTaskConfig().getStringOrDefault("general.outputFile", "{date} - {taskName}") + ".zip";
|
||||||
|
boolean doVAC = getTaskConfig().getBooleanOrDefault("vacuum.enabled", false);
|
||||||
|
boolean doFS = getTaskConfig().getBooleanOrDefault("filesystem.enabled", false);
|
||||||
|
boolean doDB = getTaskConfig().getBooleanOrDefault("mysql.enabled", false);
|
||||||
|
|
||||||
fileName =
|
fileName =
|
||||||
fileName
|
fileName
|
||||||
@@ -45,32 +68,79 @@ public class TaskBuilder {
|
|||||||
|
|
||||||
File outputFile = new File(backupDir, fileName);
|
File outputFile = new File(backupDir, fileName);
|
||||||
|
|
||||||
if (getTaskConfig().getToml().contains("filesystem.targets")) {
|
if (doVAC) {
|
||||||
|
ChronoUnit unit =
|
||||||
|
ChronoUnit.valueOf(
|
||||||
|
getTaskConfig().getStringOrDefault("vacuum.unit", ChronoUnit.DAYS.name()));
|
||||||
|
|
||||||
|
int value = getTaskConfig().getIntOrDefault("vacuum.time", 5);
|
||||||
|
|
||||||
|
logger.log(
|
||||||
|
Logger.LogLevel.INFO, "Adding VacuumTask with lifetime of %d %s%n", value, unit.name());
|
||||||
|
taskList.add(
|
||||||
|
new VacuumTask(backupDir, unit, value) {
|
||||||
|
@Override
|
||||||
|
public void onDone() {
|
||||||
|
getThreadPool().getPool().submit(() -> executeNextTask());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doFS && getTaskConfig().getToml().contains("filesystem.targets")) {
|
||||||
|
logger.log(Logger.LogLevel.INFO, "Adding FileSystemTask...");
|
||||||
TomlArray filesArray = getTaskConfig().getArray("filesystem.targets");
|
TomlArray filesArray = getTaskConfig().getArray("filesystem.targets");
|
||||||
|
|
||||||
IntStream.range(0, filesArray.size())
|
IntStream.range(0, filesArray.size())
|
||||||
.forEach(
|
.forEach(
|
||||||
value -> {
|
value -> {
|
||||||
String target = filesArray.getString(value);
|
String target = filesArray.getString(value);
|
||||||
|
logger.log(Logger.LogLevel.INFO, "Adding \"%s\"", target);
|
||||||
taskList.add(
|
taskList.add(
|
||||||
new FileSystemTask(target, outputFile) {
|
new FileSystemTask(target, outputFile) {
|
||||||
@Override
|
@Override
|
||||||
public void onDone() {
|
public void onDone() {
|
||||||
executeNextTask();
|
getThreadPool().getPool().submit(() -> executeNextTask());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
executeNextTask();
|
if (doDB) {
|
||||||
|
String database = getTaskConfig().getStringOrDefault("mysql.database", "");
|
||||||
|
String user = getTaskConfig().getStringOrDefault("mysql.user", "");
|
||||||
|
String password = getTaskConfig().getStringOrDefault("mysql.password", "");
|
||||||
|
|
||||||
|
if (!database.isEmpty() && !user.isEmpty() && !password.isEmpty()) {
|
||||||
|
DatabaseTask.DatabaseCredentials databaseCredentials =
|
||||||
|
DatabaseTask.DatabaseCredentials.builder()
|
||||||
|
.database(database)
|
||||||
|
.username(user)
|
||||||
|
.password(password.toCharArray())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
logger.log(Logger.LogLevel.INFO, "Adding DatabaseTask for database \"%s\"", database);
|
||||||
|
|
||||||
|
taskList.add(
|
||||||
|
new DatabaseTask(databaseCredentials, outputFile) {
|
||||||
|
@Override
|
||||||
|
public void onDone() {
|
||||||
|
getThreadPool().getPool().submit(() -> executeNextTask());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "username, password or database is empty.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getThreadPool().getPool().submit(this::executeNextTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void executeNextTask() {
|
private void executeNextTask() {
|
||||||
Task nextTask = taskList.poll();
|
Task nextTask = taskList.poll();
|
||||||
if (nextTask != null) nextTask.start();
|
if (nextTask != null) nextTask.start();
|
||||||
else {
|
else {
|
||||||
System.out.println("Backup completed!");
|
SysBackup.getLogger().log(Logger.LogLevel.INFO, "Backup completed!");
|
||||||
System.out.println(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,17 +2,19 @@ package net.horizoncode.sysbackup.tasks.impl;
|
|||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import me.tongfei.progressbar.ProgressBar;
|
||||||
|
import me.tongfei.progressbar.ProgressBarBuilder;
|
||||||
|
import me.tongfei.progressbar.ProgressBarStyle;
|
||||||
|
import net.horizoncode.sysbackup.SysBackup;
|
||||||
|
import net.horizoncode.sysbackup.logging.Logger;
|
||||||
import net.horizoncode.sysbackup.tasks.Task;
|
import net.horizoncode.sysbackup.tasks.Task;
|
||||||
import org.apache.commons.io.FileUtils;
|
import net.lingala.zip4j.ZipFile;
|
||||||
import org.apache.commons.io.IOUtils;
|
import net.lingala.zip4j.progress.ProgressMonitor;
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
public class DatabaseTask extends Task {
|
public class DatabaseTask extends Task {
|
||||||
@@ -29,32 +31,104 @@ public class DatabaseTask extends Task {
|
|||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
try {
|
try {
|
||||||
String[] commandArgs =
|
Logger logger = SysBackup.getLogger();
|
||||||
new String[] {
|
String commandArgs =
|
||||||
"mysqldump",
|
"mysqldump -u "
|
||||||
"-u " + getDatabaseCredentials().username,
|
+ getDatabaseCredentials().username
|
||||||
"-p" + new String(getDatabaseCredentials().password),
|
+ " -p"
|
||||||
getDatabaseCredentials().database
|
+ new String(getDatabaseCredentials().password)
|
||||||
};
|
+ " "
|
||||||
|
+ getDatabaseCredentials().database;
|
||||||
|
|
||||||
Runtime runtime = Runtime.getRuntime();
|
Runtime runtime = Runtime.getRuntime();
|
||||||
Process process = runtime.exec(commandArgs);
|
Process process = runtime.exec(commandArgs);
|
||||||
|
|
||||||
InputStream inputStream = process.getInputStream();
|
String databaseContent = "";
|
||||||
FileUtils.copyInputStreamToFile(
|
|
||||||
inputStream,
|
while (process.isAlive()) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
databaseContent =
|
||||||
|
new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))
|
||||||
|
.lines()
|
||||||
|
.collect(Collectors.joining("\n"));
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, e.getMessage());
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int exitValue = process.exitValue();
|
||||||
|
|
||||||
|
if (exitValue != 0) {
|
||||||
|
String text =
|
||||||
|
new BufferedReader(
|
||||||
|
new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))
|
||||||
|
.lines()
|
||||||
|
.collect(Collectors.joining("\n"));
|
||||||
|
logger.log(Logger.LogLevel.ERROR, text);
|
||||||
|
onDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (databaseContent.isEmpty()) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, "database content is empty");
|
||||||
|
onDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
File outputSQLFile =
|
||||||
new File(
|
new File(
|
||||||
outputFile.getParent(),
|
outputFile.getParent(),
|
||||||
String.format(
|
String.format(
|
||||||
"%s-%s.sql",
|
"%s-%s.sql",
|
||||||
getDatabaseCredentials().database, RandomStringUtils.random(16, true, true))));
|
getDatabaseCredentials().database, RandomStringUtils.random(16, true, true)));
|
||||||
|
|
||||||
|
BufferedWriter writer = new BufferedWriter(new FileWriter(outputSQLFile));
|
||||||
|
writer.write(databaseContent);
|
||||||
|
writer.close();
|
||||||
|
logger.log(Logger.LogLevel.INFO, "Adding database to backup zip...");
|
||||||
|
try (ZipFile zipFile = new ZipFile(getOutputFile())) {
|
||||||
|
ProgressMonitor progressMonitor = zipFile.getProgressMonitor();
|
||||||
|
zipFile.setRunInThread(true);
|
||||||
|
zipFile.addFile(outputSQLFile);
|
||||||
|
ProgressBarBuilder pbb =
|
||||||
|
new ProgressBarBuilder()
|
||||||
|
.setStyle(ProgressBarStyle.ASCII)
|
||||||
|
.setInitialMax(progressMonitor.getTotalWork())
|
||||||
|
.setTaskName("Adding DB File...")
|
||||||
|
.setUnit("MiB", 1048576);
|
||||||
|
|
||||||
|
try (ProgressBar pb = pbb.build()) {
|
||||||
|
while (!progressMonitor.getState().equals(ProgressMonitor.State.READY)) {
|
||||||
|
pb.stepTo(progressMonitor.getWorkCompleted());
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
pb.stepTo(progressMonitor.getTotalWork());
|
||||||
|
} catch (Exception exception) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, exception.getMessage());
|
||||||
|
exception.printStackTrace();
|
||||||
|
outputSQLFile.deleteOnExit();
|
||||||
|
onDone();
|
||||||
|
}
|
||||||
|
progressMonitor.endProgressMonitor();
|
||||||
|
outputSQLFile.deleteOnExit();
|
||||||
|
onDone();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.log(Logger.LogLevel.ERROR, ex.getMessage());
|
||||||
|
ex.printStackTrace();
|
||||||
|
onDone();
|
||||||
|
}
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
SysBackup.getLogger().log(Logger.LogLevel.ERROR, e.getMessage());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
private static class DatabaseCredentials {
|
public static class DatabaseCredentials {
|
||||||
private final String username;
|
private final String username;
|
||||||
private final char[] password;
|
private final char[] password;
|
||||||
private final String database;
|
private final String database;
|
||||||
|
@@ -3,16 +3,13 @@ package net.horizoncode.sysbackup.tasks.impl;
|
|||||||
import me.tongfei.progressbar.ProgressBar;
|
import me.tongfei.progressbar.ProgressBar;
|
||||||
import me.tongfei.progressbar.ProgressBarBuilder;
|
import me.tongfei.progressbar.ProgressBarBuilder;
|
||||||
import me.tongfei.progressbar.ProgressBarStyle;
|
import me.tongfei.progressbar.ProgressBarStyle;
|
||||||
import me.tongfei.progressbar.TerminalUtils;
|
import net.horizoncode.sysbackup.SysBackup;
|
||||||
|
import net.horizoncode.sysbackup.logging.Logger;
|
||||||
import net.horizoncode.sysbackup.tasks.Task;
|
import net.horizoncode.sysbackup.tasks.Task;
|
||||||
import net.horizoncode.sysbackup.threading.ThreadPool;
|
|
||||||
import net.lingala.zip4j.ZipFile;
|
import net.lingala.zip4j.ZipFile;
|
||||||
import net.lingala.zip4j.progress.ProgressMonitor;
|
import net.lingala.zip4j.progress.ProgressMonitor;
|
||||||
import org.jline.terminal.Terminal;
|
|
||||||
import org.jline.terminal.TerminalBuilder;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
public class FileSystemTask extends Task {
|
public class FileSystemTask extends Task {
|
||||||
@@ -20,14 +17,13 @@ public class FileSystemTask extends Task {
|
|||||||
private final File target;
|
private final File target;
|
||||||
private File outputZipFile;
|
private File outputZipFile;
|
||||||
|
|
||||||
private final ThreadPool threadPool;
|
|
||||||
|
|
||||||
public FileSystemTask(String folderOrFilePath, File outputZipFile) {
|
public FileSystemTask(String folderOrFilePath, File outputZipFile) {
|
||||||
this.threadPool = new ThreadPool(3, 10);
|
|
||||||
this.target = Paths.get(folderOrFilePath).toFile();
|
this.target = Paths.get(folderOrFilePath).toFile();
|
||||||
|
Logger logger = SysBackup.getLogger();
|
||||||
if (!target.exists()) {
|
if (!target.exists()) {
|
||||||
onDone();
|
onDone();
|
||||||
System.err.println("File or folder named \"" + folderOrFilePath + "\" does not exist.");
|
logger.log(
|
||||||
|
Logger.LogLevel.ERROR, "File or folder named \"%s\" does not exist.", folderOrFilePath);
|
||||||
System.exit(2);
|
System.exit(2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -37,49 +33,36 @@ public class FileSystemTask extends Task {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
threadPool
|
Logger logger = SysBackup.getLogger();
|
||||||
.getPool()
|
try (ZipFile zipFile = new ZipFile(outputZipFile)) {
|
||||||
.submit(
|
logger.log(Logger.LogLevel.INFO, "Indexing files...");
|
||||||
() -> {
|
ProgressMonitor progressMonitor = zipFile.getProgressMonitor();
|
||||||
int terminalWidth = -1;
|
zipFile.setRunInThread(true);
|
||||||
try {
|
zipFile.addFolder(target);
|
||||||
Terminal terminal = TerminalBuilder.terminal();
|
ProgressBarBuilder pbb =
|
||||||
try (terminal) {
|
new ProgressBarBuilder()
|
||||||
terminalWidth = terminal.getWidth();
|
.setStyle(ProgressBarStyle.ASCII)
|
||||||
}
|
.setInitialMax(progressMonitor.getTotalWork())
|
||||||
} catch (IOException e) {
|
.setTaskName("Adding Files...")
|
||||||
throw new RuntimeException(e);
|
.setUnit("MiB", 1048576);
|
||||||
}
|
|
||||||
|
|
||||||
try (ZipFile zipFile = new ZipFile(outputZipFile)) {
|
try (ProgressBar pb = pbb.build()) {
|
||||||
System.out.println("Indexing files...");
|
while (!progressMonitor.getState().equals(ProgressMonitor.State.READY)) {
|
||||||
ProgressMonitor progressMonitor = zipFile.getProgressMonitor();
|
pb.stepTo(progressMonitor.getWorkCompleted());
|
||||||
zipFile.setRunInThread(true);
|
Thread.sleep(100);
|
||||||
zipFile.addFolder(target);
|
}
|
||||||
ProgressBarBuilder pbb =
|
pb.stepTo(progressMonitor.getTotalWork());
|
||||||
new ProgressBarBuilder()
|
} catch (Exception exception) {
|
||||||
.setStyle(ProgressBarStyle.ASCII)
|
logger.log(Logger.LogLevel.ERROR, exception.getMessage());
|
||||||
.setInitialMax(progressMonitor.getTotalWork())
|
exception.printStackTrace();
|
||||||
.setTaskName("Adding Files...");
|
onDone();
|
||||||
|
}
|
||||||
if (terminalWidth != -1) pbb.setMaxRenderedLength(terminalWidth);
|
progressMonitor.endProgressMonitor();
|
||||||
|
onDone();
|
||||||
try (ProgressBar pb = pbb.build()) {
|
} catch (Exception ex) {
|
||||||
while (!progressMonitor.getState().equals(ProgressMonitor.State.READY)) {
|
logger.log(Logger.LogLevel.ERROR, ex.getMessage());
|
||||||
pb.stepTo(progressMonitor.getWorkCompleted());
|
ex.printStackTrace();
|
||||||
Thread.sleep(100);
|
onDone();
|
||||||
}
|
}
|
||||||
pb.stepTo(progressMonitor.getTotalWork());
|
|
||||||
} catch (Exception exception) {
|
|
||||||
exception.printStackTrace();
|
|
||||||
onDone();
|
|
||||||
}
|
|
||||||
progressMonitor.endProgressMonitor();
|
|
||||||
onDone();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
onDone();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,38 @@
|
|||||||
|
package net.horizoncode.sysbackup.tasks.impl;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import net.horizoncode.sysbackup.tasks.Task;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class VacuumTask extends Task {
|
||||||
|
|
||||||
|
private final File backupDir;
|
||||||
|
private final ChronoUnit unit;
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
public VacuumTask(File backupDir, ChronoUnit unit, int value) {
|
||||||
|
this.backupDir = backupDir;
|
||||||
|
this.unit = unit;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
if (backupDir.listFiles() != null) {
|
||||||
|
Arrays.stream(Objects.requireNonNull(backupDir.listFiles()))
|
||||||
|
.filter(
|
||||||
|
file ->
|
||||||
|
file.lastModified() + Duration.of(value, unit).toMillis()
|
||||||
|
<= System.currentTimeMillis())
|
||||||
|
.forEachOrdered(File::deleteOnExit);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDone();
|
||||||
|
}
|
||||||
|
}
|
@@ -3,7 +3,6 @@ package net.horizoncode.sysbackup.threading;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
|
||||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
|
||||||
public class ThreadPool {
|
public class ThreadPool {
|
||||||
@@ -11,13 +10,10 @@ public class ThreadPool {
|
|||||||
@Getter private final ExecutorService pool;
|
@Getter private final ExecutorService pool;
|
||||||
|
|
||||||
public ThreadPool(int corePoolSize, int maxPoolSize) {
|
public ThreadPool(int corePoolSize, int maxPoolSize) {
|
||||||
this.pool = scheduledExecutorService(corePoolSize, maxPoolSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ScheduledExecutorService scheduledExecutorService(int corePoolSize, int maxPoolSize) {
|
|
||||||
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
|
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
|
||||||
new ScheduledThreadPoolExecutor(corePoolSize);
|
new ScheduledThreadPoolExecutor(corePoolSize);
|
||||||
scheduledThreadPoolExecutor.setMaximumPoolSize(maxPoolSize);
|
scheduledThreadPoolExecutor.setMaximumPoolSize(maxPoolSize);
|
||||||
return scheduledThreadPoolExecutor;
|
|
||||||
|
this.pool = scheduledThreadPoolExecutor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
src/main/resources/META-INF/MANIFEST.MF
Normal file
3
src/main/resources/META-INF/MANIFEST.MF
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: Bootstrapper
|
||||||
|
|
@@ -1,16 +1,20 @@
|
|||||||
[general]
|
[general]
|
||||||
dateFormat = "yyyy-MM-dd"
|
dateFormat = "yyyy-MM-dd HH-mm-ss"
|
||||||
|
outputFile = "{date} - {taskName}"
|
||||||
|
|
||||||
|
[vacuum]
|
||||||
|
enabled = true
|
||||||
|
time = 5
|
||||||
|
unit = "DAYS" # See java.time.temporal.ChronoUnit
|
||||||
|
|
||||||
[mysql]
|
[mysql]
|
||||||
enabled = true
|
enabled = true
|
||||||
host = ""
|
|
||||||
port = 3306
|
|
||||||
database = "magento"
|
database = "magento"
|
||||||
user = ""
|
user = ""
|
||||||
password = ""
|
password = ""
|
||||||
fileName = "{date} - {taskName}"
|
|
||||||
|
|
||||||
[filesystem]
|
[filesystem]
|
||||||
|
enabled = true
|
||||||
targets = ["/home/magento/", "/home/test/test.ini"]
|
targets = ["/home/magento/", "/home/test/test.ini"]
|
||||||
fileName = "{date} - {taskName}"
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user