pipeline-app/scripts/load_path.py

111 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Register all pipeline module RBAC permissions in one run."""
import sys, os, asyncio
ROOT = os.path.expanduser("~/pipeline")
sys.path.insert(0, os.path.join(ROOT, "py3", "lib", "python3.10", "site-packages"))
sys.path.insert(0, ROOT)
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
PERMS = [
# pipeline-sdlc
("/pipeline-sdlc", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_dashboard/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_projects/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_project_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_iterations/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_iteration_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_plans/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_plan_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_cases/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_case_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_bugs/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_bug_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_deploy_envs/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_deploy_env_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_review/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/api/*", "pipeline_sdlc", "logined"),
# pipeline_core
("/pipeline_core", "pipeline_core", "logined"),
("/pipeline_core/pipelines/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_steps/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_versions/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_editor/*", "pipeline_core", "logined"),
("/pipeline_core/api/*", "pipeline_core", "logined"),
# pipeline_ops
("/pipeline_ops", "pipeline_ops", "logined"),
("/pipeline_ops/api/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_pricing/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_capacity/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_usage_log/*", "pipeline_ops", "logined"),
# pipeline_dist
("/pipeline_dist", "pipeline_dist", "logined"),
("/pipeline_dist/*", "pipeline_dist", "logined"),
# showcase
("/showcase", "showcase", "logined"),
("/showcase/*", "showcase", "logined"),
# app root (any)
("/**", "app", "any"),
("/index.ui", "app", "any"),
("/todo_badge.js", "app", "any"),
("/index_tab.js", "app", "any"),
("/pipeline-sdlc/index.ui", "pipeline_sdlc", "any"),
("/pipeline_core/index.ui", "pipeline_core", "any"),
("/pipeline_ops/index.ui", "pipeline_ops", "any"),
("/pipeline_dist/index.ui", "pipeline_dist", "any"),
]
async def register():
config = getConfig(ROOT, NS={"workdir": ROOT, "ProgramPath": ProgramPath()})
DBPools(config.databases)
initEnv()
env = ServerEnv()
env.get_module_dbname = lambda m: "pipeline"
async with DBPools().sqlorContext("pipeline") as sor:
total = 0
for path, module, role_name in PERMS:
sql = "SELECT id FROM permission WHERE path=" + repr(path) + " LIMIT 1"
existing = await sor.sqlExe(sql, {})
pid = None
if existing:
pid = existing[0].id
else:
pid = getID()
await sor.C("permission", {
"id": pid, "name": module + ":" + path,
"path": path, "permtype": module
})
total += 1
# 补 role 关联permission 已存在但 rolepermission 缺失时也要补,修复 /** 等历史漏关联)
role_sql = "SELECT id FROM role WHERE name=" + repr(role_name) + " LIMIT 1"
role_recs = await sor.sqlExe(role_sql, {})
if role_recs:
rp_sql = ("SELECT id FROM rolepermission WHERE roleid=" + repr(role_recs[0].id)
+ " AND permid=" + repr(pid) + " LIMIT 1")
rp_existing = await sor.sqlExe(rp_sql, {})
if not rp_existing:
await sor.C("rolepermission", {
"id": getID(),
"roleid": role_recs[0].id,
"permid": pid
})
print(f"Registered {total} new permissions")
# Verify
async with DBPools().sqlorContext("pipeline") as sor:
cnt = await sor.sqlExe(
"SELECT COUNT(*) as n FROM permission WHERE path LIKE '/pipeline%' OR path LIKE '/showcase%'", {})
print(f"Total pipeline permissions: {cnt[0].n}")
if __name__ == "__main__":
asyncio.run(register())