This commit is contained in:
2025-10-23 08:16:18 +08:00
parent 7f9e2b56c4
commit acc3398554

View File

@@ -1,32 +1,43 @@
import shutil, configparser import os, shutil, configparser, pwd
from pathlib import Path from pathlib import Path
# 仓库在host上的地址
SHARED_ROOT = Path("/home/zhangyi/jupyter-collection") SHARED_ROOT = Path("/home/zhangyi/jupyter-collection")
CTRL_FILE = SHARED_ROOT / ".hub" / "resource_map.ini" CTRL_FILE = SHARED_ROOT / ".hub" / "resource_map.ini"
def load_map(): def prepare_user(spawner):
cfg = configparser.ConfigParser() username = spawner.user.name # 例如 student1
cfg.read(CTRL_FILE) sys_user = f"jupyter-{username}" # 系统账号 jupyter-student1
# 用户名 -> [res1, res2, ...] user_dir = Path(f"/home/{sys_user}") # /home/jupyter-student1
return {u: [r.strip() for r in v.split(",")]
for u, v in cfg.items("users")}
def copy_resources(spawner): # 确保系统账号存在TLJH 已建),否则退出
username = spawner.user.name try:
shared = Path(spawner.environment.get("HOME", f"/home/jupyter-{username}")) / "shared" pwd.getpwnam(sys_user)
except KeyError:
return
# 清空或新建 shared # 提前建家目录 700 + 归系统用户
user_dir.mkdir(mode=0o700, parents=True, exist_ok=True)
shutil.chown(user_dir, user=sys_user, group=sys_user)
# 整目录递归 chown含 TLJH 留下的 jupyter-xxx 文件)
for root, dirs, files in os.walk(user_dir):
for d in dirs:
shutil.chown(Path(root) / d, user=sys_user, group=sys_user)
for f in files:
shutil.chown(Path(root) / f, user=sys_user, group=sys_user)
# 清空/新建 shared + 拷贝资源(读写副本)
shared = user_dir / "shared"
if shared.exists(): if shared.exists():
shutil.rmtree(shared) shutil.rmtree(shared)
shared.mkdir(parents=True, exist_ok=True) shared.mkdir(parents=True, exist_ok=True)
shutil.chown(shared, user=sys_user, group=sys_user)
# 按 ini 拷贝资源 # 拷贝最新资源
for res in load_map().get(username, []): for res in load_map().get(username, []):
src = SHARED_ROOT / res src = SHARED_ROOT / res
dst = shared / res dst = shared / res
if src.is_dir(): if src.is_dir():
shutil.copytree(src, dst, dirs_exist_ok=True) shutil.copytree(src, dst, dirs_exist_ok=True)
# ========== 用户容器启动完成后执行 ========== c.Spawner.pre_spawn_hook = prepare_user
c.Spawner.post_spawn_hook = copy_resources