diff --git a/app.py b/app.py index 8a1d635..39e0bf5 100644 --- a/app.py +++ b/app.py @@ -65,7 +65,7 @@ DEFAULT_CONFIG = { 'wireguard_auto': False, } -# ── Persistenter Kopierstatus ─────────────────────────────────────────────── +# -- Persistenter Kopierstatus ----------------------------------------------- copy_state = { 'running': False, 'progress': 0, @@ -101,7 +101,7 @@ def save_state(): except Exception: pass -# ── WiFi Status ───────────────────────────────────────────────────────────── +# -- WiFi Status ------------------------------------------------------------- wifi_state = { 'mode': 'unknown', # 'client' | 'ap' | 'disconnected' @@ -110,7 +110,7 @@ wifi_state = { } wifi_lock = threading.Lock() -# ── Config ─────────────────────────────────────────────────────────────────── +# -- Config ------------------------------------------------------------------- def load_cfg(): cfg = DEFAULT_CONFIG.copy() @@ -128,7 +128,7 @@ def load_cfg(): def save_cfg(cfg): _atomic_write(CONFIG_FILE, json.dumps(cfg, indent=2)) -# ── WiFi Hilfsfunktionen ───────────────────────────────────────────────────── +# -- WiFi Hilfsfunktionen ----------------------------------------------------- def nm(*args): return subprocess.run(['nmcli'] + list(args), @@ -216,7 +216,7 @@ def scan_wifi_networks(): nets.append({'ssid': ssid, 'signal': int(signal) if signal.isdigit() else 0, 'security': security}) return sorted(nets, key=lambda x: -x['signal']) -# ── WiFi Monitor Thread ─────────────────────────────────────────────────────── +# -- WiFi Monitor Thread ------------------------------------------------------- def update_wifi_state(): info = get_wlan0_info() @@ -271,7 +271,7 @@ def wifi_monitor(): time.sleep(30) -# ── WireGuard VPN ───────────────────────────────────────────────────────────── +# -- WireGuard VPN ------------------------------------------------------------- WG_CONF = Path('/etc/wireguard/picopy.conf') WG_IFACE = 'picopy' @@ -411,7 +411,7 @@ def wg_monitor(): time.sleep(10) -# ── USB Geräteerkennung ─────────────────────────────────────────────────────── +# -- USB Geräteerkennung ------------------------------------------------------- def usb_port_of(dev_name): """Gibt den physischen USB-Port-Pfad zurück (z.B. '2-2'). @@ -491,7 +491,7 @@ def ensure_mount(dev_info): return None, False return mp, True -# ── Kopier-Logik ────────────────────────────────────────────────────────────── +# -- Kopier-Logik -------------------------------------------------------------- def add_log(msg): log.info(msg) @@ -619,7 +619,7 @@ def do_copy(src_dev, dst_dev, cfg): 'source': src_dev.get('label', ''), })) - # ── Dateien sammeln & filtern ────────────────────────────────────── + # -- Dateien sammeln & filtern -------------------------------------- src_path = Path(src_mp) all_files = [f for f in src_path.rglob('*') if f.is_file()] files = [f for f in all_files if _should_copy(f, cfg)] @@ -640,7 +640,7 @@ def do_copy(src_dev, dst_dev, cfg): skipped = 0 io_errors = 0 - # ── Phase 1: Kopieren ────────────────────────────────────────────── + # -- Phase 1: Kopieren ---------------------------------------------- for i, f in enumerate(files): with copy_lock: cancelled = not copy_state['running'] @@ -713,7 +713,7 @@ def do_copy(src_dev, dst_dev, cfg): if io_errors: msg_parts.append(f'{io_errors} Fehler (I/O)') - # ── Phase 2: Verifizieren ────────────────────────────────────────── + # -- Phase 2: Verifizieren ------------------------------------------ verify_errors = 0 verified_pairs = list(copied_pairs) @@ -749,7 +749,7 @@ def do_copy(src_dev, dst_dev, cfg): else: add_log(f'Alle {len(verified_pairs)} Dateien verifiziert ✓') - # ── Phase 3: Quelle löschen ──────────────────────────────────────── + # -- Phase 3: Quelle löschen ---------------------------------------- if cfg.get('delete_source') and verified_pairs: if verify_errors: add_log('Quelldateien NICHT gelöscht (Prüfsummenfehler)') @@ -825,7 +825,7 @@ def usb_monitor(): except ImportError: log.warning('pyudev nicht verfügbar') -# ── Upload-Ziele (rclone) ───────────────────────────────────────────────────── +# -- Upload-Ziele (rclone) ----------------------------------------------------- RCLONE_CONF = BASE_DIR / 'rclone.conf' @@ -892,7 +892,7 @@ def run_uploads(local_dir: Path, cfg: dict): with upload_lock: upload_state['current'] = name - add_log(f'Upload → {name}...') + add_log(f'Upload -> {name}...') dest_root = t.get('dest_path', 'PiCopy').strip('/') dest = f'{_remote_name(t["id"])}:{dest_root}' @@ -913,7 +913,7 @@ def run_uploads(local_dir: Path, cfg: dict): upload_state['current'] = '' -# ── Flask Routes ────────────────────────────────────────────────────────────── +# -- Flask Routes -------------------------------------------------------------- @app.route('/') def index(): @@ -1030,7 +1030,7 @@ def r_wifi_status(): return jsonify(dict(wifi_state)) -# ── WireGuard Routes ───────────────────────────────────────────────────────── +# -- WireGuard Routes --------------------------------------------------------- @app.route('/api/wireguard/config', methods=['GET', 'POST']) def r_wg_config(): @@ -1087,7 +1087,7 @@ def r_wg_uninstall(): return jsonify(ok=True) -# ── Upload Routes ────────────────────────────────────────────────────────────── +# -- Upload Routes -------------------------------------------------------------- @app.route('/api/upload/targets', methods=['GET']) def r_upload_list(): @@ -1155,7 +1155,7 @@ def r_upload_status(): return jsonify(dict(upload_state)) -# ── Browse (persistente Mounts für File-Explorer) ───────────────────────────── +# -- Browse (persistente Mounts für File-Explorer) ----------------------------- _browse_mounts = {} # usb_port -> mount_point @@ -1193,7 +1193,7 @@ def get_browse_mp(dev): if mp: if _mp_is_alive(mp): return mp - _drop_browse_mount(port) # veraltet → aufräumen + _drop_browse_mount(port) # veraltet -> aufräumen # Frisch mounten mp = f'/mnt/picopy_br_{port}' @@ -1258,7 +1258,7 @@ def r_browse(): -# ── Update-System ───────────────────────────────────────────────────────────── +# -- Update-System ------------------------------------------------------------- update_state = { 'current': VERSION, @@ -1293,7 +1293,7 @@ def check_for_updates(): update_state.update(latest=latest, available=avail, last_checked=datetime.now().isoformat()) if avail: - log.info(f'Update verfügbar: {VERSION} → {latest}') + log.info(f'Update verfügbar: {VERSION} -> {latest}') except Exception as e: with update_lock: update_state['error'] = str(e) @@ -1366,7 +1366,7 @@ def r_update_install(): return jsonify(error=str(e)), 500 -# ── HTML Template ───────────────────────────────────────────────────────────── +# -- HTML Template ------------------------------------------------------------- HTML = r""" @@ -1375,7 +1375,7 @@ HTML = r"""