#!/usr/bin/env python3 """image_mgr RBAC 权限管理""" import subprocess, os, sys, json, glob mod_name = 'image_mgr' def find_sage_root(): for c in [os.path.expanduser("~/sage"), os.path.expanduser("~/repos/sage")]: if os.path.isdir(os.path.join(c, "py3")): return c return None SAGE = find_sage_root() if not SAGE: sys.exit("Sage root not found") PY = os.path.join(SAGE, "py3", "bin", "python") SET = os.path.join(SAGE, "set_role_perm.py") JSON_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "json") API_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "wwwroot", "api") def load_cruds(): defs = [] for f in sorted(glob.glob(os.path.join(JSON_DIR, "*.json"))): try: d = json.load(open(f)) defs.append({"tblname": d["tblname"], "alias": d.get("alias", d["tblname"]), "subtables": d.get("params", {}).get("subtables", [])}) except: pass return defs def get_apis(): if not os.path.isdir(API_DIR): return [] return ["/" + mod_name + "/api/" + f for f in sorted(os.listdir(API_DIR)) if f.endswith(".dspy")] cruds = load_cruds() apis = get_apis() PATHS_ANY = [ "/" + mod_name + "/menu.ui", ] PATHS_LOGINED = [ "/" + mod_name, "/" + mod_name + "/index.ui", ] for d in cruds: PATHS_ANY.append("/" + mod_name + "/" + d["alias"]) PATHS_LOGINED.append("/" + mod_name + "/" + d["alias"] + "/index.ui") for act in ["get", "add", "update", "delete"]: PATHS_LOGINED.append("/" + mod_name + "/" + d["alias"] + "/" + act + "_" + d["tblname"] + ".dspy") for api in apis: PATHS_LOGINED.append(api) PATHS_OPERATOR = list(PATHS_LOGINED) PATHS_ANY = list(dict.fromkeys(PATHS_ANY)) PATHS_LOGINED = list(dict.fromkeys(PATHS_LOGINED)) PATHS_OPERATOR = list(dict.fromkeys(PATHS_OPERATOR)) def reg(role, paths): ok = 0 for p in paths: r = subprocess.run([PY, SET, role, p], capture_output=True, text=True) if r.returncode == 0: ok += 1 print(" " + role + ": " + str(ok) + "/" + str(len(paths))) return ok total = 0 print(mod_name + ": any=" + str(len(PATHS_ANY)) + " logined=" + str(len(PATHS_LOGINED)) + " operator=" + str(len(PATHS_OPERATOR))) total += reg("any", PATHS_ANY) total += reg("logined", PATHS_LOGINED) total += reg("reseller.operator", PATHS_OPERATOR) print("Done. " + str(total) + " entries.")