borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -83,7 +83,8 @@ .setStart(DateUtils.format(borgArchive.getStart())) .setTime(DateUtils.format(borgArchive.getTime())) .setRepoId(repository.getId()) .setRepoName(repository.getName()); .setRepoName(repository.getName()) .setRepoDisplayName(repoConfig.getDisplayName()); repository.add(archive); } } @@ -119,13 +120,18 @@ if (archiveInfo.getArchives().size() > 1) { log.warn("Archive '" + archiveFullname + "' contains more than one archives!? (Using only first.)"); } BorgArchive2 borgArchive2 = archiveInfo.getArchives().get(0); archive.setStart(DateUtils.format(borgArchive2.getStart())) .setChunkerParams(borgArchive2.getChunkerParams()) .setCommandLine(borgArchive2.getCommandLine()) .setComment(borgArchive2.getComment()) .setStats(borgArchive2.getStats()) .setUsername(borgArchive2.getUsername()); BorgArchive2 borgArchive = archiveInfo.getArchives().get(0); archive.setStart(DateUtils.format(borgArchive.getStart())) .setChunkerParams(borgArchive.getChunkerParams()) .setCommandLine(borgArchive.getCommandLine()) .setComment(borgArchive.getComment()) .setStats(borgArchive.getStats()) .setLimits(borgArchive.getLimits()) .setHostname(borgArchive.getHostname()) .setUsername(borgArchive.getUsername()) .setEnd(DateUtils.format(borgArchive.getEnd())) .setDuration(borgArchive.getDuration()) ; } public static List<BorgFilesystemItem> listArchiveContent(BorgRepoConfig repoConfig, String archiveId) { borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -57,7 +57,12 @@ * @return Repository. */ private Repository getRepository(BorgRepoConfig repoConfig) { Repository repository = repoCacheAccess.get(repoConfig.getRepo()); Repository repository = null; try { repository = repoCacheAccess.get(repoConfig.getRepo()); } catch (Exception ex) { log.warn("Error while deserializing repository (maybe data format was changed). Reloading..."); } if (repository == null || repository.getLocation() == null) { repository = BorgCommands.info(repoConfig); repoCacheAccess.put(repoConfig.getRepo(), repository); borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java
@@ -1,5 +1,6 @@ package de.micromata.borgbutler.data; import de.micromata.borgbutler.json.borg.BorgArchiveLimits; import de.micromata.borgbutler.json.borg.BorgArchiveStats; import de.micromata.borgbutler.json.borg.BorgCache; import de.micromata.borgbutler.json.borg.BorgEncryption; @@ -24,6 +25,12 @@ */ @Getter @Setter private String repoDisplayName; /** * For convenience purposes for the client. */ @Getter @Setter private String repoId; @Getter @Setter @@ -55,13 +62,25 @@ private String start; @Getter @Setter private String end; @Getter @Setter private String time; @Getter @Setter private String duration; @Getter @Setter private BorgArchiveStats stats; @Getter @Setter private BorgArchiveLimits limits; @Getter @Setter private String username; @Getter @Setter private String hostname; /** * borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java
@@ -2,7 +2,6 @@ import de.micromata.borgbutler.json.JsonUtils; import lombok.Getter; import lombok.Setter; import java.io.Serializable; @@ -20,12 +19,11 @@ @Getter private String name; @Getter @Setter private String start; @Getter @Setter private String time; public String toString() { return JsonUtils.toJson(this, true); } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive2.java
@@ -25,9 +25,18 @@ @Getter private String start; @Getter private String end; @Getter private String duration; @Getter private BorgArchiveStats stats; @Getter private BorgArchiveLimits limits; @Getter private String hostname; @Getter private String username; public String toString() { return JsonUtils.toJson(this, true); } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchiveLimits.java
New file @@ -0,0 +1,13 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import java.io.Serializable; public class BorgArchiveLimits implements Serializable { private static final long serialVersionUID = -3079958893130481516L; @JsonProperty("max_archive_size") @Getter private double maxArchiveSize; } borgbutler-core/src/main/java/de/micromata/borgbutler/utils/DateUtils.java
@@ -10,6 +10,9 @@ * @return */ public static String format(String borgDateTime) { if (borgDateTime == null) { return null; } LocalDateTime dateTime = LocalDateTime.parse(borgDateTime); return format(dateTime); } borgbutler-webapp/src/components/views/repos/ArchiveView.jsx
@@ -1,7 +1,7 @@ import React from 'react' import {Table} from 'reactstrap'; import {PageHeader} from '../../general/BootstrapComponents'; import {getRestServiceUrl} from '../../../utilities/global'; import {getRestServiceUrl, humanFileSize, humanSeconds} from '../../../utilities/global'; import ErrorAlert from '../../general/ErrorAlert'; import {IconRefresh} from "../../general/IconComponents"; @@ -46,7 +46,7 @@ render = () => { let content = undefined; const archive = this.state.archive; let archive = this.state.archive; let pageHeader = ''; if (this.state.isFetching) { @@ -60,9 +60,9 @@ title: 'Try again' }} />; } else if (this.state.repo) { } else if (this.state.archive) { pageHeader = <React.Fragment> {archive.id} {archive.repoDisplayName} <div className={'btn btn-outline-primary refresh-button-right'} onClick={this.fetchArchive.bind(this, true)} @@ -74,9 +74,74 @@ <Table hover> <tbody> <tr> <th>Archive</th> <th>Time</th> <th>Id</th> <td>Archive</td> <td>{archive.name}</td> </tr> <tr> <td>Start - end</td> <td>{archive.start} - {archive.end} (Duration: {humanSeconds(archive.duration)})</td> </tr> <tr> <td>Id</td> <td>{archive.id}</td> </tr> <tr> <td>Stats</td> <td> <table className="inline"> <tbody> <tr> <td>Compressed size</td> <td>{humanFileSize(archive.stats.compressed_size)}</td> </tr> <tr> <td>Deduplicated size</td> <td>{humanFileSize(archive.stats.deduplicated_size)}</td> </tr> <tr> <td>Original size</td> <td>{humanFileSize(archive.stats.original_size)}</td> </tr> <tr> <td>Nfiles</td> <td>{Number(archive.stats.nfiles).toLocaleString()}</td> </tr> </tbody> </table> </td> </tr> <tr> <td>Comment</td> <td>{archive.comment}</td> </tr> <tr> <td>Command line</td> <td>{archive.commandLine.join(' ')}</td> </tr> <tr> <td>Host name</td> <td>{archive.hostname}</td> </tr> <tr> <td>User name</td> <td>{archive.username}</td> </tr> <tr> <td>Chunker params</td> <td>{archive.chunkerParams.join(', ')}</td> </tr> <tr> <td>Limits</td> <td> <table className="inline"> <tbody> <tr> <td>max_archive_size</td> <td>{archive.limits.max_archive_size}</td> </tr> </tbody> </table> </td> </tr> </tbody> </Table>