From 50c0b4d01274d263ad988f622323eeb6ee0539d3 Mon Sep 17 00:00:00 2001 From: Tobias Leuschner Date: Wed, 13 May 2026 11:13:17 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Speicherplatz-Warnung=20hinzugef=C3=BCg?= =?UTF-8?q?t=20und=20Versionsnummer=20auf=201.0.71=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 46 ++++++++++++++++++++++++++++++++++++++++++++-- version.txt | 2 +- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index 2b1c48a..ede4a22 100644 --- a/app.py +++ b/app.py @@ -82,6 +82,8 @@ copy_state = { 'bytes_total': 0, 'bytes_done': 0, 'start_ts': None, 'eta_sec': None, 'speed_bps': 0, 'phase': 'idle', + 'space_warning': False, 'space_needed': 0, 'space_free': 0, + 'last_success_file': '', } copy_lock = threading.Lock() _copy_thread: threading.Thread | None = None @@ -832,7 +834,9 @@ def do_copy(src_devs, dst_dev, cfg): done=0, total=0, logs=[], current='', bytes_total=0, bytes_done=0, start_ts=time.time(), eta_sec=None, speed_bps=0, - phase='copy') + phase='copy', + space_warning=False, space_needed=0, space_free=0, + last_success_file='') save_state() n = len(src_devs) add_log(f'Kopiervorgang gestartet ({n} Quelle{"n" if n != 1 else ""})') @@ -898,6 +902,23 @@ def do_copy(src_devs, dst_dev, cfg): copy_state['total'] = total copy_state['bytes_total'] = bytes_total add_log(f'{total} Dateien gesamt ({_fmt_bytes(bytes_total)})') + + # -- Speicherplatz-Prüfung ------------------------------------------ + try: + dst_free = shutil.disk_usage(dst_mp).free + except Exception: + dst_free = 0 + if bytes_total > 0 and dst_free < bytes_total: + with copy_lock: + copy_state.update(space_warning=True, + space_needed=bytes_total, + space_free=dst_free) + add_log( + f'⚠ Nicht genug Speicherplatz! ' + f'Benötigt: {_fmt_bytes(bytes_total)}, ' + f'Verfügbar: {_fmt_bytes(dst_free)} – ' + f'Quelle wird nicht gelöscht' + ) save_state() # -- Phase 1: Kopieren (alle Quellen) -------------------------------- @@ -963,6 +984,7 @@ def do_copy(src_devs, dst_dev, cfg): with copy_lock: copy_state['bytes_done'] += fsize + copy_state['last_success_file'] = str(dst_f) bd = copy_state['bytes_done'] bt = copy_state['bytes_total'] elapsed = time.time() - copy_state['start_ts'] @@ -1018,7 +1040,11 @@ def do_copy(src_devs, dst_dev, cfg): # -- Phase 3: Quelle löschen ---------------------------------------- if cfg.get('delete_source') and verified_pairs: - if verify_errors: + with copy_lock: + _space_warn = copy_state.get('space_warning', False) + if _space_warn: + add_log('Quelldateien NICHT gelöscht (Speicherplatz unzureichend)') + elif verify_errors: add_log('Quelldateien NICHT gelöscht (Prüfsummenfehler)') else: with copy_lock: @@ -2920,6 +2946,10 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
Noch keine Einträge
+
@@ -3680,6 +3710,18 @@ async function poll(){ // Log if(c.logs&&c.logs.length) $('log-box').innerHTML=c.logs.slice().reverse().map(l=>`
${l.t}${l.m}
`).join(''); + // Speicherplatz-Warnung + const swb=$('space-warn-box'),swd=$('space-warn-detail'); + if(c.space_warning){ + swb.style.display='block'; + const needed=fmtBytes(c.space_needed||0), free=fmtBytes(c.space_free||0); + const missing=fmtBytes(Math.max(0,(c.space_needed||0)-(c.space_free||0))); + let detail=`Benötigt: ${needed} · Verfügbar: ${free} · Fehlend: ${missing}
Quelldateien werden nicht gelöscht.`; + if(c.last_success_file) detail+=`
Zuletzt kopiert: ${c.last_success_file}`; + swd.innerHTML=detail; + }else{ + swb.style.display='none'; + } }catch(e){} // Upload status try{ diff --git a/version.txt b/version.txt index 9d8637c..1edd062 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.70 +1.0.71