From c11208199d1804b5ff22a24c6f376e8aa39a23fe Mon Sep 17 00:00:00 2001 From: scott Date: Tue, 17 Mar 2026 17:28:47 -0400 Subject: [PATCH] Auto-detect firmware files in CWD for firmware update prompts Instead of requiring a manual path entry, scan the current working directory for files with common firmware extensions and present them as a numbered list (most recently modified first). The last option always allows entering a custom path, and the manual prompt is used as a fallback if no matching files are found. Co-Authored-By: Claude Sonnet 4.6 --- es24n_conf.py | 75 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/es24n_conf.py b/es24n_conf.py index fbb4587..be0090a 100755 --- a/es24n_conf.py +++ b/es24n_conf.py @@ -680,6 +680,63 @@ def _update_fabric_fw(password: str, ip: str, iom: str, fw_path: str) -> bool: return True +# ── Firmware file selection helper ──────────────────────────────────────────── +def _prompt_fw_file(label: str) -> str: + """ + Scan the current working directory for firmware files and let the user + pick one by number, or enter a custom path as the last option. + Files are sorted most-recently-modified first. + """ + cwd = os.getcwd() + FW_EXTS = {".bin", ".img", ".fw", ".hex", ".zip", ".tar", ".tgz", ".gz"} + + try: + candidates = sorted( + [f for f in os.listdir(cwd) + if not f.startswith(".") + and os.path.isfile(os.path.join(cwd, f)) + and os.path.splitext(f)[1].lower() in FW_EXTS], + key=lambda f: os.path.getmtime(os.path.join(cwd, f)), + reverse=True, + ) + except OSError: + candidates = [] + + print() + if candidates: + info(f"Firmware files found in {cwd}:") + for i, fname in enumerate(candidates, 1): + sz = os.path.getsize(os.path.join(cwd, fname)) + print(f" {_c(C.BOLD, str(i))} {fname} {_c(C.DIM, f'({sz // 1024} KB)')}") + custom_idx = len(candidates) + 1 + print(f" {_c(C.BOLD, str(custom_idx))} Enter a custom file path") + print() + + while True: + choice = prompt(f"Select {label} [1-{custom_idx}]") + if choice.isdigit(): + idx = int(choice) + if 1 <= idx <= len(candidates): + path = os.path.join(cwd, candidates[idx - 1]) + sz = os.path.getsize(path) + ok(f"Selected: {candidates[idx - 1]} ({sz // 1024} KB)") + return path + if idx == custom_idx: + break + warn(f"Please enter a number between 1 and {custom_idx}.") + else: + info(f"No firmware files found in {cwd}.") + + # Manual path entry + while True: + path = prompt(f"Path to {label}") + if os.path.isfile(path): + sz = os.path.getsize(path) + ok(f"File: {path} ({sz // 1024} KB)") + return path + warn(f"File not found: {path}") + + # ── Firmware Update Workflow ────────────────────────────────────────────────── def firmware_update_workflow(): """ @@ -746,24 +803,10 @@ def firmware_update_workflow(): fabric_fw_path = "" if update_iom: - print() - while True: - iom_fw_path = prompt("Path to IOM firmware file") - if os.path.isfile(iom_fw_path): - sz = os.path.getsize(iom_fw_path) - ok(f"File: {iom_fw_path} ({sz // 1024} KB)") - break - warn(f"File not found: {iom_fw_path}") + iom_fw_path = _prompt_fw_file("IOM firmware file") if update_fabric: - print() - while True: - fabric_fw_path = prompt("Path to Fabric Card firmware file") - if os.path.isfile(fabric_fw_path): - sz = os.path.getsize(fabric_fw_path) - ok(f"File: {fabric_fw_path} ({sz // 1024} KB)") - break - warn(f"File not found: {fabric_fw_path}") + fabric_fw_path = _prompt_fw_file("Fabric Card firmware file") print() warn("For HA systems: update the passive IOM first.")