scense_runtime/scripts/load_path.py

97 lines
3.2 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
# -*- coding: utf-8 -*-
"""runtime 模块 RBAC 路径注册脚本scripts/load_path.py
模块目录结构硬性要求review-develop 第一章):每个业务模块必须携带本脚本。
本脚本将 /scense_runtime/play.html、/scense_runtime/api/*.dspy、index.ui 等全部新路径注册到
宿主 RBAC角色分层any=静态资源免登录logined=登录即可),
并同步提示写入中央 load_path.py双入口防 per-module 脚本静默失败)。
禁止通配符(% / *):每条路径显式列出。
"""
import os
import subprocess
import sys
MOD = 'scense_runtime'
# ---- 角色分层路径清单(新增页面/API 必须同步维护此处) ----
# any免登录静态资源JS/CSS页面内由 ahserver 自动服务)
PATHS_ANY = [
'/scense_runtime/runtime.js',
]
# logined登录即可访问的页面与 API
PATHS_LOGINED = [
'/scense_runtime',
'/scense_runtime/index.ui',
'/scense_runtime/play.html',
'/scense_runtime/api/load_world.dspy',
'/scense_runtime/api/runtime_status.dspy',
'/scense_runtime/api/runtime_event.dspy',
'/scense_runtime/api/runtime_control.dspy',
]
CENTRAL_HINT = (
'请同时在宿主中央 load_path.py 中登记(双入口兜底):\n'
+ '\n'.join(' "' + p + ' logined"' if p not in PATHS_ANY else ' "' + p + ' any"'
for p in PATHS_LOGINED + PATHS_ANY)
)
def find_sage_root():
"""自动查找宿主应用根(含 wwwroot 目录即可)。"""
here = os.path.dirname(os.path.abspath(__file__))
candidates = [
os.path.expanduser('~/repos/sage'),
os.path.expanduser('~/sage'),
'/d/scense/scense_app',
]
for up in ('../..', '../../..', '../../../..'):
candidates.append(os.path.normpath(os.path.join(here, up)))
for c in candidates:
if os.path.isdir(os.path.join(c, 'wwwroot')):
return c
return None
def set_perm(sage_root, path, role):
"""调用宿主 set_role_perm.py 注册单条路径(失败不中断,返回 False"""
script = os.path.join(sage_root, 'set_role_perm.py')
py = os.path.join(sage_root, 'py3', 'bin', 'python')
if not os.path.exists(script):
print('[load_path] WARN set_role_perm.py not found at ' + script)
return False
cmd = [py, script, path, role]
try:
r = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
print('[load_path] ' + path + ' ' + role + ' -> rc=' + str(r.returncode))
if r.stdout:
print(r.stdout[-500:])
if r.stderr:
print(r.stderr[-500:])
return r.returncode == 0
except Exception as exc:
print('[load_path] FAIL ' + path + ': ' + str(exc))
return False
def main():
sage_root = find_sage_root()
if not sage_root:
print('[load_path] ERROR: sage/host root not found; register manually.')
print(CENTRAL_HINT)
sys.exit(2)
print('[load_path] host root: ' + sage_root)
ok = True
for p in PATHS_ANY:
ok = set_perm(sage_root, p, 'any') and ok
for p in PATHS_LOGINED:
ok = set_perm(sage_root, p, 'logined') and ok
print(CENTRAL_HINT)
sys.exit(0 if ok else 1)
if __name__ == '__main__':
main()