#!/usr/bin/env python3 """ Register a single RBAC permission for pipeline modules. Called by init_perms.py or directly. Usage: python set_role_perm.py python set_role_perm.py admin /pipeline_core/pipelines/*.dspy """ import sys, os, asyncio SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) ROOT_DIR = os.path.dirname(SCRIPT_DIR) if os.path.basename(SCRIPT_DIR) == 'bin' else SCRIPT_DIR sys.path.insert(0, os.path.join(ROOT_DIR, 'py3', 'lib', 'python3.10', 'site-packages')) sys.path.insert(0, ROOT_DIR) from sqlor.dbpools import DBPools from appPublic.jsonConfig import getConfig from appPublic.folderUtils import ProgramPath from appPublic.uniqueID import getID from ahserver.serverenv import ServerEnv from ahserver.globalEnv import initEnv async def main(role, path): config = getConfig(os.path.join(ROOT_DIR, 'conf', 'config.json'), NS={'workdir': ROOT_DIR, 'ProgramPath': ProgramPath()}) DBPools(config.databases) initEnv() env = ServerEnv() env.get_module_dbname = lambda m: 'pipeline' if 'pipeline' in m else 'sage' # Determine module from path parts = path.strip('/').split('/') module = parts[0] if parts else 'app' async with DBPools().sqlorContext('sage') as sor: existing = await sor.sqlExe( "SELECT id FROM role_path WHERE module=${m}$ AND path=${p}$ AND role_name=${r}$", {'m': module, 'p': path, 'r': role}) if existing: print(f'Permission exists: {role} {path}') return await sor.C('role_path', { 'id': getID(), 'module': module, 'path': path, 'role_name': role, 'description': f'Auto-registered: {role} -> {path}' }) print(f'Registered: {role} -> {path}') if __name__ == '__main__': if len(sys.argv) != 3: print(f"Usage: {sys.argv[0]} ") print(f" roles: guest, logined, admin") print(f" path example: /pipeline_core/index.ui") sys.exit(1) asyncio.run(main(sys.argv[1], sys.argv[2]))