From 4a1e7923de3951066bf746133c53207dbbbc6b8b Mon Sep 17 00:00:00 2001 From: Stitch505 <–Gleb@stitch505.su> Date: Fri, 22 May 2026 23:23:02 +0400 Subject: [PATCH] fix: clear stale ssh_key from state when user declines keygen; add guard for missing key in do_transfer --- source/source.py | 14 +++++++++----- transfer/transfer.py | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/source/source.py b/source/source.py index 2d2053d..1041675 100644 --- a/source/source.py +++ b/source/source.py @@ -342,7 +342,7 @@ def do_transfer_offer(): host, user, port_int = resume_host, resume_user or "root", int(resume_port) else: # Сбрасываем, чтобы запросить заново - state.set_stage("SOURCE_STOP", target_host=None, target_user=None, target_port=None) + state.set_stage("SOURCE_STOP", target_host=None, target_user=None, target_port=None, ssh_key=None) host = user = None else: host = user = None @@ -378,8 +378,12 @@ def do_transfer_offer(): if key_path: state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=key_path) + from transfer.transfer import do_transfer + do_transfer() else: - state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int) - - from transfer.transfer import do_transfer - do_transfer() + # Пользователь отказался от ключа — очищаем старый ssh_key из state + state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=None) + warn("SSH-ключ не настроен. Автоматическая передача невозможна (scp с BatchMode=yes не поддерживает пароль).") + success(f"Архив оставлен в: {_ARCHIVE_DIR}") + info("Перенесите вручную через rsync/scp с паролем, или запустите заново и сгенерируйте ключ.") + state.set_stage("DONE") diff --git a/transfer/transfer.py b/transfer/transfer.py index 1f76cc8..f1e8eb2 100644 --- a/transfer/transfer.py +++ b/transfer/transfer.py @@ -72,6 +72,11 @@ def do_transfer(): if method == "scp": # scp использует заглавную -P для порта (строчная -p = preserve timestamps) # Добавляем SSH-опции чтобы избежать зависания и silent fail + if not (key_path and os.path.isfile(key_path)): + warn("SSH-ключ не найден. scp с BatchMode=yes не может использовать пароль.") + info("Варианты: 1) Сгенерируйте ключ через resume; 2) Используйте rsync; 3) Перенесите вручную.") + state.set_error("TRANSFER", "", "SSH key missing for scp with BatchMode", suggestion="Запустите docker-migrate --resume и сгенерируйте временный SSH-ключ") + raise RuntimeError("SSH-ключ отсутствует. Автоматический перенос невозможен без ключа.") scp_opts = f"-P {port} -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new -o BatchMode=yes" if key_path and os.path.isfile(key_path): scp_opts += f" -i '{key_path}'"