From e70f062550b0c611f076aa784f284a27e0ffe715 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 14:15:43 +0000
Subject: [PATCH] Job monitor...

---
 borgbutler-webapp/src/components/views/jobs/Job.jsx                                    |   12 ++++--
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java                |    8 +++-
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java |   28 +++++++++++++
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java      |   49 +++++++++++-------------
 4 files changed, 64 insertions(+), 33 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
index 72f2aee..7f0a706 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -174,14 +174,18 @@
         // The returned job might be an already queued or running one!
         final ProgressInfo progressInfo = new ProgressInfo()
                 .setMessage("Getting file list...")
-                .setCurrent(0);
+                .setCurrent(0)
+                .setTotal(archive.getStats().getNfiles());
         BorgJob<List<BorgFilesystemItem>> job = BorgQueueExecutor.getInstance().execute(new BorgJob<List<BorgFilesystemItem>>(command) {
             @Override
             protected void processStdOutLine(String line, int level) {
                 BorgFilesystemItem item = JsonUtils.fromJson(BorgFilesystemItem.class, line);
                 item.setMtime(DateUtils.format(item.getMtime()));
                 payload.add(item);
-                setProgressInfo(progressInfo.incrementCurrent());
+                if ("-".equals(item.getType())) {
+                    // Only increment for files, because number of files is the total.
+                    setProgressInfo(progressInfo.incrementCurrent());
+                }
             }
         });
         job.payload = new ArrayList<>();
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
index 3555258..017711f 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java
@@ -63,34 +63,27 @@
         if (testList == null) {
             testList = new ArrayList<>();
             JsonJobQueue queue = new JsonJobQueue().setRepo("My Computer");
-            addTestJob(queue, "Calculating statistics... ",
-                    "Loading info of archive 'my-computer-2018-12-05T23:10:33' of repo 'My-Computer-Cloud'.", 0, 1000);
-            addTestJob(queue, null,
-                    "Loading list of files of archive 'my-computer-2018-12-05T23:10:33' of repo 'My-Computer-Cloud'.", 0, 0);
+            addTestJob(queue, "info", "my-macbook", 0, 2342);
+            addTestJob(queue, "list", "my-macbook", -1, -1);
             testList.add(queue);
 
             queue = new JsonJobQueue().setRepo("My Server");
-            addTestJob(queue, "Getting file list...",
-                    "Loading list of files of archive 'my-server-2018-12-05T23:10:33' of repo 'My-Server-Cloud'.", 0, 0);
-            addTestJob(queue, null,
-                    "Loading info of archive 'my-server-2018-12-05T23:10:33' of repo 'My-Server-Cloud'.", 0, 1000);
+            addTestJob(queue, "list", "my-server", 0, 1135821);
+            addTestJob(queue, "info", "my-server", -1, -1);
             testList.add(queue);
         } else {
             for (JsonJobQueue jobQueue : testList) {
                 for (JsonJob job : jobQueue.getJobs()) {
                     if (job.getStatus() != AbstractJob.Status.RUNNING) continue;
+                    long current = job.getProgressInfo().getCurrent();
+                    long total = job.getProgressInfo().getTotal();
+                    current += Math.random() * total / 30;
+                    if (current > total) {
+                        current = 0; // Reset to beginning.
+                    }
+                    job.getProgressInfo().setCurrent(current);
                     if (job.getProgressText().startsWith("Calculating")) {
-                        long current = job.getProgressInfo().getCurrent();
-                        current += Math.random() * 100;
-                        if (current > 1000) {
-                            current = 0; // Reset to beginning.
-                        }
-                        job.getProgressInfo().setCurrent(current);
-                        job.getProgressInfo().setMessage("Calculating statistics...  " + Math.round(current / 10) + "%");
-                    } else {
-                        long current = job.getProgressInfo().getCurrent();
-                        current += Math.random() * 10000;
-                        job.getProgressInfo().setCurrent(current);
+                        job.getProgressInfo().setMessage("Calculating statistics...  " + Math.round(100 * current / total) + "%");
                     }
                     job.buildProgressText();
                 }
@@ -100,20 +93,24 @@
     }
 
 
-    private JsonJob addTestJob(JsonJobQueue queue, String message, String description, long current, long total) {
+    private JsonJob addTestJob(JsonJobQueue queue, String operation, String host, long current, long total) {
         ProgressInfo msg = new ProgressInfo()
-                .setMessage(message)
                 .setCurrent(current)
                 .setTotal(total);
         JsonJob job = new JsonJob()
                 .setProgressInfo(msg)
-                .setDescription(description)
-                .setStatus(AbstractJob.Status.QUEUED)
-                .setCommandLineAsString("borg info --json --log-json --progress ssh://...:23/./backups/my-computer::my-computer-2018-12-05T23:10:33");
+                .setStatus(AbstractJob.Status.QUEUED);
+        if ("info".equals(operation)) {
+            msg.setMessage("Calculating statistics... ");
+            job.setDescription("Loading info of archive '" + host + "-2018-12-05T23:10:33' of repo '" + queue.getRepo() + "'.")
+                    .setCommandLineAsString("borg info --json --log-json --progress ssh://...:23/./backups/" + host + "::" + host + "-2018-12-05T23:10:33");
+        } else {
+            msg.setMessage("Getting file list... ");
+            job.setCommandLineAsString("borg list --json-lines ssh://...:23/./backups/" + host + "::" + host + "-2018-12-05T17:30:38");
+        }
         job.buildProgressText();
-        if (message != null) {
+        if (current >= 0) {
             job.setStatus(AbstractJob.Status.RUNNING);
-
         } else {
             job.setStatus(AbstractJob.Status.QUEUED);
         }
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java
index 596e3b6..8430945 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java
@@ -1,11 +1,13 @@
 package de.micromata.borgbutler.server.rest.queue;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import de.micromata.borgbutler.BorgJob;
 import de.micromata.borgbutler.jobs.AbstractJob;
 import de.micromata.borgbutler.json.borg.ProgressInfo;
 import de.micromata.borgbutler.server.user.UserUtils;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 
 public class JsonJob {
     @Getter
@@ -48,6 +50,7 @@
 
     /**
      * Builds and sets progressText from the progressInfo object if given.
+     *
      * @return progressText
      */
     public String buildProgressText() {
@@ -59,6 +62,13 @@
             sb.append(progressInfo.getMessage());
         }
         if (progressInfo.getCurrent() > 0) {
+            if (StringUtils.indexOf(progressInfo.getMessage(), '%') < 0) {
+                // No percentage given by borg, try to create an own one:
+                short percentage = getProgressPercent();
+                if (percentage >= 0) {
+                    sb.append(" ").append(percentage).append("%");
+                }
+            }
             sb.append(" (").append(UserUtils.formatNumber(progressInfo.getCurrent()));
             if (progressInfo.getTotal() > 0) {
                 sb.append("/").append(UserUtils.formatNumber(progressInfo.getTotal()));
@@ -68,9 +78,25 @@
         if (progressInfo.isFinished()) {
             sb.append(" (finished)");
         }
-        sb.append(".");
         progressText = sb.toString();
         return progressText;
     }
 
+    /**
+     * If current and total of {@link ProgressInfo} is available, this value is given, otherwise this value is -1.
+     */
+    @JsonProperty
+    public short getProgressPercent() {
+        if (progressInfo == null || progressInfo.getTotal() <= 0) {
+            return -1;
+        }
+        long value = 100 * progressInfo.getCurrent() / progressInfo.getTotal();
+        if (value < 0) {
+            return 0;
+        }
+        if (value >= 100) {
+            return 100;
+        }
+        return (short) value;
+    }
 }
diff --git a/borgbutler-webapp/src/components/views/jobs/Job.jsx b/borgbutler-webapp/src/components/views/jobs/Job.jsx
index 5fac658..4b3ba06 100644
--- a/borgbutler-webapp/src/components/views/jobs/Job.jsx
+++ b/borgbutler-webapp/src/components/views/jobs/Job.jsx
@@ -17,9 +17,13 @@
         let content = undefined;
         let job = this.props.job;
         if (job.status === 'RUNNING') {
-            content = <Progress animated color={'success'} value="100">{job.progressText}</Progress>;
+            let progressPercent = 100;
+            if (job.progressPercent >= 0 && job.progressPercent <= 100) {
+                progressPercent = job.progressPercent;
+            }
+            content = <Progress animated color={'success'} value={progressPercent}>{job.progressText}</Progress>;
         } else {
-            content = <Progress color={'info'} value="100">{job.status}</Progress>
+            content = <Progress color={'info'} value={100}>{job.status}</Progress>
         }
         return (
             <div>
@@ -28,8 +32,8 @@
                 <Collapse isOpen={this.state.collapse}>
                     <Card>
                         <CardBody>
-                            <table><tr><th>Status</th><td>{job.status}</td></tr>
-                            <tr><th>Command line</th><td>{job.commandLineAsString}</td></tr></table>
+                            <table><tbody><tr><th>Status</th><td>{job.status}</td></tr>
+                            <tr><th>Command line</th><td>{job.commandLineAsString}</td></tr></tbody></table>
                         </CardBody>
                     </Card>
                 </Collapse>

--
Gitblit v1.10.0