ApplyMgnuiLobsterMenuFix.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import java.nio.charset.StandardCharsets;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.nio.file.Paths;
  5. import java.sql.*;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. /**
  9. * Hide legacy lobster root menu 2951 (duplicate of 29900) and fix wrong api-registry path.
  10. */
  11. public class ApplyMgnuiLobsterMenuFix {
  12. private static final String MASTER_HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com");
  13. private static final int MASTER_PORT = Integer.parseInt(getenv("DB_PORT", "27220"));
  14. private static final String MASTER_USER = getenv("DB_USER", "root");
  15. private static final String MASTER_PASSWORD = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y");
  16. private static final String MASTER_DB = getenv("DB_NAME", "ylrz_saas");
  17. private static final String[] MASTER_FIX_SQL = {
  18. "UPDATE tenant_sys_menu SET visible = '1' WHERE menu_id = 2951",
  19. "UPDATE tenant_sys_menu SET visible = '1' WHERE parent_id = 2951",
  20. "UPDATE tenant_sys_menu SET path = 'api-registry' WHERE menu_id = 2955 AND path = 'lobster-api-registry'",
  21. "UPDATE sys_menu SET visible = '1' WHERE menu_id = 2951",
  22. "UPDATE sys_menu SET visible = '1' WHERE parent_id = 2951",
  23. "UPDATE sys_menu SET path = 'api-registry' WHERE menu_id = 2955 AND path = 'lobster-api-registry'"
  24. };
  25. private static final String[] TENANT_FIX_SQL = {
  26. "UPDATE sys_menu SET visible = '1' WHERE menu_id = 2951",
  27. "UPDATE sys_menu SET visible = '1' WHERE parent_id = 2951",
  28. "UPDATE sys_menu SET path = 'api-registry' WHERE menu_id = 2955 AND path = 'lobster-api-registry'"
  29. };
  30. public static void main(String[] args) throws Exception {
  31. Class.forName("com.mysql.cj.jdbc.Driver");
  32. System.out.println("=== Apply mgnui lobster menu fix ===");
  33. try (Connection master = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  34. applyFix(master, MASTER_FIX_SQL, "MASTER");
  35. printRoots(master, "tenant_sys_menu");
  36. }
  37. List<Long> tenantIds = loadActiveTenantIds(
  38. open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD));
  39. int ok = 0;
  40. for (Long tenantId : tenantIds) {
  41. TenantDb tenant = loadTenant(
  42. open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD), tenantId);
  43. if (tenant == null) {
  44. continue;
  45. }
  46. System.out.println("\n[TENANT " + tenantId + "] " + tenant.database);
  47. try (Connection conn = open(tenant.host, tenant.port, tenant.database, tenant.user, tenant.password)) {
  48. applyFix(conn, TENANT_FIX_SQL, "sys_menu");
  49. printRoots(conn, "sys_menu");
  50. ok++;
  51. } catch (Exception e) {
  52. System.out.println(" [ERR] " + e.getMessage());
  53. }
  54. }
  55. System.out.println("\nDone. tenants updated=" + ok);
  56. }
  57. private static void applyFix(Connection conn, String[] sqlList, String label) throws SQLException {
  58. for (String sql : sqlList) {
  59. if (sql.contains("tenant_sys_menu") && !tableExists(conn, "tenant_sys_menu")) {
  60. continue;
  61. }
  62. if (sql.contains("sys_menu") && !tableExists(conn, "sys_menu")) {
  63. continue;
  64. }
  65. try (PreparedStatement ps = conn.prepareStatement(sql)) {
  66. int n = ps.executeUpdate();
  67. System.out.println(" " + label + " | rows=" + n + " | " + sql.substring(0, Math.min(55, sql.length())));
  68. }
  69. }
  70. }
  71. private static boolean tableExists(Connection conn, String table) throws SQLException {
  72. try (ResultSet rs = conn.getMetaData().getTables(null, null, table, null)) {
  73. return rs.next();
  74. }
  75. }
  76. private static void printRoots(Connection conn, String table) throws SQLException {
  77. String sql = "SELECT menu_id, menu_name, path, visible FROM " + table
  78. + " WHERE parent_id = 0 AND (menu_id IN (2951,29900) OR path LIKE '%lobster%') ORDER BY menu_id";
  79. try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql)) {
  80. while (rs.next()) {
  81. System.out.printf(" root id=%d path=%s visible=%s name=%s%n",
  82. rs.getLong(1), rs.getString(3), rs.getString(4), rs.getString(2));
  83. }
  84. }
  85. }
  86. private static List<Long> loadActiveTenantIds(Connection master) throws SQLException {
  87. List<Long> ids = new ArrayList<>();
  88. try (Statement st = master.createStatement();
  89. ResultSet rs = st.executeQuery("SELECT id FROM tenant_info WHERE status = 1 ORDER BY id")) {
  90. while (rs.next()) {
  91. ids.add(rs.getLong(1));
  92. }
  93. }
  94. return ids;
  95. }
  96. private static TenantDb loadTenant(Connection master, long tenantId) throws SQLException {
  97. try (PreparedStatement ps = master.prepareStatement(
  98. "SELECT db_url, db_account, db_pwd FROM tenant_info WHERE id = ? AND status = 1 LIMIT 1")) {
  99. ps.setLong(1, tenantId);
  100. try (ResultSet rs = ps.executeQuery()) {
  101. if (!rs.next()) {
  102. return null;
  103. }
  104. return parseJdbcUrl(rs.getString("db_url"), rs.getString("db_account"), rs.getString("db_pwd"));
  105. }
  106. }
  107. }
  108. private static TenantDb parseJdbcUrl(String jdbcUrl, String user, String password) {
  109. String body = jdbcUrl.substring("jdbc:mysql://".length());
  110. int slash = body.indexOf('/');
  111. String hostPort = body.substring(0, slash);
  112. String rest = body.substring(slash + 1);
  113. int q = rest.indexOf('?');
  114. String database = q >= 0 ? rest.substring(0, q) : rest;
  115. int colon = hostPort.indexOf(':');
  116. TenantDb t = new TenantDb();
  117. t.host = colon >= 0 ? hostPort.substring(0, colon) : hostPort;
  118. t.port = colon >= 0 ? Integer.parseInt(hostPort.substring(colon + 1)) : 3306;
  119. t.database = database;
  120. t.user = user != null ? user : MASTER_USER;
  121. t.password = password != null ? password : MASTER_PASSWORD;
  122. return t;
  123. }
  124. private static Connection open(String host, int port, String database, String user, String password)
  125. throws SQLException {
  126. return DriverManager.getConnection(
  127. "jdbc:mysql://" + host + ":" + port + "/" + database
  128. + "?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true",
  129. user, password);
  130. }
  131. private static String getenv(String key, String defaultValue) {
  132. String v = System.getenv(key);
  133. return v != null && !v.isEmpty() ? v : defaultValue;
  134. }
  135. private static final class TenantDb {
  136. String host;
  137. int port;
  138. String database;
  139. String user;
  140. String password;
  141. }
  142. }