diff --git a/src/gpu_rent/provision.py b/src/gpu_rent/provision.py index 126e4ab..4a92b02 100644 --- a/src/gpu_rent/provision.py +++ b/src/gpu_rent/provision.py @@ -245,6 +245,8 @@ for root in roots: dll_dir = dll.parent sqlite = dll_dir / "Microsoft.Data.Sqlite.dll" pcl = list(dll_dir.glob("SQLitePCLRaw*.dll")) + bundle = dll_dir / "SQLitePCLRaw.bundle_e_sqlite3.dll" + native = list(dll_dir.glob("runtimes/**/e_sqlite3.*")) + list(dll_dir.glob("runtimes/**/libe_sqlite3.*")) found.append({ "path": str(dll.parent.parent) if dll.parent.name.startswith("net") else str(dll_dir), "name": "swarm-assistent", @@ -252,6 +254,8 @@ for root in roots: "dll_dir": str(dll_dir), "sqlite_dll": sqlite.is_file(), "sqlitepcl": bool(pcl), + "sqlite_bundle": bundle.is_file(), + "sqlite_native": bool(native), }) print(json.dumps(found)) """ @@ -270,7 +274,13 @@ for root in (Path("/mnt/swarm_data"), Path("/opt/swarmui")): dlls.append(dll) def has_sqlite(d): - return (d / "Microsoft.Data.Sqlite.dll").is_file() and list(d.glob("SQLitePCLRaw*.dll")) + if not (d / "Microsoft.Data.Sqlite.dll").is_file(): + return False + if not list(d.glob("SQLitePCLRaw*.dll")): + return False + return (d / "SQLitePCLRaw.bundle_e_sqlite3.dll").is_file() or list( + d.glob("runtimes/**/e_sqlite3.*") + ) or list(d.glob("runtimes/**/libe_sqlite3.*")) donors = [d.parent for d in dlls if has_sqlite(d.parent)] if not donors: @@ -306,6 +316,15 @@ for dll in dlls: fp = src / name if fp.is_file(): shutil.copy2(fp, dest / name) + for sub in ("runtimes",): + sp = src / sub + if sp.is_dir(): + for fp in sp.rglob("*"): + if fp.is_file(): + rel = fp.relative_to(src) + out = dest / rel + out.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(fp, out) copied.append({"dll_dir": str(dest), "from": str(src)}) print(json.dumps({"copied": copied, "missing": missing, "dlls": [str(d) for d in dlls]})) """ @@ -415,12 +434,18 @@ def verify_assistent_sqlite_bins(cfg: Config, host: str, log: Log) -> bool: "или смотри journalctl -u swarmui" ) continue - if row.get("sqlite_dll") and row.get("sqlitepcl"): - log(f"Assistent {name}: Microsoft.Data.Sqlite + SQLitePCLRaw рядом с DLL") + if row.get("sqlite_dll") and row.get("sqlitepcl") and ( + row.get("sqlite_bundle") or row.get("sqlite_native") + ): + log(f"Assistent {name}: Microsoft.Data.Sqlite + SQLitePCLRaw (+ native) рядом с DLL") ok_any = True + elif row.get("sqlite_dll") and row.get("sqlitepcl"): + log( + f"⚠ Assistent {name}: Microsoft.Data.Sqlite есть, но нет bundle/native — " + "Крафт-память может падать; нужен ≥0.15.6 + restart" + ) elif row.get("sqlite_dll"): - log(f"Assistent {name}: Microsoft.Data.Sqlite есть (SQLitePCLRaw не найден)") - ok_any = True + log(f"⚠ Assistent {name}: Microsoft.Data.Sqlite есть (SQLitePCLRaw не найден)") else: where = row.get("dll_dir") or "bin/{Debug,Release}/net*" log(