CRITICAL: hardcode state.json to ~/.migrate/state.json, guarantee reset_state clears completed_steps

This commit is contained in:
2026-05-22 21:20:44 +04:00
parent 0dfb4ec597
commit 186ab2325f
2 changed files with 13 additions and 19 deletions

View File

@@ -43,8 +43,9 @@ signal.signal(signal.SIGTERM, _handle_sigterm)
def main():
# Инициализируем state сразу, чтобы _LAST_STATE был готов при любом выходе
# Инициализируем state сразу, чтобы _LAST_STATE был готов при любом выходe
state.load_state()
parser = argparse.ArgumentParser(description="Docker Service Migration Tool")
parser.add_argument("--mode", choices=["source", "target"], help="Режим работы")
parser.add_argument("--resume", action="store_true", help="Продолжить после ошибки")

View File

@@ -14,29 +14,22 @@ from datetime import datetime
STATE_FILE = None
_LAST_STATE = None
# Жёсткий путь для state.json — один, навсегда
STATE_PATH = os.path.join(os.path.expanduser("~"), ".migrate", "state.json")
def _state_path():
global STATE_FILE
if STATE_FILE:
return STATE_FILE
# State никогда не храним рядом со скриптом — install.sh его удалит
candidates = [
os.path.join(os.path.expanduser("~"), ".migrate", "state.json"),
"/var/tmp/docker-migrate/state.json",
]
for c in candidates:
d = os.path.dirname(c)
if os.path.isdir(d):
STATE_FILE = c
return c
try:
# Всегда используем ~/.migrate/state.json
d = os.path.dirname(STATE_PATH)
try:
if not os.path.isdir(d):
os.makedirs(d, exist_ok=True)
STATE_FILE = c
return c
except PermissionError:
continue
fallback = os.path.join(os.getcwd(), ".migrate-state.json")
STATE_FILE = fallback
return fallback
except Exception:
pass
STATE_FILE = STATE_PATH
return STATE_FILE
def load_state():