fix: clear stale ssh_key from state when user declines keygen; add guard for missing key in do_transfer

This commit is contained in:
2026-05-22 23:23:02 +04:00
parent 329dade4c9
commit 4a1e7923de
2 changed files with 14 additions and 5 deletions

View File

@@ -342,7 +342,7 @@ def do_transfer_offer():
host, user, port_int = resume_host, resume_user or "root", int(resume_port) host, user, port_int = resume_host, resume_user or "root", int(resume_port)
else: 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 host = user = None
else: else:
host = user = None host = user = None
@@ -378,8 +378,12 @@ def do_transfer_offer():
if key_path: if key_path:
state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=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: else:
state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int) # Пользователь отказался от ключа — очищаем старый ssh_key из state
state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=None)
from transfer.transfer import do_transfer warn("SSH-ключ не настроен. Автоматическая передача невозможна (scp с BatchMode=yes не поддерживает пароль).")
do_transfer() success(f"Архив оставлен в: {_ARCHIVE_DIR}")
info("Перенесите вручную через rsync/scp с паролем, или запустите заново и сгенерируйте ключ.")
state.set_stage("DONE")

View File

@@ -72,6 +72,11 @@ def do_transfer():
if method == "scp": if method == "scp":
# scp использует заглавную -P для порта (строчная -p = preserve timestamps) # scp использует заглавную -P для порта (строчная -p = preserve timestamps)
# Добавляем SSH-опции чтобы избежать зависания и silent fail # Добавляем 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" scp_opts = f"-P {port} -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new -o BatchMode=yes"
if key_path and os.path.isfile(key_path): if key_path and os.path.isfile(key_path):
scp_opts += f" -i '{key_path}'" scp_opts += f" -i '{key_path}'"