fix: remove cascaded step calls causing duplication, guard empty transfer
This commit is contained in:
+4
-2
@@ -273,7 +273,7 @@ def do_pack():
|
|||||||
|
|
||||||
success(f"Архив создан: {archive_path}")
|
success(f"Архив создан: {archive_path}")
|
||||||
state.set_stage("SOURCE_PACK", archive_path=archive_path)
|
state.set_stage("SOURCE_PACK", archive_path=archive_path)
|
||||||
do_stop_service()
|
# Автопереход к следующему шагу делает FSM
|
||||||
|
|
||||||
|
|
||||||
def do_stop_service():
|
def do_stop_service():
|
||||||
@@ -303,7 +303,6 @@ def do_stop_service():
|
|||||||
info("Пропуск остановки (сервис продолжает работать)")
|
info("Пропуск остановки (сервис продолжает работать)")
|
||||||
|
|
||||||
state.set_stage("SOURCE_STOP")
|
state.set_stage("SOURCE_STOP")
|
||||||
do_transfer_offer()
|
|
||||||
|
|
||||||
|
|
||||||
def do_transfer_offer():
|
def do_transfer_offer():
|
||||||
@@ -311,11 +310,14 @@ def do_transfer_offer():
|
|||||||
if not confirm("Перенести архив на новый сервер сейчас", default="y"):
|
if not confirm("Перенести архив на новый сервер сейчас", default="y"):
|
||||||
success("Готово! Архив оставлен на текущем сервере.")
|
success("Готово! Архив оставлен на текущем сервере.")
|
||||||
success(f"Manifest и архив лежат в: {_ARCHIVE_DIR}")
|
success(f"Manifest и архив лежат в: {_ARCHIVE_DIR}")
|
||||||
|
state.set_stage("DONE")
|
||||||
return
|
return
|
||||||
|
|
||||||
host = prompt("IP или домен нового сервера")
|
host = prompt("IP или домен нового сервера")
|
||||||
if not host:
|
if not host:
|
||||||
warn("IP/домен не указан. Перенос пропущен.")
|
warn("IP/домен не указан. Перенос пропущен.")
|
||||||
|
success(f"Архив оставлен в: {_ARCHIVE_DIR}")
|
||||||
|
state.set_stage("DONE")
|
||||||
return
|
return
|
||||||
user = prompt("SSH user (root или обычный пользователь)")
|
user = prompt("SSH user (root или обычный пользователь)")
|
||||||
if not user:
|
if not user:
|
||||||
|
|||||||
+29
-3
@@ -20,6 +20,14 @@ def do_transfer():
|
|||||||
user = st.get("target_user")
|
user = st.get("target_user")
|
||||||
port = st.get("target_port", 22)
|
port = st.get("target_port", 22)
|
||||||
|
|
||||||
|
if not host or host.lower() in ("none", "", "localhost"):
|
||||||
|
warn("Target host не указан. Перенос невозможен.")
|
||||||
|
state.set_stage("TRANSFER_SKIPPED")
|
||||||
|
return
|
||||||
|
if not user or user.lower() == "none":
|
||||||
|
user = "root"
|
||||||
|
warn(f"SSH user не указан, используем default: {user}")
|
||||||
|
|
||||||
step(5, "ПЕРЕНОС АРХИВА")
|
step(5, "ПЕРЕНОС АРХИВА")
|
||||||
info(f"Target: {user}@{host}:{port}")
|
info(f"Target: {user}@{host}:{port}")
|
||||||
|
|
||||||
@@ -64,16 +72,34 @@ def do_transfer():
|
|||||||
|
|
||||||
if method == "scp":
|
if method == "scp":
|
||||||
info("Копируем архив через scp ...")
|
info("Копируем архив через scp ...")
|
||||||
run(f"scp {ssh_opts} {archive_path} {user}@{host}:{remote_path}", check=False)
|
r = run(f"scp {ssh_opts} {archive_path} {user}@{host}:{remote_path}", check=False)
|
||||||
else:
|
else:
|
||||||
info("Копируем архив через rsync ...")
|
info("Копируем архив через rsync ...")
|
||||||
run(f"rsync -avz --progress -e 'ssh {ssh_opts}' {archive_path} {user}@{host}:{remote_path}", check=False)
|
r = run(f"rsync -avz --progress -e 'ssh {ssh_opts}' {archive_path} {user}@{host}:{remote_path}", check=False)
|
||||||
|
|
||||||
|
if r.returncode != 0:
|
||||||
|
state.set_error(
|
||||||
|
step="TRANSFER",
|
||||||
|
stdout=r.stdout,
|
||||||
|
stderr=r.stderr,
|
||||||
|
suggestion=f"Проверьте SSH-доступ к {user}@{host}:{port}. После исправления: docker-migrate --resume"
|
||||||
|
)
|
||||||
|
raise RuntimeError(f"Передача файла не удалась. Код возврата: {r.returncode}")
|
||||||
|
|
||||||
success(f"Архив передан на {host}:{remote_path}")
|
success(f"Архив передан на {host}:{remote_path}")
|
||||||
|
|
||||||
# Распаковка на target во временную директорию
|
# Распаковка на target во временную директорию
|
||||||
info("Распаковываем архив на target ...")
|
info("Распаковываем архив на target ...")
|
||||||
run(f"ssh {ssh_opts} {user}@{host} 'mkdir -p {remote_dir} \u0026\u0026 tar xzf {remote_path} -C {remote_dir}'", check=False)
|
r2 = run(f"ssh {ssh_opts} {user}@{host} 'mkdir -p {remote_dir} && tar xzf {remote_path} -C {remote_dir}'", check=False)
|
||||||
|
if r2.returncode != 0:
|
||||||
|
warn(f"Не удалось распаковать архив на target: {r2.stderr}")
|
||||||
|
state.set_error(
|
||||||
|
step="TRANSFER_UNPACK",
|
||||||
|
stdout=r2.stdout,
|
||||||
|
stderr=r2.stderr,
|
||||||
|
suggestion=f"Проверьте доступ SSH и tar на {host}. После исправления: docker-migrate --resume"
|
||||||
|
)
|
||||||
|
raise RuntimeError(f"Распаковка на target не удалась: {r2.stderr}")
|
||||||
|
|
||||||
# Сохраняем remote_dir в state для target
|
# Сохраняем remote_dir в state для target
|
||||||
state.set_stage("TRANSFER_DONE", target_remote_dir=remote_dir)
|
state.set_stage("TRANSFER_DONE", target_remote_dir=remote_dir)
|
||||||
|
|||||||
Reference in New Issue
Block a user