|
| 1 | +# this file contains utility functions used by the RequestHandlers |
| 2 | + |
| 3 | +import os, stat |
| 4 | +from pwd import getpwnam |
| 5 | +import grp |
| 6 | +import shutil |
| 7 | +import logging |
| 8 | + |
| 9 | +log = logging.getLogger() |
| 10 | + |
| 11 | + |
| 12 | +def set_hydroshare_args(username, resourceid, resourcetype): |
| 13 | + |
| 14 | + userspace_dir = os.environ['JUPYTER_USERSPACE_DIR'] |
| 15 | + hs_env = os.path.abspath(os.path.join(userspace_dir, '%s/notebooks/.env' % username.lower())) |
| 16 | + print('ENV_PATH ',hs_env) |
| 17 | + |
| 18 | + with open(hs_env, 'w') as f: |
| 19 | + f.write('HS_USR_NAME=%s\n' % username) |
| 20 | + f.write('HS_RES_ID=%s\n' % resourceid) |
| 21 | + f.write('HS_RES_TYPE=%s\n' % resourcetype) |
| 22 | + f.write('JUPYTER_HUB_IP=%s\n' % os.environ['JUPYTER_HUB_IP'] ) |
| 23 | + |
| 24 | + # get the jupyter username |
| 25 | + user = getpwnam(os.environ['JUPYTER_USER']) |
| 26 | + group = grp.getgrnam('users') |
| 27 | + uid = user.pw_uid |
| 28 | + gid = group.gr_gid |
| 29 | + os.chown(hs_env, uid, gid) |
| 30 | + |
| 31 | +def build_userspace(username): |
| 32 | + |
| 33 | + # make all usernames lowercase |
| 34 | + husername = username.lower() |
| 35 | + |
| 36 | + # get the jupyter username |
| 37 | + user = getpwnam(os.environ['JUPYTER_USER']) |
| 38 | + group = grp.getgrnam('users') |
| 39 | + uid = user.pw_uid |
| 40 | + gid = group.gr_gid |
| 41 | + |
| 42 | + userspace_dir = os.environ['JUPYTER_USERSPACE_DIR'] |
| 43 | + ipynb_dir = os.environ['JUPYTER_NOTEBOOK_DIR'] |
| 44 | + |
| 45 | + # check to see if user exists |
| 46 | + basepath = os.path.abspath(os.path.join(userspace_dir, '%s'%husername)) |
| 47 | + path = os.path.abspath(os.path.join(basepath, 'notebooks')) |
| 48 | + if not os.path.exists(path): |
| 49 | + os.makedirs(path) |
| 50 | + |
| 51 | + file_paths = [] |
| 52 | + print('%s -> copying userpace filse' % username, flush=True) |
| 53 | + #ipynb_dir = '../jupyter-rest-endpoint/notebooks' |
| 54 | + for root, dirs, files in os.walk(ipynb_dir): |
| 55 | + for file in files: |
| 56 | + file_paths.append(os.path.join(os.path.abspath(root), file)) |
| 57 | + relpaths = [os.path.relpath(p, ipynb_dir) for p in file_paths] |
| 58 | + for i in range(0, len(file_paths)): |
| 59 | + src = file_paths[i] |
| 60 | + dst = os.path.join(path, relpaths[i]) |
| 61 | + dirpath = os.path.dirname(dst) |
| 62 | + if not os.path.exists(dirpath): |
| 63 | + os.makedirs(dirpath) |
| 64 | + shutil.copyfile(src, dst) |
| 65 | + |
| 66 | + # change file ownership so that it can be accessed inside docker container |
| 67 | + print('%s -> modifying userspace permissions' % username, flush=True) |
| 68 | + os.chown(basepath, uid, gid) |
| 69 | + os.chown(os.path.dirname(basepath), uid, gid) |
| 70 | +# os.chmod(os.path.dirname(basepath), stat.S_IRWXG | stat.S_ISGID | stat.S_IRWXU) |
| 71 | + os.chmod(os.path.dirname(basepath), 0o2770) |
| 72 | + |
| 73 | + for root, dirs, files in os.walk(basepath): |
| 74 | + for d in dirs: |
| 75 | + os.chown(os.path.join(root, d), uid, gid) |
| 76 | +# os.chmod(os.path.join(root, d), stat.S_IRWXG | stat.S_ISGID | stat.S_IRWXU) |
| 77 | + os.chmod(os.path.join(root, d), 0o2770) |
| 78 | + |
| 79 | + for f in files: |
| 80 | + os.chown(os.path.join(root, f), uid, gid) |
| 81 | +# os.chmod(os.path.join(root, f), stat.S_IRWXG | stat.S_ISGID | stat.S_IRWXU) |
| 82 | + os.chmod(os.path.join(root, f), 0o2770) |
0 commit comments