From 0e0d4d801b55c224b60fca5e62fd648206cdbf09 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Fri, 04 Jan 2019 23:55:22 +0000
Subject: [PATCH] Job monitor...
---
borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/UserUtils.java | 9 +++
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java | 2
borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ProgressMessage.java | 13 ++++
borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJobQueue.java | 2
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java | 8 ++
borgbutler-webapp/src/components/views/develop/RestServices.jsx | 6 ++
borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJob.java | 49 ++++++++++++++++
borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/JobsRest.java | 31 +++++-----
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java | 15 +++-
9 files changed, 110 insertions(+), 25 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 70d57ee..8fd89f3 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -128,7 +128,7 @@
.setRepoConfig(repoConfig)
.setCommand("info")
.setArchive(archive.getName())
- .setParams("--json", "--progress")
+ .setParams("--json", "--log-json", "--progress")
.setDescription("Loading info of archive '" + archive.getName() + "' of repo '" + repoConfig.getDisplayName() + "'.");
JobResult<String> jobResult = execute(command).getResult();
if (jobResult.getStatus() != JobResult.Status.OK) {
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 dac519a..0c3a8e9 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
@@ -47,6 +47,9 @@
@Override
protected CommandLine buildCommandLine() {
+ if (command == null) {
+ return null;
+ }
CommandLine commandLine = new CommandLine(ConfigurationHandler.getConfiguration().getBorgCommand());
commandLine.addArgument(command.getCommand());
if (command.getParams() != null) {
@@ -68,12 +71,10 @@
}
protected void processStdErrLine(String line, int level) {
- log.info(line);
try {
if (StringUtils.startsWith(line, "{\"message")) {
ProgressMessage message = JsonUtils.fromJson(ProgressMessage.class, line);
if (message != null) {
- log.info(JsonUtils.toJson(progressMessage));
progressMessage = message;
return;
}
@@ -114,6 +115,9 @@
clone.setStatus(getStatus());
clone.setWorkingDirectory(getWorkingDirectory());
clone.setDescription(getDescription());
+ if (progressMessage != null) {
+ clone.setProgressMessage(progressMessage.clone());
+ }
return clone;
}
}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
index 0929332..6e429bf 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
@@ -6,10 +6,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* A queue is important because Borg doesn't support parallel calls for one repository.
@@ -27,6 +24,16 @@
private Map<String, JobQueue<String>> queueMap = new HashMap<>();
/**
+ * @return A list of all repos with queues.
+ */
+ public List<String> getRepos() {
+ List<String> list = new ArrayList<>();
+ list.addAll(queueMap.keySet());
+ Collections.sort(list);
+ return list;
+ }
+
+ /**
* For displaying purposes.
*
* @param repo
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ProgressMessage.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ProgressMessage.java
index 98a4474..82bab1a 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ProgressMessage.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ProgressMessage.java
@@ -7,7 +7,7 @@
* Output of borg option <tt>--progress</tt>.
* See https://borgbackup.readthedocs.io/en/stable/internals/frontends.html,
*/
-public class ProgressMessage {
+public class ProgressMessage implements Cloneable {
// {"message": "Calculating statistics... 0%", "current": 1, "total": 2497, "info": null, "operation": 1, "msgid": null, "type": "progress_percent", "finished": false, "time": 1546640510.116256}
/**
* e. g. Calculating statistics... 5%
@@ -52,4 +52,15 @@
++current;
return this;
}
+
+ @Override
+ public ProgressMessage clone() {
+ ProgressMessage clone = null;
+ try {
+ clone = (ProgressMessage) super.clone();
+ } catch (CloneNotSupportedException ex) {
+ throw new UnsupportedOperationException(this.getClass().getCanonicalName() + " isn't cloneable: " + ex.getMessage(), ex);
+ }
+ return clone;
+ }
}
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 c6a1af6..b09f444 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
@@ -2,10 +2,9 @@
import de.micromata.borgbutler.BorgJob;
import de.micromata.borgbutler.BorgQueueExecutor;
-import de.micromata.borgbutler.data.Archive;
-import de.micromata.borgbutler.data.Repository;
import de.micromata.borgbutler.json.JsonUtils;
import de.micromata.borgbutler.server.rest.queue.JsonJob;
+import de.micromata.borgbutler.server.rest.queue.JsonJobQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,24 +24,24 @@
@Produces(MediaType.APPLICATION_JSON)
/**
*
- * @param repo Name of repository ({@link Repository#getName()}.
* @param prettyPrinter If true then the json output will be in pretty format.
- * @return Job queue as json string.
+ * @return Job queues as json string.
* @see JsonUtils#toJson(Object, boolean)
*/
- public String getJobs(@QueryParam("repo") String repoName,
- @QueryParam("prettyPrinter") boolean prettyPrinter) {
+ public String getJobs(@QueryParam("prettyPrinter") boolean prettyPrinter) {
BorgQueueExecutor borgQueueExecutor = BorgQueueExecutor.getInstance();
- List<BorgJob<?>> borgJobList = borgQueueExecutor.getJobListCopy(repoName);
- List<JsonJob> jobList = new ArrayList<>(borgJobList.size());
- for (BorgJob<?> borgJob : borgJobList) {
- JsonJob job = new JsonJob();
- job.setTitle(borgJob.getTitle());
- // job.setProgressText(borgJob.get);
- job.setStatus(borgJob.getStatus());
- job.setCancelledRequested(borgJob.isCancelledRequested());
+ List<JsonJobQueue> queueList = new ArrayList<>();
+ for (String repo : borgQueueExecutor.getRepos()) {
+ List<BorgJob<?>> borgJobList = borgQueueExecutor.getJobListCopy(repo);
+ JsonJobQueue queue = new JsonJobQueue()
+ .setRepo(repo);
+ queueList.add(queue);
+ queue.setJobs(new ArrayList<>(borgJobList.size()));
+ for (BorgJob<?> borgJob : borgJobList) {
+ JsonJob job = new JsonJob(borgJob);
+ queue.getJobs().add(job);
+ }
}
- Archive archive = null;
- return JsonUtils.toJson(archive, prettyPrinter);
+ return JsonUtils.toJson(queueList, prettyPrinter);
}
}
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 e316058..04ddda7 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,6 +1,9 @@
package de.micromata.borgbutler.server.rest.queue;
+import de.micromata.borgbutler.BorgJob;
import de.micromata.borgbutler.jobs.AbstractJob;
+import de.micromata.borgbutler.json.borg.ProgressMessage;
+import de.micromata.borgbutler.server.user.UserUtils;
import lombok.Getter;
import lombok.Setter;
@@ -15,6 +18,52 @@
@Setter
private String title;
@Getter
+ private String description;
+ @Getter
@Setter
private String progressText;
+ @Setter
+ @Getter
+ private ProgressMessage progressMessage;
+ @Getter
+ private String commandLineAsString;
+
+ public JsonJob() {
+ }
+
+ public JsonJob(BorgJob<?> borgJob) {
+ this.cancelledRequested = borgJob.isCancelledRequested();
+ this.status = borgJob.getStatus();
+ this.title = borgJob.getTitle();
+ ProgressMessage progressMessage = borgJob.getProgressMessage();
+ if (progressMessage != null) {
+ this.progressMessage = progressMessage;
+ this.progressText = progressMessageToString();
+ }
+ this.commandLineAsString = borgJob.getCommandLineAsString();
+ this.description = borgJob.getDescription();
+ }
+
+ public String progressMessageToString() {
+ if (progressMessage == null) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ if (progressMessage.getMessage()!= null) {
+ sb.append(progressMessage.getMessage());
+ }
+ if (progressMessage.getCurrent() > 0) {
+ sb.append(" (").append(UserUtils.formatNumber(progressMessage.getCurrent()));
+ if (progressMessage.getTotal() > 0) {
+ sb.append("/").append(UserUtils.formatNumber(progressMessage.getTotal()));
+ }
+ sb.append(")");
+ }
+ if (progressMessage.isFinished()) {
+ sb.append(" (finished)");
+ }
+ sb.append(".");
+ return sb.toString();
+ }
+
}
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJobQueue.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJobQueue.java
index 120f12f..c7adcde 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJobQueue.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/queue/JsonJobQueue.java
@@ -8,7 +8,7 @@
public class JsonJobQueue {
@Getter
@Setter
- private String title;
+ private String repo;
@Getter
@Setter
private List<JsonJob> jobs;
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/UserUtils.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/UserUtils.java
index 17e5115..17987b1 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/UserUtils.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/UserUtils.java
@@ -1,5 +1,6 @@
package de.micromata.borgbutler.server.user;
+import java.text.NumberFormat;
import java.util.Locale;
public class UserUtils {
@@ -25,6 +26,9 @@
if (locale == null) {
locale = userInfo.requestLocale;
}
+ if (locale == null) {
+ locale = Locale.getDefault();
+ }
return locale;
}
@@ -50,4 +54,9 @@
this.requestLocale = requestLocale;
}
}
+
+ public static String formatNumber(long number) {
+ NumberFormat numberFormat = NumberFormat.getInstance(getUserLocale());
+ return numberFormat.format(number);
+ }
}
diff --git a/borgbutler-webapp/src/components/views/develop/RestServices.jsx b/borgbutler-webapp/src/components/views/develop/RestServices.jsx
index 85cb313..5c56783 100644
--- a/borgbutler-webapp/src/components/views/develop/RestServices.jsx
+++ b/borgbutler-webapp/src/components/views/develop/RestServices.jsx
@@ -36,6 +36,12 @@
<li><RestUrlLink service='repos/list'/></li>
</ul>
<h3>
+ Job monitor
+ </h3>
+ <ul>
+ <li><RestUrlLink service='jobs'/></li>
+ </ul>
+ <h3>
Config
</h3>
<ul>
--
Gitblit v1.10.0