diff --git a/scripts/st_env_snapshot.py b/scripts/st_env_snapshot.py index 972fc39..5afbe07 100644 --- a/scripts/st_env_snapshot.py +++ b/scripts/st_env_snapshot.py @@ -37,31 +37,35 @@ def snapshot(host, port, user, password): base = f"https://{host}:{port}/api/v2.0" auth = base64.b64encode(f"{user}:{password}".encode()).decode() - # Accounts - accts_raw = api_get(base, "/accounts?type=individual&limit=100", auth) + # Accounts — no type filter (type=individual is invalid; all accounts returned, categorised client-side) + accts_raw = api_get(base, "/accounts?limit=200", auth) accts = [] + partners = [] for a in accts_raw if isinstance(accts_raw, list) else accts_raw.get("result", []): - accts.append({ + locked = a.get("user", {}).get("locked", False) if isinstance(a.get("user"), dict) else False + entry = { "name": a.get("name"), "type": a.get("type"), - "status": "locked" if a.get("locked") else "active" - }) + "status": "locked" if locked else "active" + } + # Partner accounts have routingMode set and no transferType=N pattern; use name heuristic or type field + # In ST v5, partner accounts show type=user but have a distinct homeFolderAccessLevel pattern. + # Most reliable: include all non-service accounts and let caller filter. + if a.get("type") in ("user",): + accts.append(entry) + # Note: ST does not expose a dedicated partner-account type via this API; list all user accounts. - # Partner accounts - partners_raw = api_get(base, "/accounts?type=partner&limit=100", auth) - partners = [] - for a in partners_raw if isinstance(partners_raw, list) else partners_raw.get("result", []): - partners.append({"name": a.get("name"), "type": "partner"}) - - # Partner sites (transfer sites) - sites_raw = api_get(base, "/transfers/sites?limit=100", auth) + # Partner sites — correct endpoint is /sites (not /transfers/sites) + sites_raw = api_get(base, "/sites?limit=100", auth) sites = [] for s in sites_raw if isinstance(sites_raw, list) else sites_raw.get("result", []): sites.append({ "name": s.get("name"), "type": s.get("type"), - "partner": s.get("partnerAccount"), - "protocol": s.get("protocol") + "partner": s.get("partner"), + "protocol": s.get("protocol"), + "host": s.get("host"), + "port": s.get("port") }) # Certificates (filter to PGP and SSH) @@ -95,7 +99,6 @@ def snapshot(host, port, user, password): return { "host": host, "accounts": accts, - "partner_accounts": partners, "partner_sites": sites, "certificates": certs, "applications": apps, @@ -107,7 +110,8 @@ def validate_spec_prerequisites(snapshot_data, prereqs): missing = [] acct_names = {a["name"] for a in snapshot_data.get("accounts", [])} - partner_names = {a["name"] for a in snapshot_data.get("partner_accounts", [])} + # partner_accounts merged into accounts in v2; check against acct_names + acct_names_all = acct_names site_names = {s["name"] for s in snapshot_data.get("partner_sites", [])} cert_map = {c["name"]: c for c in snapshot_data.get("certificates", [])} @@ -116,7 +120,7 @@ def validate_spec_prerequisites(snapshot_data, prereqs): missing.append(f"Account '{a['name']}' not found") for p in prereqs.get("partner_accounts", []): - if p["name"] not in partner_names: + if p["name"] not in acct_names: missing.append(f"Partner account '{p['name']}' not found") for s in prereqs.get("partner_sites", []):