_grant_uat_menus.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # -*- coding: utf-8 -*-
  2. """一次性:为 UAT 账号角色补授 数据对接服务+智慧诊断 菜单(sys_role_menu 插 10 条,可逆)。
  3. 用法:
  4. python _grant_uat_menus.py check # 只读检查表结构与现状
  5. python _grant_uat_menus.py grant # 执行授权(幂等:已存在的跳过)
  6. python _grant_uat_menus.py revoke # 撤销本次授权
  7. """
  8. from __future__ import annotations
  9. import sys
  10. import pymysql
  11. CONN = dict(host="123.60.180.165", port=3306, user="aidopremote", password="1234567890aiDOP#",
  12. database="aidopdev", charset="utf8mb4", connect_timeout=15)
  13. ROLE_ID = 838258976469061 # UAT业务操作员(UATAdminA 挂载角色)
  14. MENU_IDS = [
  15. 1320990000400, # 数据中台管理(数据对接服务分组)
  16. 1320990000401, # 数据中台工作台
  17. 1320990000402, # 数据地图
  18. 1320990000403, # 数据源管理
  19. 1320990000404, # 同步配置中心
  20. 1320990000405, # 数据任务日志
  21. 1320990000406, # MDP运行监控
  22. 1320990000407, # 业务动作日志
  23. 1320990000408, # 出站回写队列
  24. 1320990000201, # 智慧诊断
  25. ]
  26. # 本次插入的记录 Id 段(撤销时按此范围 + RoleId 精确删除)
  27. ID_BASE = 8382990000400
  28. def main():
  29. mode = sys.argv[1] if len(sys.argv) > 1 else "check"
  30. conn = pymysql.connect(**CONN)
  31. try:
  32. cur = conn.cursor()
  33. cur.execute("SHOW COLUMNS FROM SysRoleMenu")
  34. cols = [(r[0], r[1], r[2], r[4]) for r in cur.fetchall()]
  35. print("COLUMNS", cols)
  36. id_col, role_col, menu_col = cols[0][0], None, None
  37. for name, *_ in cols:
  38. low = name.lower()
  39. if low == "roleid":
  40. role_col = name
  41. elif low == "menuid":
  42. menu_col = name
  43. print("USE COLS", id_col, role_col, menu_col)
  44. marks = ",".join(str(m) for m in MENU_IDS)
  45. cur.execute(
  46. f"SELECT {menu_col} FROM SysRoleMenu WHERE {role_col}=%s AND {menu_col} IN ({marks})",
  47. (ROLE_ID,),
  48. )
  49. existing = {r[0] for r in cur.fetchall()}
  50. print("EXISTING", sorted(existing))
  51. if mode == "grant":
  52. todo = [m for m in MENU_IDS if m not in existing]
  53. for i, mid in enumerate(todo):
  54. cur.execute(
  55. f"INSERT INTO SysRoleMenu ({id_col}, {role_col}, {menu_col}) VALUES (%s, %s, %s)",
  56. (ID_BASE + i, ROLE_ID, mid),
  57. )
  58. conn.commit()
  59. print("GRANTED", todo)
  60. elif mode == "revoke":
  61. cur.execute(
  62. f"DELETE FROM SysRoleMenu WHERE {role_col}=%s AND {id_col} BETWEEN %s AND %s",
  63. (ROLE_ID, ID_BASE, ID_BASE + 99),
  64. )
  65. conn.commit()
  66. print("REVOKED rows:", cur.rowcount)
  67. else:
  68. print("CHECK ONLY")
  69. finally:
  70. conn.close()
  71. if __name__ == "__main__":
  72. main()