From 746d3376c6b11a2202d3c19745bc45ea76c20a94 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Tue, 15 Jan 2019 07:35:33 +0000
Subject: [PATCH] Auto-install borg...

---
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java  |    4 ++
 borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java          |   24 +-----------
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java     |   30 ++++++--------
 borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx                 |   10 ++--
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgVersion.java          |   35 +++++++++++++++++
 borgbutler-server/src/test/java/de/micromata/borgbutler/server/BorgInstallationTest.java |    4 +-
 6 files changed, 61 insertions(+), 46 deletions(-)

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 847660b..69629b8 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
@@ -21,36 +21,16 @@
      */
     private static final String RESTORE_DIRNAME = "restore";
 
-    @Getter
-    private String binariesDownloadVersion = "1.1.8";
-    @Getter
-    private String binariesDownloadUrl = "https://github.com/borgbackup/borg/releases/download/" + binariesDownloadVersion + "/";
-    @Getter
-    private String[][] borgBinaries = {
-            {"freebsd64", "FreeBSD 64"},
-            {"linux32", "Linux 32"},
-            {"linux64", "Linux 64"},
-            {"macosx64", "MacOS X 64"}};
-
-    @Getter
-    private String minimumRequiredBorgVersion = "1.1.8";
-
     @JsonIgnore
     @Setter(AccessLevel.PACKAGE)
     private File workingDir;
-
-    /**
-     * One of the values "macosx64", "linux64" etc. for using a binary provided by BorgButler or null / "manual" for
-     * using a manual installed borg version.
-     */
-    @Getter
-    private String borgBinary;
     /**
      * The path of the borg command to use.
      */
     @Getter
     @Setter
-    private String borgCommand = "borg";
+    private String borgCommand;
+
     /**
      * Default is 100 MB (approximately).
      */
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
index b8641c1..e76a972 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
@@ -41,35 +41,31 @@
         if (version(configuration)) {
             return;
         }
-        log.warn("No working borg version found. Please configure a borg version with minimal version '" + configuration.getMinimumRequiredBorgVersion() + "'.");
+        log.warn("No working borg version found. Please configure a borg version with minimal version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
     }
 
     /**
-     *
      * @return a clone of this.borgVersion.
      */
     public BorgVersion getVersion() {
-        return new BorgVersion()
-                .setVersion(borgVersion.getVersion())
-                .setVersionOK(borgVersion.isVersionOK());
+        return new BorgVersion().copyFrom(borgVersion);
     }
 
     private boolean version(Configuration configuration) {
         String versionString = BorgCommands.version();
+        boolean versionOK = false;
         if (versionString != null) {
-            if (versionString.compareTo(configuration.getMinimumRequiredBorgVersion()) < 0) {
-                log.info("Found borg version '" + versionString + "' is less than minimum required version '" + configuration.getMinimumRequiredBorgVersion() + "'.");
-                borgVersion.setVersionOK(false);
+            int cmp = versionString.compareTo(borgVersion.getMinimumRequiredBorgVersion());
+            if (cmp < 0) {
+                log.info("Found borg version '" + versionString + "' is less than minimum required version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
             } else {
-                log.info("Found borg '" + configuration.getBorgCommand() + "', version: " + versionString + " (newer than '" + configuration.getMinimumRequiredBorgVersion()
+                versionOK = true;
+                log.info("Found borg '" + configuration.getBorgCommand() + "', version: " + versionString + " (equals to or newer than '" + borgVersion.getMinimumRequiredBorgVersion()
                         + "', OK).");
-                borgVersion.setVersionOK(true);
             }
-        } else {
-            borgVersion.setVersionOK(false);
-            return false;
         }
-        return true;
+        borgVersion.setVersionOK(versionOK);
+        return versionOK;
     }
 
     private String[] getBinary(RunningMode.OSType osType) {
@@ -88,7 +84,7 @@
         if (os == null) {
             return null;
         }
-        for (String[] binary : ConfigurationHandler.getConfiguration().getBorgBinaries()) {
+        for (String[] binary : borgVersion.getBorgBinaries()) {
             if (binary[0].contains(os)) {
                 return binary;
             }
@@ -111,7 +107,7 @@
             // File already downloaded, nothing to do.
             return file;
         }
-        String url = ConfigurationHandler.getConfiguration().getBinariesDownloadUrl() + getDownloadFilename(binary);
+        String url = borgVersion.getBinariesDownloadUrl() + getDownloadFilename(binary);
         log.info("Trying to download borg binary '" + binary[0] + "' (" + binary[1] + ") from url: " + url + "...");
         HttpClientBuilder builder = HttpClients.custom()
                 .setDefaultRequestConfig(RequestConfig.custom()
@@ -141,7 +137,7 @@
             log.info("Creating binary directory: " + dir.getAbsolutePath());
             dir.mkdirs();
         }
-        return new File(dir, getDownloadFilename(binary) + "-" + ConfigurationHandler.getConfiguration().getBinariesDownloadVersion());
+        return new File(dir, getDownloadFilename(binary) + "-" + borgVersion.getBinariesDownloadVersion());
     }
 
     private String getDownloadFilename(String[] binary) {
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgVersion.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgVersion.java
index 629ee82..318d0a7 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgVersion.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgVersion.java
@@ -6,9 +6,44 @@
 
 public class BorgVersion {
     @Getter
+    private String binariesDownloadVersion = "1.1.8";
+    @Getter
+    private String binariesDownloadUrl = "https://github.com/borgbackup/borg/releases/download/" + binariesDownloadVersion + "/";
+    @Getter
+    private String[][] borgBinaries = {
+            {"freebsd64", "FreeBSD 64"},
+            {"linux32", "Linux 32"},
+            {"linux64", "Linux 64"},
+            {"macosx64", "MacOS X 64"}};
+
+    @Getter
+    private String minimumRequiredBorgVersion = "1.1.8";
+
+    /**
+     * One of the values "macosx64", "linux64" etc. for using a binary provided by BorgButler or null / "manual" for
+     * using a manual installed borg version.
+     */
+    @Getter
+    private String borgBinary;
+    /**
+     * The path of the borg command to use.
+     */
+    @Getter
+    @Setter
+    private String borgCommand;
+
+    @Getter
     @Setter(AccessLevel.PACKAGE)
     private boolean versionOK = false;
     @Getter
     @Setter(AccessLevel.PACKAGE)
     private String version;
+
+    public BorgVersion copyFrom(BorgVersion other) {
+        this.borgCommand = other.borgCommand;
+        this.borgBinary = other.borgBinary;
+        this.versionOK = other.versionOK;
+        this.version = other.version;
+        return this;
+    }
 }
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 ce67240..78dffe1 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
@@ -4,6 +4,7 @@
 import de.micromata.borgbutler.cache.ButlerCache;
 import de.micromata.borgbutler.config.Configuration;
 import de.micromata.borgbutler.config.ConfigurationHandler;
+import lombok.Getter;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,6 +19,8 @@
 
     private int port = WEBSERVER_PORT_DEFAULT;
     private boolean webDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT;
+    @Getter
+    private BorgVersion borgVersion = new BorgVersion();
     @JsonProperty
     public String getCacheDir() {
         return ButlerCache.getInstance().getCacheDir().getAbsolutePath();
@@ -65,5 +68,6 @@
         super.copyFrom(other);
         this.port = other.port;
         this.webDevelopmentMode = other.webDevelopmentMode;
+        this.borgVersion.copyFrom(other.borgVersion);
     }
 }
diff --git a/borgbutler-server/src/test/java/de/micromata/borgbutler/server/BorgInstallationTest.java b/borgbutler-server/src/test/java/de/micromata/borgbutler/server/BorgInstallationTest.java
index e454387..dc97e98 100644
--- a/borgbutler-server/src/test/java/de/micromata/borgbutler/server/BorgInstallationTest.java
+++ b/borgbutler-server/src/test/java/de/micromata/borgbutler/server/BorgInstallationTest.java
@@ -14,7 +14,7 @@
 
     @Test
     void foo() throws Exception {
-        ConfigurationHandler.getConfiguration().setBorgCommand("hurzel");
+        ConfigurationHandler.getConfiguration().setBorgCommand(null);
         BorgInstallation borgInstallation = BorgInstallation.getInstance();
         borgInstallation.initialize();
         ConfigurationHandler.getConfiguration().setBorgCommand("borg");
@@ -23,7 +23,7 @@
 
     @Test
     void downloadTest() {
-        String version = ConfigurationHandler.getConfiguration().getBinariesDownloadVersion();
+        String version = new BorgVersion().getBinariesDownloadVersion();
         checkDownload(RunningMode.OSType.LINUX, "borg-linux64-" + version);
         checkDownload(RunningMode.OSType.MAC_OS, "borg-macosx64-" + version);
         checkDownload(RunningMode.OSType.FREEBSD, "borg-freebsd64-" + version);
diff --git a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
index b38500e..ef49de8 100644
--- a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
+++ b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
@@ -58,7 +58,7 @@
             showDemoRepos: true,
             maxArchiveContentCacheCapacityMb: 100,
             redirect: false,
-            binary: 'manual'
+            borgVersion: null
         };
 
         this.handleTextChange = this.handleTextChange.bind(this);
@@ -113,7 +113,7 @@
         if (this.state.failed) {
             return <ErrorAlertGenericRestFailure handleClick={this.loadConfig}/>;
         }
-
+        const borgVersion = this.state.borgVersion;
         return (
             <div>
                 <form>
@@ -121,12 +121,12 @@
                         <FormLabel>{'Borg command'}</FormLabel>
                         <FormField length={2}>
                             <FormSelect
-                                value={this.state.binary}
+                                value={borgVersion.binary}
                                 name={'binary'}
                                 onChange={this.handleTextChange}
-                                hint={`Choose your OS and BorgButler will download and use a ready to run borg binary from ${this.state.binariesDownloadUrl} or choose a manual installed version.`}
+                                hint={`Choose your OS and BorgButler will download and use a ready to run borg binary from ${borgVersion.binariesDownloadUrl} or choose a manual installed version.`}
                             >
-                                {this.state.borgBinaries
+                                {borgVersion.borgBinaries
                                     .map((binary, index) => <FormOption label={binary[1]} value={binary[0]}
                                                                         key={index}/>)}
                                 <FormOption label={'Manual'} value={'manual'}/>

--
Gitblit v1.10.0