Release URBM 2026.06.15.r013

This commit is contained in:
Mikei386
2026-06-15 07:49:40 +02:00
parent 1c8d2202d4
commit e97dde0ed8
8 changed files with 31 additions and 12 deletions
-1
View File
@@ -1 +0,0 @@
5503027a5ce2c20162e16786a1892d13046fa8002fca2f156fc13b2ef66bf89f urbm-2026.06.15.r012-x86_64-1.txz
+1
View File
@@ -0,0 +1 @@
250d5afee9c2939738b74f0f6f719db12d9399068bf9452e08e2b03a67d381ad urbm-2026.06.15.r013-x86_64-1.txz
+6 -2
View File
@@ -2,13 +2,17 @@
<!DOCTYPE PLUGIN [ <!DOCTYPE PLUGIN [
<!ENTITY name "urbm"> <!ENTITY name "urbm">
<!ENTITY author "Michael Roll"> <!ENTITY author "Michael Roll">
<!ENTITY version "2026.06.15.r012"> <!ENTITY version "2026.06.15.r013">
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg"> <!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz"> <!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
<!ENTITY packageSHA256 "5503027a5ce2c20162e16786a1892d13046fa8002fca2f156fc13b2ef66bf89f"> <!ENTITY packageSHA256 "250d5afee9c2939738b74f0f6f719db12d9399068bf9452e08e2b03a67d381ad">
]> ]>
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png"> <PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
<CHANGES> <CHANGES>
### 2026.06.15.r013
- Replace invalid USB raw-image percentages, file counts, and multi-million-hour ETAs with streaming progress.
- Show bytes read and transfer rate while the final image size remains unknown until EOF.
### 2026.06.15.r012 ### 2026.06.15.r012
- Allow multiple backup jobs to share one Restic repository while retaining per-job snapshot tags and retention policies. - Allow multiple backup jobs to share one Restic repository while retaining per-job snapshot tags and retention policies.
- Catch asynchronous form submission errors so save failures are shown in the WebGUI instead of only in the browser console. - Catch asynchronous form submission errors so save failures are shown in the WebGUI instead of only in the browser console.
+8 -4
View File
@@ -375,11 +375,15 @@ func (s *Service) executeBackup(ctx context.Context, run model.Run) (result mode
} }
appendLiveLog(&live, "USB-Rohabbild wird direkt aus "+device+" zu Restic übertragen") appendLiveLog(&live, "USB-Rohabbild wird direkt aus "+device+" zu Restic übertragen")
s.updateActive(live) s.updateActive(live)
imageStarted := time.Now()
imageSummary, err = s.restic.BackupImage(ctx, mounted.Repository, job, image, func(progress restic.Progress) { imageSummary, err = s.restic.BackupImage(ctx, mounted.Repository, job, image, func(progress restic.Progress) {
live.ProgressPercent = progress.PercentDone * 100 live.ProgressPercent = 0
live.ProgressBytes, live.ProgressTotal = progress.BytesDone, progress.TotalBytes live.ProgressBytes, live.ProgressTotal = progress.BytesDone, 0
live.ProgressFiles, live.ProgressFileTotal = progress.FilesDone, progress.TotalFiles live.ProgressFiles, live.ProgressFileTotal = 0, 0
live.SecondsRemaining = progress.SecondsRemaining live.SecondsRemaining = 0
if elapsed := time.Since(imageStarted).Seconds(); elapsed > 0 {
live.BytesPerSecond = float64(progress.BytesDone) / elapsed
}
live.CurrentFile = "urbm-usb-flash.img" live.CurrentFile = "urbm-usb-flash.img"
s.updateActive(live) s.updateActive(live)
}) })
+5 -1
View File
@@ -2,13 +2,17 @@
<!DOCTYPE PLUGIN [ <!DOCTYPE PLUGIN [
<!ENTITY name "urbm"> <!ENTITY name "urbm">
<!ENTITY author "Michael Roll"> <!ENTITY author "Michael Roll">
<!ENTITY version "2026.06.15.r012"> <!ENTITY version "2026.06.15.r013">
<!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg"> <!ENTITY pluginURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm.plg">
<!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz"> <!ENTITY packageURL "https://git.casaderoll.de/michael/URBM/raw/branch/main/dist/urbm-&version;-x86_64-1.txz">
<!ENTITY packageSHA256 "REPLACE_DURING_RELEASE"> <!ENTITY packageSHA256 "REPLACE_DURING_RELEASE">
]> ]>
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png"> <PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;" min="7.0.0" support="https://git.casaderoll.de/michael/URBM/issues" icon="urbm.png">
<CHANGES> <CHANGES>
### 2026.06.15.r013
- Replace invalid USB raw-image percentages, file counts, and multi-million-hour ETAs with streaming progress.
- Show bytes read and transfer rate while the final image size remains unknown until EOF.
### 2026.06.15.r012 ### 2026.06.15.r012
- Allow multiple backup jobs to share one Restic repository while retaining per-job snapshot tags and retention policies. - Allow multiple backup jobs to share one Restic repository while retaining per-job snapshot tags and retention policies.
- Catch asynchronous form submission errors so save failures are shown in the WebGUI instead of only in the browser console. - Catch asynchronous form submission errors so save failures are shown in the WebGUI instead of only in the browser console.
+4 -4
View File
@@ -9,12 +9,12 @@ Tag="URBM Unraid Restic Backup Manager backup snapshots restore"
<?php <?php
$pluginRoot = '/plugins/urbm'; $pluginRoot = '/plugins/urbm';
?> ?>
<link rel="stylesheet" href="<?= $pluginRoot ?>/assets/urbm.css?v=20260615r012"> <link rel="stylesheet" href="<?= $pluginRoot ?>/assets/urbm.css?v=20260615r013">
<div id="urbm-app" data-api="<?= $pluginRoot ?>/api.php"> <div id="urbm-app" data-api="<?= $pluginRoot ?>/api.php">
<header class="bu-header"> <header class="bu-header">
<div class="bu-brand"> <div class="bu-brand">
<img class="bu-logo" src="<?= $pluginRoot ?>/images/urbm.png?v=20260615r012" alt="URBM-Logo"> <img class="bu-logo" src="<?= $pluginRoot ?>/images/urbm.png?v=20260615r013" alt="URBM-Logo">
<div><h1>URBM <span class="bu-version">2026.06.15.r012</span></h1><p>Restic Backup Manager für Unraid</p></div> <div><h1>URBM <span class="bu-version">2026.06.15.r013</span></h1><p>Restic Backup Manager für Unraid</p></div>
</div> </div>
<div id="bu-health" class="bu-health" tabindex="0" data-tooltip="Zeigt, ob die URBM-Hintergrundkomponente erreichbar ist. Beispiel: 'Daemon online' bedeutet, dass Jobs gestartet werden können.">Verbindung wird hergestellt...</div> <div id="bu-health" class="bu-health" tabindex="0" data-tooltip="Zeigt, ob die URBM-Hintergrundkomponente erreichbar ist. Beispiel: 'Daemon online' bedeutet, dass Jobs gestartet werden können.">Verbindung wird hergestellt...</div>
</header> </header>
@@ -32,4 +32,4 @@ $pluginRoot = '/plugins/urbm';
<div id="bu-tooltip" role="tooltip" aria-hidden="true"></div> <div id="bu-tooltip" role="tooltip" aria-hidden="true"></div>
</div> </div>
<script>window.URBM_CSRF = <?= json_encode($var['csrf_token'] ?? '') ?>;</script> <script>window.URBM_CSRF = <?= json_encode($var['csrf_token'] ?? '') ?>;</script>
<script src="<?= $pluginRoot ?>/assets/urbm-2026.06.15.r012.js"></script> <script src="<?= $pluginRoot ?>/assets/urbm-2026.06.15.r013.js"></script>
+7
View File
@@ -528,6 +528,13 @@
function progressView(run) { function progressView(run) {
if(run.status==='queued') return '<span class="bu-muted">Wartet in der Warteschlange</span>'; if(run.status==='queued') return '<span class="bu-muted">Wartet in der Warteschlange</span>';
if(run.taskType!=='backup'&&!run.progressPercent) return '<span class="bu-muted">Kein Prozentwert verfügbar</span>'; if(run.taskType!=='backup'&&!run.progressPercent) return '<span class="bu-muted">Kein Prozentwert verfügbar</span>';
const usbImage=run.status==='running'&&run.currentFile==='urbm-usb-flash.img';
if(usbImage) {
const details=[];
if(run.progressBytes) details.push(`${formatBytes(run.progressBytes)} gelesen`);
if(run.bytesPerSecond) details.push(`${formatBytes(run.bytesPerSecond)}/s`);
return `<div class="bu-progress-wrap"><div class="bu-progress-label"><strong>USB-Abbild wird übertragen…</strong><span>${esc(details.join(' · '))}</span></div><div class="bu-progress indeterminate"><span style="width:30%"></span></div><div class="bu-current-file">urbm-usb-flash.img · Gesamtgröße bis zum Abschluss unbekannt</div></div>`;
}
const percent=Math.max(0,Math.min(100,Number(run.progressPercent)||0)); const percent=Math.max(0,Math.min(100,Number(run.progressPercent)||0));
const scanning=run.status==='running'&&percent===0; const scanning=run.status==='running'&&percent===0;
const details=[]; const details=[];