From bfa31361316e9e042eaf856689471a4e114b958b Mon Sep 17 00:00:00 2001 From: Stitch505 <–Gleb@stitch505.su> Date: Fri, 22 May 2026 23:35:32 +0400 Subject: [PATCH] fix: target mode supports manual tar.gz path input + auto-extract when archive not transferred yet --- target/target.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/target/target.py b/target/target.py index 08f972b..8b6b0be 100644 --- a/target/target.py +++ b/target/target.py @@ -145,14 +145,30 @@ def do_restore(): # Определяем директорию с архивом remote_dir = st.get("target_remote_dir", "/tmp/docker-migrate-incoming") - if not os.path.isdir(remote_dir): - remote_dir = prompt("Укажите папку с распакованным архивом (manifest + файлы)") - + + # Если директория пуста — спрашиваем путь к tar.gz + if not os.path.isdir(remote_dir) or not os.listdir(remote_dir): + archive_prompt = prompt("Архив не найден в стандартной папке. Укажите путь к .tar.gz архиву (или Enter для указания папки)") + if archive_prompt and os.path.isfile(archive_prompt): + # Распаковываем tar.gz во временную папку + extract_dir = os.path.join(remote_dir, "extracted") + run(f"{sudo} mkdir -p {extract_dir}", check=False) + run(f"{sudo} tar xzf '{archive_prompt}' -C {extract_dir}", check=False) + remote_dir = extract_dir + info(f"Архив распакован в: {remote_dir}") + elif archive_prompt and os.path.isdir(archive_prompt): + remote_dir = archive_prompt + else: + remote_dir = prompt("Укажите папку с распакованным архивом (manifest + файлы)") or "/tmp/docker-migrate-incoming" + if not os.path.isdir(remote_dir): + raise RuntimeError(f"Папка не найдена: {remote_dir}") + manifest_file = None - for f in os.listdir(remote_dir): - if f.endswith("_manifest.json"): - manifest_file = os.path.join(remote_dir, f) - break + if os.path.isdir(remote_dir): + for f in os.listdir(remote_dir): + if f.endswith("_manifest.json"): + manifest_file = os.path.join(remote_dir, f) + break if not manifest_file: raise RuntimeError("manifest.json не найден в папке архива")