From acc3398554ff02564adf599a82d6ff3d03a2a89c Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Thu, 23 Oct 2025 08:16:18 +0800 Subject: [PATCH] tmp --- .hub/jupyter_config_backup.py | 41 ++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/.hub/jupyter_config_backup.py b/.hub/jupyter_config_backup.py index 314d5eb..e7fb22a 100644 --- a/.hub/jupyter_config_backup.py +++ b/.hub/jupyter_config_backup.py @@ -1,32 +1,43 @@ -import shutil, configparser +import os, shutil, configparser, pwd from pathlib import Path -# 仓库在host上的地址 SHARED_ROOT = Path("/home/zhangyi/jupyter-collection") CTRL_FILE = SHARED_ROOT / ".hub" / "resource_map.ini" -def load_map(): - cfg = configparser.ConfigParser() - cfg.read(CTRL_FILE) - # 用户名 -> [res1, res2, ...] - return {u: [r.strip() for r in v.split(",")] - for u, v in cfg.items("users")} +def prepare_user(spawner): + username = spawner.user.name # 例如 student1 + sys_user = f"jupyter-{username}" # 系统账号 jupyter-student1 + user_dir = Path(f"/home/{sys_user}") # /home/jupyter-student1 -def copy_resources(spawner): - username = spawner.user.name - shared = Path(spawner.environment.get("HOME", f"/home/jupyter-{username}")) / "shared" + # 确保系统账号存在(TLJH 已建),否则退出 + try: + 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(): shutil.rmtree(shared) shared.mkdir(parents=True, exist_ok=True) + shutil.chown(shared, user=sys_user, group=sys_user) - # 按 ini 拷贝资源 + # 拷贝最新资源 for res in load_map().get(username, []): src = SHARED_ROOT / res dst = shared / res if src.is_dir(): shutil.copytree(src, dst, dirs_exist_ok=True) -# ========== 用户容器启动完成后执行 ========== -c.Spawner.post_spawn_hook = copy_resources \ No newline at end of file +c.Spawner.pre_spawn_hook = prepare_user \ No newline at end of file