From 6ceec34553ee263b554b13ee64a1dfe0bb083403 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 13 Jan 2019 22:37:22 +0000
Subject: [PATCH] Demo mode...
---
borgbutler-core/demo/createFiles.sh | 70 ++++++++++++++
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommand.java | 2
borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java | 9 -
borgbutler-core/src/main/java/de/micromata/borgbutler/demo/DemoRepos.java | 111 ++++++++++++++++++++++
borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java | 5 +
borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx | 10 +
borgbutler-core/README.adoc | 16 +++
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java | 10 ++
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java | 7 +
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobResult.java | 2
borgbutler-core/src/main/resources/demodata/repo-list.json.gz | 0
borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java | 2
12 files changed, 232 insertions(+), 12 deletions(-)
diff --git a/borgbutler-core/README.adoc b/borgbutler-core/README.adoc
new file mode 100644
index 0000000..8589582
--- /dev/null
+++ b/borgbutler-core/README.adoc
@@ -0,0 +1,16 @@
+Micromata BorgBackup-Butler
+===========================
+Micromata GmbH, Kai Reinhard
+:toc:
+:toclevels: 4
+
+Copyright (C) 2019
+
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+== Development
+=== Creating test data
+1. Install virtual debian system
+2. `apt install net-tools curl`
+3. Execute script `./createFiles.sh` on debian host (borg is installed automatically)
+4. See the result files in `out.tar`.
\ No newline at end of file
diff --git a/borgbutler-core/demo/createFiles.sh b/borgbutler-core/demo/createFiles.sh
new file mode 100755
index 0000000..c61a2b9
--- /dev/null
+++ b/borgbutler-core/demo/createFiles.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE='borgbutler123'
+export BORG_COMMAND='/root/bin/borg-linux64.dms'
+export TEST_DIR='/root/borgbutler-demo'
+
+if [ -f $BORG_COMMAND ]; then
+ echo Borg command already exists...
+else
+ echo Downloading borg;
+ mkdir /root/bin
+ cd /root/bin
+ curl -L https://sourceforge.net/projects/borgbutler/files/borg-binaries/borg-linux64.dms/download >$BORG_COMMAND
+ chmod 700 $BORG_COMMAND
+fi;
+
+echo Creating backup dir /backup-test...
+rm -rf /backup-test
+mkdir /backup-test
+
+echo Initializing borg backup...
+$BORG_COMMAND init --encryption=repokey /backup-test
+
+function backup() {
+echo Creating backup...
+$BORG_COMMAND create --filter AME \
+ --stats \
+ --progress \
+ --show-rc \
+ --compression lz4 \
+ --exclude-caches \
+ /backup-test::borgbutlerdemo-$1 \
+ /home /root /etc /usr/bin /usr/sbin /opt
+}
+
+rm -rf $TEST_DIR
+mkdir $TEST_DIR
+cd $TEST_DIR
+touch README.txt
+chmod 700 README.txt
+echo `ls /usr` > filelist
+touch oldfile
+
+backup 2019-01-12_01-00
+
+rm oldfile
+mkdir newDir
+touch newDir/newfile
+chown borgbutler.users README.txt
+chmod 755 README.txt
+echo `ls /` >> filelist
+
+backup 2019-01-13_01-00
+
+cd /root
+rm -rf out
+mkdir out
+cd out
+$BORG_COMMAND info --json /backup-test >repo-info.json
+$BORG_COMMAND list --json /backup-test >repo-list.json
+
+$BORG_COMMAND info --json /backup-test::borgbutlerdemo-2019-01-12_01-00 >archive-info-borgbuterldemo-2019-01-12_01-00.json
+$BORG_COMMAND info --json /backup-test::borgbutlerdemo-2019-01-13_01-00 >archive-info-borgbuterldemo-2019-01-13_01-00.json
+
+$BORG_COMMAND list --json-lines /backup-test::borgbutlerdemo-2019-01-12_01-00 >archive-list-borgbuterldemo-2019-01-12_01-00.json
+$BORG_COMMAND list --json-lines /backup-test::borgbutlerdemo-2019-01-13_01-00 >archive-list-borgbuterldemo-2019-01-13_01-00.json
+
+gzip -9 *
+tar cvf out.tar out
+
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommand.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommand.java
index 7198ef7..4ddc54d 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommand.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommand.java
@@ -55,7 +55,7 @@
return this;
}
- String getRepoArchive() {
+ public String getRepoArchive() {
if (archive == null) {
if (repoConfig == null) {
return null;
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
index 38d496a..bf3e585 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
@@ -3,7 +3,9 @@
import de.micromata.borgbutler.config.BorgRepoConfig;
import de.micromata.borgbutler.config.ConfigurationHandler;
import de.micromata.borgbutler.data.Archive;
+import de.micromata.borgbutler.demo.DemoRepos;
import de.micromata.borgbutler.jobs.AbstractCommandLineJob;
+import de.micromata.borgbutler.jobs.JobResult;
import de.micromata.borgbutler.json.JsonUtils;
import de.micromata.borgbutler.json.borg.ProgressInfo;
import lombok.AccessLevel;
@@ -103,6 +105,14 @@
}
@Override
+ public JobResult<String> execute() {
+ if (DemoRepos.isDemo(command.getRepoConfig().getId())) {
+ return DemoRepos.execute(command);
+ }
+ return super.execute();
+ }
+
+ @Override
public BorgJob<?> clone() {
BorgJob<?> clone = new BorgJob<>();
if (command != null) {
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
index 2c45d9c..0bdb267 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -8,6 +8,7 @@
import de.micromata.borgbutler.data.ArchiveShortInfo;
import de.micromata.borgbutler.data.FileSystemFilter;
import de.micromata.borgbutler.data.Repository;
+import de.micromata.borgbutler.demo.DemoRepos;
import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.jcs.JCS;
@@ -59,6 +60,9 @@
}
}
}
+ if (DemoRepos.isDemo(idOrName)) {
+ return DemoRepos.getRepo(idOrName);
+ }
log.warn("Repo with id or name '" + idOrName + "' not found.");
return null;
}
@@ -143,6 +147,9 @@
return repository;
}
BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(repository.getName());
+ if (repoConfig == null && DemoRepos.isDemo(idOrName)) {
+ repoConfig = DemoRepos.getRepoConfig(idOrName);
+ }
BorgCommands.list(repoConfig, repository);
updateArchivesCacheStatusAndShortInfos(repository);
return repository;
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
index 28af84c..c52ae85 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
@@ -32,6 +32,10 @@
@Getter
private int maxArchiveContentCacheCapacityMb = 100;
+ @Getter
+ @Setter
+ private boolean showDemoRepos = true;
+
/**
* Default is restore inside BorgButler's home dir (~/.borgbutler/restore).
*/
@@ -77,5 +81,6 @@
public void copyFrom(Configuration other) {
this.borgCommand = other.borgCommand;
this.maxArchiveContentCacheCapacityMb = other.maxArchiveContentCacheCapacityMb;
+ this.showDemoRepos = other.showDemoRepos;
}
}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/demo/DemoRepos.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/demo/DemoRepos.java
new file mode 100644
index 0000000..9d14cf4
--- /dev/null
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/demo/DemoRepos.java
@@ -0,0 +1,111 @@
+package de.micromata.borgbutler.demo;
+
+import de.micromata.borgbutler.BorgCommand;
+import de.micromata.borgbutler.config.BorgRepoConfig;
+import de.micromata.borgbutler.config.ConfigurationHandler;
+import de.micromata.borgbutler.config.Definitions;
+import de.micromata.borgbutler.data.Repository;
+import de.micromata.borgbutler.jobs.JobResult;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DemoRepos {
+ private static Logger log = LoggerFactory.getLogger(DemoRepos.class);
+ private static final String DEMO_IDENTIFIER = "borgbutler-demo";
+
+ private static final String[] REPOS = {"fast", "slow", "very-slow"};
+ private static List<Repository> demoRepos;
+
+ /**
+ * If configured by the user, demo repositories are added to the given list. If not configured this method does nothing.
+ *
+ * @param repositoryList
+ */
+ public static void addDemoRepos(List<Repository> repositoryList) {
+ if (!ConfigurationHandler.getConfiguration().isShowDemoRepos()) {
+ return;
+ }
+ init();
+ for (Repository repo : demoRepos) {
+ repositoryList.add(repo);
+ }
+ }
+
+ public static boolean isDemo(String idOrName) {
+ return StringUtils.startsWith(idOrName, DEMO_IDENTIFIER);
+ }
+
+ public static Repository getRepo(String idOrName) {
+ if (!isDemo(idOrName)) {
+ log.info("Given idOrName doesn't fit any demo repository: " + idOrName);
+ return null;
+ }
+ init();
+ for (Repository repo : demoRepos) {
+ if (StringUtils.equals(idOrName, repo.getId())) {
+ return repo;
+ }
+ }
+ return null;
+ }
+
+ public static BorgRepoConfig getRepoConfig(String idOrName) {
+ BorgRepoConfig repoConfig = new BorgRepoConfig();
+ Repository repository = getRepo(idOrName);
+ if (repository == null) {
+ log.info("Given idOrName doesn't fit any demo repository: " + idOrName);
+ return null;
+ }
+ repoConfig.setRepo(repository.getName())
+ .setId(repository.getId())
+ .setDisplayName(repository.getName());
+ return repoConfig;
+ }
+
+ public static JobResult<String> execute(BorgCommand command) {
+ StringBuilder sb = new StringBuilder();
+ if (command.getArchive() != null) {
+ sb.append("archive-");
+ } else {
+ sb.append("repo-");
+ }
+ sb.append(command.getCommand());
+ if (command.getArchive() != null) {
+ sb.append("-").append(command.getArchive());
+ }
+ sb.append(".json.gz");
+ String file = sb.toString();
+ try (InputStream inputStream = new GzipCompressorInputStream(DemoRepos.class.getResourceAsStream("/demodata/" + file))) {
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(inputStream, writer, Definitions.STD_CHARSET);
+ return new JobResult<String>().setResultObject(writer.toString()).setStatus(JobResult.Status.OK);
+ } catch (IOException ex) {
+ log.error("Error while reading demo file '" + file + "': " + ex.getMessage() + ".");
+ return null;
+ }
+ }
+
+ private static void init() {
+ demoRepos = new ArrayList<>();
+ demoRepos.add(new Repository()
+ .setId(DEMO_IDENTIFIER + "-fast")
+ .setName(DEMO_IDENTIFIER + "-fast")
+ .setDisplayName("Demo repository fast"));
+ demoRepos.add(new Repository()
+ .setId(DEMO_IDENTIFIER + "-slow")
+ .setName(DEMO_IDENTIFIER + "-slow")
+ .setDisplayName("Demo repository slow"));
+ demoRepos.add(new Repository()
+ .setId(DEMO_IDENTIFIER + "-very-slow")
+ .setName(DEMO_IDENTIFIER + "-very-slow")
+ .setDisplayName("Demo repository very-slow"));
+
+ }
+}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobResult.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobResult.java
index f57bd9b..809e52f 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobResult.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobResult.java
@@ -7,7 +7,7 @@
public class JobResult<T> {
public enum Status {OK, ERROR}
@Getter
- @Setter(AccessLevel.PACKAGE)
+ @Setter
private Status status;
@Getter
@Setter
diff --git a/borgbutler-core/src/main/resources/demodata/repo-list.json.gz b/borgbutler-core/src/main/resources/demodata/repo-list.json.gz
new file mode 100644
index 0000000..c60b152
--- /dev/null
+++ b/borgbutler-core/src/main/resources/demodata/repo-list.json.gz
Binary files differ
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
index d3f0ad8..ce67240 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
@@ -1,12 +1,9 @@
package de.micromata.borgbutler.server;
-import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.micromata.borgbutler.cache.ButlerCache;
import de.micromata.borgbutler.config.Configuration;
import de.micromata.borgbutler.config.ConfigurationHandler;
-import lombok.Getter;
-import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,16 +12,11 @@
private static Logger log = LoggerFactory.getLogger(ServerConfiguration.class);
private final static String[] SUPPORTED_LANGUAGES = {"en", "de"};
public static final int WEBSERVER_PORT_DEFAULT = 9042;
- private static final boolean SHOW_TEST_DATA_PREF_DEFAULT = false;
private static final boolean WEB_DEVELOPMENT_MODE_PREF_DEFAULT = false;
private static String applicationHome;
private int port = WEBSERVER_PORT_DEFAULT;
- @Getter
- @Setter
- @JsonIgnore
- private boolean showTestData = SHOW_TEST_DATA_PREF_DEFAULT;
private boolean webDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT;
@JsonProperty
public String getCacheDir() {
@@ -72,7 +64,6 @@
public void copyFrom(ServerConfiguration other) {
super.copyFrom(other);
this.port = other.port;
- this.showTestData = other.showTestData;
this.webDevelopmentMode = other.webDevelopmentMode;
}
}
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
index 3152f1c..d94bf2a 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
@@ -4,6 +4,7 @@
import de.micromata.borgbutler.data.Repository;
import de.micromata.borgbutler.json.JsonUtils;
import de.micromata.borgbutler.json.borg.BorgRepository;
+import de.micromata.borgbutler.demo.DemoRepos;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,6 +31,7 @@
*/
public String getList(@QueryParam("prettyPrinter") boolean prettyPrinter) {
List<Repository> repositories = ButlerCache.getInstance().getAllRepositories();
+ DemoRepos.addDemoRepos(repositories);
if (CollectionUtils.isEmpty(repositories)) {
return "[]";
}
diff --git a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
index 827a47c..84f0e2d 100644
--- a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
+++ b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
@@ -45,6 +45,7 @@
failed: false,
port: 9042,
webdevelopmentMode: false,
+ showDemoRepos: true,
maxArchiveContentCacheCapacityMb: 100,
redirect: false,
confirmModal: false
@@ -73,7 +74,8 @@
var config = {
port: this.state.port,
maxArchiveContentCacheCapacityMb : this.state.maxArchiveContentCacheCapacityMb,
- webDevelopmentMode: this.state.webDevelopmentMode
+ webDevelopmentMode: this.state.webDevelopmentMode,
+ showDemoRepos: this.state.showDemoRepos
};
return fetch(getRestServiceUrl("configuration/config"), {
method: 'POST',
@@ -140,6 +142,12 @@
onChange={this.handleTextChange}
placeholder="Enter maximum Capacity"
hint={`Limits the cache size of archive file lists in the local cache directory: ${this.state.cacheDir}`} />
+ <FormLabelField label={'Show demo repositories'} fieldLength={2}>
+ <FormCheckbox checked={this.state.showDemoRepos}
+ hint={'If true, some demo repositories are shown for testing the functionality of BorgButler without any further configuration and running borg backups.'}
+ name="showDemoRepos"
+ onChange={this.handleCheckboxChange} />
+ </FormLabelField>
<FormLabelField label={<I18n name={'configuration.webDevelopmentMode'} />} fieldLength={2}>
<FormCheckbox checked={this.state.webDevelopmentMode}
hintKey={'configuration.webDevelopmentMode.hint'}
--
Gitblit v1.10.0