""" 初始化超级用户 用法: CMS环境: py3/bin/python scripts/init_superuser.py [username] [password] Sage环境: cd ~/repos/sage && ./py3/bin/python ~/repos/cms/scripts/init_superuser.py [username] [password] 默认: admin / admin123 """ import os, sys, asyncio # 自动检测运行环境 def find_workdir(): """查找应用根目录""" script_dir = os.path.dirname(os.path.abspath(__file__)) cms_root = os.path.dirname(script_dir) # 检查是否是CMS独立环境 if os.path.isdir(os.path.join(cms_root, "py3", "bin")) and \ os.path.isfile(os.path.join(cms_root, "conf", "config.json")): return cms_root # 检查Sage环境 for c in [os.path.expanduser("~/repos/sage"), os.path.expanduser("~/sage")]: if os.path.isdir(os.path.join(c, "py3", "bin")): return c return None workdir = find_workdir() if not workdir: print("ERROR: 找不到CMS或Sage应用目录") sys.exit(1) # 确保Python路径 sys.path.insert(0, os.path.join(workdir, "py3", "lib")) os.chdir(workdir) from sqlor.dbpools import DBPools from appPublic.jsonConfig import getConfig from appPublic.uniqueID import getID from appPublic.password import password_encode async def main(): username = sys.argv[1] if len(sys.argv) > 1 else "admin" password = sys.argv[2] if len(sys.argv) > 2 else "admin123" config = getConfig('.') db = DBPools(config.databases) async with db.sqlorContext('sage') as sor: # 检查用户是否存在 existing = await sor.R('users', {'username': username}) if existing: print(f"用户 {username} 已存在 (id={existing[0]['id']})") await sor.U('users', { 'id': existing[0]['id'], 'passwd': password_encode(password) }) print(f"密码已更新为: {password}") else: user_id = getID() await sor.C('users', { 'id': user_id, 'username': username, 'passwd': password_encode(password), 'orgid': '0', 'orgtypeid': 'owner', 'status': '1', }) print(f"用户已创建: {username} (id={user_id})") # 查找或创建superuser角色 roles = await sor.R('role', {'orgtypeid': 'owner', 'name': 'superuser'}) if not roles: role_id = getID() await sor.C('role', { 'id': role_id, 'orgtypeid': 'owner', 'name': 'superuser' }) print(f"角色 owner.superuser 已创建 (id={role_id})") else: role_id = roles[0]['id'] print(f"角色 owner.superuser 已存在 (id={role_id})") # 获取用户ID users = await sor.R('users', {'username': username}) uid = users[0]['id'] # 分配角色 try: ur = await sor.R('userrole', {'userid': uid, 'roleid': role_id}) if not ur: await sor.C('userrole', { 'id': getID(), 'userid': uid, 'roleid': role_id, }) print(f"已分配角色 owner.superuser 给用户 {username}") else: print(f"用户 {username} 已拥有 owner.superuser 角色") except Exception as e: print(f"注意: userrole表操作异常: {e}") print("可能需要手动分配角色") # 给superuser分配全部权限 try: all_perms = await sor.R('permission', {}) for perm in all_perms: existing_rp = await sor.R('rolepermission', { 'roleid': role_id, 'permid': perm['id'] }) if not existing_rp: await sor.C('rolepermission', { 'id': getID(), 'roleid': role_id, 'permid': perm['id'] }) print(f"已将全部 {len(all_perms)} 条权限分配给 owner.superuser") except Exception as e: print(f"注意: 权限分配异常: {e}") print(f"\n登录信息:") print(f" 用户名: {username}") print(f" 密码: {password}") if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(main())