Compare commits

..

No commits in common. "8221fb8ff7a2230b4ba54242b9d8eb4bab9b9f49" and "c14d5866e66165dfb8af807f6c13df60302f14ae" have entirely different histories.

7 changed files with 74 additions and 166 deletions

View File

@ -1,22 +0,0 @@
<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>

56
pom.xml
View File

@ -7,7 +7,6 @@
<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>
@ -71,25 +70,44 @@
<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>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId>
<artifactId>maven-shade-plugin</artifactId> <version>3.1.0</version>
<version>3.3.0</version> </plugin>
<executions> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<execution> <plugin>
<goals> <artifactId>maven-resources-plugin</artifactId>
<goal>shade</goal> <version>3.0.2</version>
</goals> </plugin>
<configuration> <plugin>
<shadedArtifactAttached>true</shadedArtifactAttached> <artifactId>maven-compiler-plugin</artifactId>
<transformers> <version>3.8.0</version>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> </plugin>
<mainClass>Bootstrapper</mainClass> <plugin>
</transformer> <artifactId>maven-surefire-plugin</artifactId>
</transformers> <version>2.22.1</version>
</configuration> </plugin>
</execution> <plugin>
</executions> <artifactId>maven-jar-plugin</artifactId>
<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>

View File

@ -3,13 +3,11 @@ package net.horizoncode.sysbackup.tasks;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import net.horizoncode.sysbackup.config.Config; import net.horizoncode.sysbackup.config.Config;
import net.horizoncode.sysbackup.tasks.impl.DatabaseTask;
import net.horizoncode.sysbackup.tasks.impl.FileSystemTask; import net.horizoncode.sysbackup.tasks.impl.FileSystemTask;
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.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -36,10 +34,7 @@ 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("general.outputFile", "{date} - {taskName}") + ".zip"; getTaskConfig().getStringOrDefault("filesystem.fileName", "{date} - {taskName}") + ".zip";
boolean doFS = getTaskConfig().getBooleanOrDefault("filesystem.enabled", false);
boolean doDB = getTaskConfig().getBooleanOrDefault("mysql.enabled", false);
fileName = fileName =
fileName fileName
@ -49,7 +44,8 @@ public class TaskBuilder {
.replace("{date}", sdf.format(new Date())); .replace("{date}", sdf.format(new Date()));
File outputFile = new File(backupDir, fileName); File outputFile = new File(backupDir, fileName);
if (doFS && getTaskConfig().getToml().contains("filesystem.targets")) {
if (getTaskConfig().getToml().contains("filesystem.targets")) {
TomlArray filesArray = getTaskConfig().getArray("filesystem.targets"); TomlArray filesArray = getTaskConfig().getArray("filesystem.targets");
IntStream.range(0, filesArray.size()) IntStream.range(0, filesArray.size())
@ -66,31 +62,6 @@ public class TaskBuilder {
}); });
} }
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();
taskList.add(
new DatabaseTask(databaseCredentials, outputFile) {
@Override
public void onDone() {
executeNextTask();
}
});
} else {
System.err.println("username, password or database is empty.");
}
}
executeNextTask(); executeNextTask();
} }
@ -99,7 +70,7 @@ public class TaskBuilder {
if (nextTask != null) nextTask.start(); if (nextTask != null) nextTask.start();
else { else {
System.out.println("Backup completed!"); System.out.println("Backup completed!");
System.exit(0); System.out.println(0);
} }
} }
} }

View File

@ -2,20 +2,17 @@ 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.tasks.Task; import net.horizoncode.sysbackup.tasks.Task;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.progress.ProgressMonitor;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import java.io.*; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset; 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 {
@ -32,90 +29,24 @@ public class DatabaseTask extends Task {
@Override @Override
public void start() { public void start() {
try { try {
String commandArgs = String[] commandArgs =
"mysqldump -u " new String[] {
+ getDatabaseCredentials().username "mysqldump",
+ " -p" "-u " + getDatabaseCredentials().username,
+ new String(getDatabaseCredentials().password) "-p" + new String(getDatabaseCredentials().password),
+ " " getDatabaseCredentials().database
+ getDatabaseCredentials().database; };
Runtime runtime = Runtime.getRuntime(); Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(commandArgs); Process process = runtime.exec(commandArgs);
String databaseContent = ""; InputStream inputStream = process.getInputStream();
FileUtils.copyInputStreamToFile(
while (process.isAlive()) { inputStream,
try {
Thread.sleep(1000);
databaseContent =
new BufferedReader(
new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
} catch (InterruptedException e) {
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"));
System.out.println(text);
onDone();
return;
}
if (databaseContent.isEmpty()) {
System.err.println("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();
System.out.println("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...");
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) {
exception.printStackTrace();
FileUtils.deleteQuietly(outputSQLFile);
onDone();
}
progressMonitor.endProgressMonitor();
FileUtils.deleteQuietly(outputSQLFile);
onDone();
} catch (Exception ex) {
ex.printStackTrace();
onDone();
}
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -123,7 +54,7 @@ public class DatabaseTask extends Task {
} }
@Builder @Builder
public static class DatabaseCredentials { private 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;

View File

@ -41,6 +41,16 @@ public class FileSystemTask extends Task {
.getPool() .getPool()
.submit( .submit(
() -> { () -> {
int terminalWidth = -1;
try {
Terminal terminal = TerminalBuilder.terminal();
try (terminal) {
terminalWidth = terminal.getWidth();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
try (ZipFile zipFile = new ZipFile(outputZipFile)) { try (ZipFile zipFile = new ZipFile(outputZipFile)) {
System.out.println("Indexing files..."); System.out.println("Indexing files...");
ProgressMonitor progressMonitor = zipFile.getProgressMonitor(); ProgressMonitor progressMonitor = zipFile.getProgressMonitor();
@ -52,6 +62,8 @@ public class FileSystemTask extends Task {
.setInitialMax(progressMonitor.getTotalWork()) .setInitialMax(progressMonitor.getTotalWork())
.setTaskName("Adding Files..."); .setTaskName("Adding Files...");
if (terminalWidth != -1) pbb.setMaxRenderedLength(terminalWidth);
try (ProgressBar pb = pbb.build()) { try (ProgressBar pb = pbb.build()) {
while (!progressMonitor.getState().equals(ProgressMonitor.State.READY)) { while (!progressMonitor.getState().equals(ProgressMonitor.State.READY)) {
pb.stepTo(progressMonitor.getWorkCompleted()); pb.stepTo(progressMonitor.getWorkCompleted());

View File

@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: Bootstrapper

View File

@ -1,15 +1,16 @@
[general] [general]
dateFormat = "yyyy-MM-dd HH-mm-ss" dateFormat = "yyyy-MM-dd"
outputFile = "{date} - {taskName}"
[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}"