clawsql 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.env.example +97 -0
  2. package/README.md +372 -0
  3. package/dist/__tests__/config/settings.test.d.ts +5 -0
  4. package/dist/__tests__/config/settings.test.d.ts.map +1 -0
  5. package/dist/__tests__/config/settings.test.js +154 -0
  6. package/dist/__tests__/config/settings.test.js.map +1 -0
  7. package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
  8. package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
  9. package/dist/__tests__/core/discovery/topology.test.js +191 -0
  10. package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
  11. package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
  12. package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/core/failover/executor.test.js +256 -0
  14. package/dist/__tests__/core/failover/executor.test.js.map +1 -0
  15. package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
  16. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
  17. package/dist/__tests__/core/monitoring/collector.test.js +131 -0
  18. package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
  19. package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
  20. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
  21. package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
  22. package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
  23. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
  24. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
  25. package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
  26. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
  27. package/dist/__tests__/types/index.test.d.ts +5 -0
  28. package/dist/__tests__/types/index.test.d.ts.map +1 -0
  29. package/dist/__tests__/types/index.test.js +290 -0
  30. package/dist/__tests__/types/index.test.js.map +1 -0
  31. package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
  32. package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/exceptions.test.js +142 -0
  34. package/dist/__tests__/utils/exceptions.test.js.map +1 -0
  35. package/dist/api/routes/clusters.d.ts +7 -0
  36. package/dist/api/routes/clusters.d.ts.map +1 -0
  37. package/dist/api/routes/clusters.js +123 -0
  38. package/dist/api/routes/clusters.js.map +1 -0
  39. package/dist/api/routes/config.d.ts +7 -0
  40. package/dist/api/routes/config.d.ts.map +1 -0
  41. package/dist/api/routes/config.js +65 -0
  42. package/dist/api/routes/config.js.map +1 -0
  43. package/dist/api/routes/failover.d.ts +7 -0
  44. package/dist/api/routes/failover.d.ts.map +1 -0
  45. package/dist/api/routes/failover.js +100 -0
  46. package/dist/api/routes/failover.js.map +1 -0
  47. package/dist/api/routes/instances.d.ts +11 -0
  48. package/dist/api/routes/instances.d.ts.map +1 -0
  49. package/dist/api/routes/instances.js +315 -0
  50. package/dist/api/routes/instances.js.map +1 -0
  51. package/dist/api/routes/monitoring.d.ts +7 -0
  52. package/dist/api/routes/monitoring.d.ts.map +1 -0
  53. package/dist/api/routes/monitoring.js +72 -0
  54. package/dist/api/routes/monitoring.js.map +1 -0
  55. package/dist/api/routes/webhooks.d.ts +12 -0
  56. package/dist/api/routes/webhooks.d.ts.map +1 -0
  57. package/dist/api/routes/webhooks.js +232 -0
  58. package/dist/api/routes/webhooks.js.map +1 -0
  59. package/dist/api/schemas/index.d.ts +965 -0
  60. package/dist/api/schemas/index.d.ts.map +1 -0
  61. package/dist/api/schemas/index.js +171 -0
  62. package/dist/api/schemas/index.js.map +1 -0
  63. package/dist/app.d.ts +13 -0
  64. package/dist/app.d.ts.map +1 -0
  65. package/dist/app.js +197 -0
  66. package/dist/app.js.map +1 -0
  67. package/dist/bin/clawsql.d.ts +12 -0
  68. package/dist/bin/clawsql.d.ts.map +1 -0
  69. package/dist/bin/clawsql.js +43 -0
  70. package/dist/bin/clawsql.js.map +1 -0
  71. package/dist/cli/agent/handler.d.ts +73 -0
  72. package/dist/cli/agent/handler.d.ts.map +1 -0
  73. package/dist/cli/agent/handler.js +258 -0
  74. package/dist/cli/agent/handler.js.map +1 -0
  75. package/dist/cli/agent/index.d.ts +14 -0
  76. package/dist/cli/agent/index.d.ts.map +1 -0
  77. package/dist/cli/agent/index.js +30 -0
  78. package/dist/cli/agent/index.js.map +1 -0
  79. package/dist/cli/agent/openclaw-integration.d.ts +81 -0
  80. package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
  81. package/dist/cli/agent/openclaw-integration.js +341 -0
  82. package/dist/cli/agent/openclaw-integration.js.map +1 -0
  83. package/dist/cli/agent/providers/anthropic.d.ts +27 -0
  84. package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
  85. package/dist/cli/agent/providers/anthropic.js +106 -0
  86. package/dist/cli/agent/providers/anthropic.js.map +1 -0
  87. package/dist/cli/agent/providers/base.d.ts +91 -0
  88. package/dist/cli/agent/providers/base.d.ts.map +1 -0
  89. package/dist/cli/agent/providers/base.js +24 -0
  90. package/dist/cli/agent/providers/base.js.map +1 -0
  91. package/dist/cli/agent/providers/openai.d.ts +27 -0
  92. package/dist/cli/agent/providers/openai.d.ts.map +1 -0
  93. package/dist/cli/agent/providers/openai.js +98 -0
  94. package/dist/cli/agent/providers/openai.js.map +1 -0
  95. package/dist/cli/agent/tools/index.d.ts +32 -0
  96. package/dist/cli/agent/tools/index.d.ts.map +1 -0
  97. package/dist/cli/agent/tools/index.js +263 -0
  98. package/dist/cli/agent/tools/index.js.map +1 -0
  99. package/dist/cli/commands/cleanup.d.ts +12 -0
  100. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  101. package/dist/cli/commands/cleanup.js +205 -0
  102. package/dist/cli/commands/cleanup.js.map +1 -0
  103. package/dist/cli/commands/clusters.d.ts +12 -0
  104. package/dist/cli/commands/clusters.d.ts.map +1 -0
  105. package/dist/cli/commands/clusters.js +468 -0
  106. package/dist/cli/commands/clusters.js.map +1 -0
  107. package/dist/cli/commands/config.d.ts +12 -0
  108. package/dist/cli/commands/config.d.ts.map +1 -0
  109. package/dist/cli/commands/config.js +406 -0
  110. package/dist/cli/commands/config.js.map +1 -0
  111. package/dist/cli/commands/cron.d.ts +12 -0
  112. package/dist/cli/commands/cron.d.ts.map +1 -0
  113. package/dist/cli/commands/cron.js +215 -0
  114. package/dist/cli/commands/cron.js.map +1 -0
  115. package/dist/cli/commands/doctor.d.ts +13 -0
  116. package/dist/cli/commands/doctor.d.ts.map +1 -0
  117. package/dist/cli/commands/doctor.js +687 -0
  118. package/dist/cli/commands/doctor.js.map +1 -0
  119. package/dist/cli/commands/failover.d.ts +16 -0
  120. package/dist/cli/commands/failover.d.ts.map +1 -0
  121. package/dist/cli/commands/failover.js +333 -0
  122. package/dist/cli/commands/failover.js.map +1 -0
  123. package/dist/cli/commands/health.d.ts +12 -0
  124. package/dist/cli/commands/health.d.ts.map +1 -0
  125. package/dist/cli/commands/health.js +125 -0
  126. package/dist/cli/commands/health.js.map +1 -0
  127. package/dist/cli/commands/help.d.ts +12 -0
  128. package/dist/cli/commands/help.d.ts.map +1 -0
  129. package/dist/cli/commands/help.js +52 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/instances.d.ts +12 -0
  132. package/dist/cli/commands/instances.d.ts.map +1 -0
  133. package/dist/cli/commands/instances.js +801 -0
  134. package/dist/cli/commands/instances.js.map +1 -0
  135. package/dist/cli/commands/notify.d.ts +12 -0
  136. package/dist/cli/commands/notify.d.ts.map +1 -0
  137. package/dist/cli/commands/notify.js +43 -0
  138. package/dist/cli/commands/notify.js.map +1 -0
  139. package/dist/cli/commands/sql.d.ts +12 -0
  140. package/dist/cli/commands/sql.d.ts.map +1 -0
  141. package/dist/cli/commands/sql.js +90 -0
  142. package/dist/cli/commands/sql.js.map +1 -0
  143. package/dist/cli/commands/start.d.ts +12 -0
  144. package/dist/cli/commands/start.d.ts.map +1 -0
  145. package/dist/cli/commands/start.js +174 -0
  146. package/dist/cli/commands/start.js.map +1 -0
  147. package/dist/cli/commands/status.d.ts +12 -0
  148. package/dist/cli/commands/status.d.ts.map +1 -0
  149. package/dist/cli/commands/status.js +218 -0
  150. package/dist/cli/commands/status.js.map +1 -0
  151. package/dist/cli/commands/stop.d.ts +12 -0
  152. package/dist/cli/commands/stop.d.ts.map +1 -0
  153. package/dist/cli/commands/stop.js +128 -0
  154. package/dist/cli/commands/stop.js.map +1 -0
  155. package/dist/cli/commands/topology.d.ts +12 -0
  156. package/dist/cli/commands/topology.d.ts.map +1 -0
  157. package/dist/cli/commands/topology.js +106 -0
  158. package/dist/cli/commands/topology.js.map +1 -0
  159. package/dist/cli/completer.d.ts +47 -0
  160. package/dist/cli/completer.d.ts.map +1 -0
  161. package/dist/cli/completer.js +332 -0
  162. package/dist/cli/completer.js.map +1 -0
  163. package/dist/cli/formatter.d.ts +165 -0
  164. package/dist/cli/formatter.d.ts.map +1 -0
  165. package/dist/cli/formatter.js +408 -0
  166. package/dist/cli/formatter.js.map +1 -0
  167. package/dist/cli/index.d.ts +21 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +79 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/raw-input.d.ts +97 -0
  172. package/dist/cli/raw-input.d.ts.map +1 -0
  173. package/dist/cli/raw-input.js +493 -0
  174. package/dist/cli/raw-input.js.map +1 -0
  175. package/dist/cli/registry.d.ts +103 -0
  176. package/dist/cli/registry.d.ts.map +1 -0
  177. package/dist/cli/registry.js +205 -0
  178. package/dist/cli/registry.js.map +1 -0
  179. package/dist/cli/repl.d.ts +83 -0
  180. package/dist/cli/repl.d.ts.map +1 -0
  181. package/dist/cli/repl.js +447 -0
  182. package/dist/cli/repl.js.map +1 -0
  183. package/dist/cli/ui/components.d.ts +144 -0
  184. package/dist/cli/ui/components.d.ts.map +1 -0
  185. package/dist/cli/ui/components.js +331 -0
  186. package/dist/cli/ui/components.js.map +1 -0
  187. package/dist/cli/ui/index.d.ts +7 -0
  188. package/dist/cli/ui/index.d.ts.map +1 -0
  189. package/dist/cli/ui/index.js +23 -0
  190. package/dist/cli/ui/index.js.map +1 -0
  191. package/dist/cli/utils/docker-files.d.ts +39 -0
  192. package/dist/cli/utils/docker-files.d.ts.map +1 -0
  193. package/dist/cli/utils/docker-files.js +223 -0
  194. package/dist/cli/utils/docker-files.js.map +1 -0
  195. package/dist/cli/utils/docker-prereq.d.ts +48 -0
  196. package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
  197. package/dist/cli/utils/docker-prereq.js +203 -0
  198. package/dist/cli/utils/docker-prereq.js.map +1 -0
  199. package/dist/config/settings.d.ts +594 -0
  200. package/dist/config/settings.d.ts.map +1 -0
  201. package/dist/config/settings.js +250 -0
  202. package/dist/config/settings.js.map +1 -0
  203. package/dist/core/discovery/cluster-view.d.ts +50 -0
  204. package/dist/core/discovery/cluster-view.d.ts.map +1 -0
  205. package/dist/core/discovery/cluster-view.js +235 -0
  206. package/dist/core/discovery/cluster-view.js.map +1 -0
  207. package/dist/core/discovery/scanner.d.ts +70 -0
  208. package/dist/core/discovery/scanner.d.ts.map +1 -0
  209. package/dist/core/discovery/scanner.js +197 -0
  210. package/dist/core/discovery/scanner.js.map +1 -0
  211. package/dist/core/discovery/topology.d.ts +118 -0
  212. package/dist/core/discovery/topology.d.ts.map +1 -0
  213. package/dist/core/discovery/topology.js +550 -0
  214. package/dist/core/discovery/topology.js.map +1 -0
  215. package/dist/core/failover/candidate-selector.d.ts +46 -0
  216. package/dist/core/failover/candidate-selector.d.ts.map +1 -0
  217. package/dist/core/failover/candidate-selector.js +70 -0
  218. package/dist/core/failover/candidate-selector.js.map +1 -0
  219. package/dist/core/failover/executor.d.ts +104 -0
  220. package/dist/core/failover/executor.d.ts.map +1 -0
  221. package/dist/core/failover/executor.js +248 -0
  222. package/dist/core/failover/executor.js.map +1 -0
  223. package/dist/core/failover/operation-builder.d.ts +71 -0
  224. package/dist/core/failover/operation-builder.d.ts.map +1 -0
  225. package/dist/core/failover/operation-builder.js +157 -0
  226. package/dist/core/failover/operation-builder.js.map +1 -0
  227. package/dist/core/failover/operation-runner.d.ts +75 -0
  228. package/dist/core/failover/operation-runner.d.ts.map +1 -0
  229. package/dist/core/failover/operation-runner.js +191 -0
  230. package/dist/core/failover/operation-runner.js.map +1 -0
  231. package/dist/core/failover/promoter.d.ts +33 -0
  232. package/dist/core/failover/promoter.d.ts.map +1 -0
  233. package/dist/core/failover/promoter.js +97 -0
  234. package/dist/core/failover/promoter.js.map +1 -0
  235. package/dist/core/failover/recovery-manager.d.ts +47 -0
  236. package/dist/core/failover/recovery-manager.d.ts.map +1 -0
  237. package/dist/core/failover/recovery-manager.js +145 -0
  238. package/dist/core/failover/recovery-manager.js.map +1 -0
  239. package/dist/core/failover/types.d.ts +54 -0
  240. package/dist/core/failover/types.d.ts.map +1 -0
  241. package/dist/core/failover/types.js +8 -0
  242. package/dist/core/failover/types.js.map +1 -0
  243. package/dist/core/monitoring/collector.d.ts +25 -0
  244. package/dist/core/monitoring/collector.d.ts.map +1 -0
  245. package/dist/core/monitoring/collector.js +115 -0
  246. package/dist/core/monitoring/collector.js.map +1 -0
  247. package/dist/core/monitoring/exporters.d.ts +49 -0
  248. package/dist/core/monitoring/exporters.d.ts.map +1 -0
  249. package/dist/core/monitoring/exporters.js +126 -0
  250. package/dist/core/monitoring/exporters.js.map +1 -0
  251. package/dist/core/routing/proxysql-manager.d.ts +213 -0
  252. package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
  253. package/dist/core/routing/proxysql-manager.js +632 -0
  254. package/dist/core/routing/proxysql-manager.js.map +1 -0
  255. package/dist/core/sync/replica-recovery.d.ts +40 -0
  256. package/dist/core/sync/replica-recovery.d.ts.map +1 -0
  257. package/dist/core/sync/replica-recovery.js +134 -0
  258. package/dist/core/sync/replica-recovery.js.map +1 -0
  259. package/dist/core/sync/sync-coordinator.d.ts +83 -0
  260. package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
  261. package/dist/core/sync/sync-coordinator.js +254 -0
  262. package/dist/core/sync/sync-coordinator.js.map +1 -0
  263. package/dist/core/sync/topology-watcher.d.ts +76 -0
  264. package/dist/core/sync/topology-watcher.d.ts.map +1 -0
  265. package/dist/core/sync/topology-watcher.js +222 -0
  266. package/dist/core/sync/topology-watcher.js.map +1 -0
  267. package/dist/core/sync/types.d.ts +85 -0
  268. package/dist/core/sync/types.d.ts.map +1 -0
  269. package/dist/core/sync/types.js +8 -0
  270. package/dist/core/sync/types.js.map +1 -0
  271. package/dist/index.d.ts +5 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +9 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/types/index.d.ts +212 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +153 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/database.d.ts +62 -0
  280. package/dist/utils/database.d.ts.map +1 -0
  281. package/dist/utils/database.js +257 -0
  282. package/dist/utils/database.js.map +1 -0
  283. package/dist/utils/exceptions.d.ts +69 -0
  284. package/dist/utils/exceptions.d.ts.map +1 -0
  285. package/dist/utils/exceptions.js +121 -0
  286. package/dist/utils/exceptions.js.map +1 -0
  287. package/dist/utils/logger.d.ts +20 -0
  288. package/dist/utils/logger.d.ts.map +1 -0
  289. package/dist/utils/logger.js +90 -0
  290. package/dist/utils/logger.js.map +1 -0
  291. package/dist/utils/mysql-client.d.ts +43 -0
  292. package/dist/utils/mysql-client.d.ts.map +1 -0
  293. package/dist/utils/mysql-client.js +125 -0
  294. package/dist/utils/mysql-client.js.map +1 -0
  295. package/docker/Dockerfile +61 -0
  296. package/docker/Dockerfile.node +41 -0
  297. package/docker/grafana/dashboards/clawsql.json +212 -0
  298. package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
  299. package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
  300. package/docker/init/primary.sql +26 -0
  301. package/docker/init/replica.sql +16 -0
  302. package/docker/orchestrator/orchestrator.conf.json +98 -0
  303. package/docker/prometheus/prometheus.yml +45 -0
  304. package/docker/proxysql/entrypoint.sh +8 -0
  305. package/docker/proxysql/init.sql.demo +30 -0
  306. package/docker/proxysql/proxysql.cnf +38 -0
  307. package/docker-compose.demo.yml +115 -0
  308. package/docker-compose.yml +217 -0
  309. package/init/primary.sql +19 -0
  310. package/init/replica.sql +13 -0
  311. package/package.json +84 -0
@@ -0,0 +1,632 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - ProxySQL Manager
4
+ *
5
+ * Manages ProxySQL configuration and routing.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ProxySQLManager = void 0;
12
+ exports.getProxySQLManager = getProxySQLManager;
13
+ const promise_1 = __importDefault(require("mysql2/promise"));
14
+ const logger_js_1 = require("../../utils/logger.js");
15
+ const database_js_1 = require("../../utils/database.js");
16
+ const logger = (0, logger_js_1.getLogger)('proxysql');
17
+ /**
18
+ * ProxySQL Manager
19
+ */
20
+ class ProxySQLManager {
21
+ connection = null;
22
+ settings;
23
+ hostgroups = new Map();
24
+ servers = new Map();
25
+ rules = [];
26
+ static DEFAULT_WRITER_HOSTGROUP = 10;
27
+ static DEFAULT_READER_HOSTGROUP = 20;
28
+ constructor(settings) {
29
+ this.settings = settings || {
30
+ host: 'proxysql',
31
+ adminPort: 6032,
32
+ mysqlPort: 6033,
33
+ adminUser: 'clawsql',
34
+ adminPassword: 'clawsql',
35
+ };
36
+ }
37
+ /**
38
+ * Connect to ProxySQL admin interface
39
+ */
40
+ async connect() {
41
+ logger.info({ host: this.settings.host, port: this.settings.adminPort }, 'Connecting to ProxySQL');
42
+ this.connection = await promise_1.default.createConnection({
43
+ host: this.settings.host,
44
+ port: this.settings.adminPort,
45
+ user: this.settings.adminUser,
46
+ password: this.settings.adminPassword,
47
+ });
48
+ logger.info('ProxySQL connection established');
49
+ }
50
+ /**
51
+ * Close the connection
52
+ */
53
+ async close() {
54
+ if (this.connection) {
55
+ await this.connection.end();
56
+ this.connection = null;
57
+ logger.info('ProxySQL connection closed');
58
+ }
59
+ }
60
+ /**
61
+ * Execute a query on ProxySQL admin interface
62
+ * Note: ProxySQL admin doesn't support prepared statements, so we use query() instead
63
+ */
64
+ async execute(sql, params = []) {
65
+ if (!this.connection) {
66
+ await this.connect();
67
+ }
68
+ // ProxySQL admin doesn't support prepared statements
69
+ // Use query() with interpolated values
70
+ let querySql = sql;
71
+ if (params.length > 0) {
72
+ // Simple parameter interpolation for ProxySQL
73
+ let paramIndex = 0;
74
+ querySql = sql.replace(/\?/g, () => {
75
+ const value = params[paramIndex++];
76
+ if (value === null || value === undefined) {
77
+ return 'NULL';
78
+ }
79
+ if (typeof value === 'number') {
80
+ return String(value);
81
+ }
82
+ if (typeof value === 'boolean') {
83
+ return value ? '1' : '0';
84
+ }
85
+ // Escape single quotes for string values
86
+ return `'${String(value).replace(/'/g, "''")}'`;
87
+ });
88
+ }
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ const [rows] = await this.connection.query(querySql);
91
+ return rows;
92
+ }
93
+ /**
94
+ * Set monitor credentials
95
+ */
96
+ async setMonitorCredentials(user, password) {
97
+ try {
98
+ await this.execute("UPDATE global_variables SET variable_value = ? WHERE variable_name = 'mysql-monitor_username'", [user]);
99
+ await this.execute("UPDATE global_variables SET variable_value = ? WHERE variable_name = 'mysql-monitor_password'", [password]);
100
+ await this.execute('LOAD MYSQL VARIABLES TO RUNTIME');
101
+ logger.info('Monitor credentials set');
102
+ return true;
103
+ }
104
+ catch (error) {
105
+ logger.error({ error }, 'Failed to set monitor credentials');
106
+ return false;
107
+ }
108
+ }
109
+ /**
110
+ * Add a MySQL server to ProxySQL
111
+ */
112
+ async addServer(instance, hostgroupId, weight = 1, maxConnections = 1000) {
113
+ const server = {
114
+ hostgroupId,
115
+ hostname: instance.host,
116
+ port: instance.port,
117
+ weight,
118
+ status: 'ONLINE',
119
+ maxConnections,
120
+ comment: `ClawSQL: ${instance.host}:${instance.port}`,
121
+ };
122
+ const key = `${hostgroupId}:${instance.host}:${instance.port}`;
123
+ this.servers.set(key, server);
124
+ try {
125
+ await this.execute(`INSERT INTO mysql_servers
126
+ (hostgroup_id, hostname, port, weight, max_connections, comment)
127
+ VALUES (?, ?, ?, ?, ?, ?)`, [hostgroupId, instance.host, instance.port, weight, maxConnections, `ClawSQL: ${instance.host}:${instance.port}`]);
128
+ await this.execute('LOAD MYSQL SERVERS TO RUNTIME');
129
+ logger.info({ host: instance.host, port: instance.port, hostgroupId }, 'Server added to ProxySQL');
130
+ // Mirror to database
131
+ await this.mirrorServer(server, 'INSERT');
132
+ return true;
133
+ }
134
+ catch (error) {
135
+ // Server might already exist
136
+ logger.debug({ error, key }, 'Server may already exist');
137
+ // Still mirror to database in case it's a race condition
138
+ await this.mirrorServer(server, 'INSERT');
139
+ return true;
140
+ }
141
+ }
142
+ /**
143
+ * Register a MySQL instance with ProxySQL
144
+ */
145
+ async registerInstance(instance, isPrimary = false, writerHostgroup = ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, readerHostgroup = ProxySQLManager.DEFAULT_READER_HOSTGROUP) {
146
+ const hostgroupId = isPrimary ? writerHostgroup : readerHostgroup;
147
+ return this.addServer(instance, hostgroupId);
148
+ }
149
+ /**
150
+ * Remove a MySQL server from ProxySQL
151
+ */
152
+ async removeServer(instance, hostgroupId) {
153
+ const server = {
154
+ hostgroupId,
155
+ hostname: instance.host,
156
+ port: instance.port,
157
+ weight: 0,
158
+ status: 'OFFLINE_HARD',
159
+ maxConnections: 0,
160
+ };
161
+ try {
162
+ await this.execute('DELETE FROM mysql_servers WHERE hostname = ? AND port = ? AND hostgroup_id = ?', [instance.host, instance.port, hostgroupId]);
163
+ await this.execute('LOAD MYSQL SERVERS TO RUNTIME');
164
+ await this.execute('SAVE MYSQL SERVERS TO DISK');
165
+ const key = `${hostgroupId}:${instance.host}:${instance.port}`;
166
+ this.servers.delete(key);
167
+ logger.info({ host: instance.host, port: instance.port }, 'Server removed from ProxySQL');
168
+ // Mirror to database (delete)
169
+ await this.mirrorServer(server, 'DELETE');
170
+ return true;
171
+ }
172
+ catch (error) {
173
+ logger.error({ error }, 'Failed to remove server');
174
+ return false;
175
+ }
176
+ }
177
+ /**
178
+ * Setup read/write split routing rules
179
+ */
180
+ async setupReadWriteSplit(_cluster, writerHostgroup = ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, readerHostgroup = ProxySQLManager.DEFAULT_READER_HOSTGROUP) {
181
+ const rules = [
182
+ // Route SELECT ... FOR UPDATE to writer
183
+ {
184
+ ruleId: 1,
185
+ matchPattern: '^SELECT.*FOR UPDATE',
186
+ destinationHostgroup: writerHostgroup,
187
+ apply: true,
188
+ active: true,
189
+ comment: 'Route SELECT FOR UPDATE to writer',
190
+ },
191
+ // Route SELECT queries to reader hostgroup
192
+ {
193
+ ruleId: 2,
194
+ matchPattern: '^SELECT',
195
+ destinationHostgroup: readerHostgroup,
196
+ apply: true,
197
+ active: true,
198
+ comment: 'Route SELECT to readers',
199
+ },
200
+ // Default route to writer
201
+ {
202
+ ruleId: 100,
203
+ matchPattern: '.*',
204
+ destinationHostgroup: writerHostgroup,
205
+ apply: true,
206
+ active: true,
207
+ comment: 'Default route to writer',
208
+ },
209
+ ];
210
+ for (const rule of rules) {
211
+ this.rules.push(rule);
212
+ try {
213
+ await this.execute(`INSERT INTO mysql_query_rules
214
+ (rule_id, active, match_pattern, destination_hostgroup, apply, comment)
215
+ VALUES (?, ?, ?, ?, ?, ?)`, [rule.ruleId, rule.active ? 1 : 0, rule.matchPattern, rule.destinationHostgroup, rule.apply ? 1 : 0, rule.comment || '']);
216
+ // Mirror rule to database
217
+ await this.mirrorQueryRule(rule);
218
+ }
219
+ catch {
220
+ // Rule might already exist, still mirror
221
+ await this.mirrorQueryRule(rule);
222
+ }
223
+ }
224
+ await this.execute('LOAD MYSQL QUERY RULES TO RUNTIME');
225
+ await this.execute('SAVE MYSQL QUERY RULES TO DISK');
226
+ logger.info('Read/write split rules configured');
227
+ return true;
228
+ }
229
+ /**
230
+ * Sync an entire cluster to ProxySQL
231
+ */
232
+ async syncCluster(cluster, writerHostgroup = ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, readerHostgroup = ProxySQLManager.DEFAULT_READER_HOSTGROUP, adminUser, adminPassword) {
233
+ const result = {
234
+ clusterId: cluster.clusterId,
235
+ serversAdded: 0,
236
+ serversRemoved: 0,
237
+ hostgroups: { writer: writerHostgroup, reader: readerHostgroup },
238
+ success: true,
239
+ errors: [],
240
+ };
241
+ try {
242
+ // Set monitor credentials if provided
243
+ if (adminUser && adminPassword) {
244
+ await this.setMonitorCredentials(adminUser, adminPassword);
245
+ }
246
+ // Clear existing servers from both hostgroups before adding new ones
247
+ // This ensures stale entries (e.g., old primary in writer hostgroup) are removed
248
+ await this.execute('DELETE FROM mysql_servers WHERE hostgroup_id IN (?, ?)', [writerHostgroup, readerHostgroup]);
249
+ logger.debug({ writerHostgroup, readerHostgroup }, 'Cleared existing servers from hostgroups');
250
+ // Add primary to writer hostgroup
251
+ if (cluster.primary) {
252
+ if (await this.addServer(cluster.primary, writerHostgroup)) {
253
+ result.serversAdded++;
254
+ }
255
+ }
256
+ // Add replicas to reader hostgroup
257
+ for (const replica of cluster.replicas) {
258
+ if (await this.addServer(replica, readerHostgroup)) {
259
+ result.serversAdded++;
260
+ }
261
+ }
262
+ // Setup replication hostgroups for automatic failover detection
263
+ // ProxySQL doesn't support ON DUPLICATE KEY UPDATE, use REPLACE or delete+insert
264
+ try {
265
+ await this.execute(`DELETE FROM mysql_replication_hostgroups WHERE writer_hostgroup = ?`, [writerHostgroup]);
266
+ }
267
+ catch {
268
+ // Ignore if doesn't exist
269
+ }
270
+ await this.execute(`INSERT INTO mysql_replication_hostgroups
271
+ (writer_hostgroup, reader_hostgroup, comment)
272
+ VALUES (?, ?, ?)`, [writerHostgroup, readerHostgroup, `Cluster: ${cluster.name}`]);
273
+ // Mirror hostgroup to database
274
+ await this.mirrorHostgroup(writerHostgroup, readerHostgroup, cluster.clusterId, `Cluster: ${cluster.name}`);
275
+ // Setup read/write split rules
276
+ await this.setupReadWriteSplit(cluster, writerHostgroup, readerHostgroup);
277
+ // Load and save
278
+ await this.loadConfigToRuntime();
279
+ await this.saveConfigToDisk();
280
+ logger.info({ clusterId: cluster.clusterId, serversAdded: result.serversAdded }, 'Cluster synced to ProxySQL');
281
+ }
282
+ catch (error) {
283
+ result.success = false;
284
+ result.errors.push(String(error));
285
+ logger.error({ error, clusterId: cluster.clusterId }, 'Failed to sync cluster');
286
+ }
287
+ return result;
288
+ }
289
+ /**
290
+ * Remove all servers for a cluster from ProxySQL
291
+ */
292
+ async removeCluster(cluster, _writerHostgroup = ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, _readerHostgroup = ProxySQLManager.DEFAULT_READER_HOSTGROUP) {
293
+ try {
294
+ // Remove primary
295
+ if (cluster.primary) {
296
+ await this.execute('DELETE FROM mysql_servers WHERE hostname = ? AND port = ?', [cluster.primary.host, cluster.primary.port]);
297
+ }
298
+ // Remove replicas
299
+ for (const replica of cluster.replicas) {
300
+ await this.execute('DELETE FROM mysql_servers WHERE hostname = ? AND port = ?', [replica.host, replica.port]);
301
+ }
302
+ await this.execute('LOAD MYSQL SERVERS TO RUNTIME');
303
+ await this.execute('SAVE MYSQL SERVERS TO DISK');
304
+ logger.info({ clusterId: cluster.clusterId }, 'Cluster removed from ProxySQL');
305
+ return true;
306
+ }
307
+ catch (error) {
308
+ logger.error({ error }, 'Failed to remove cluster');
309
+ return false;
310
+ }
311
+ }
312
+ /**
313
+ * Load configuration changes to runtime
314
+ */
315
+ async loadConfigToRuntime() {
316
+ try {
317
+ await this.execute('LOAD MYSQL SERVERS TO RUNTIME');
318
+ await this.execute('LOAD MYSQL USERS TO RUNTIME');
319
+ await this.execute('LOAD MYSQL QUERY RULES TO RUNTIME');
320
+ await this.execute('LOAD MYSQL VARIABLES TO RUNTIME');
321
+ return true;
322
+ }
323
+ catch {
324
+ return false;
325
+ }
326
+ }
327
+ /**
328
+ * Save current configuration to disk
329
+ */
330
+ async saveConfigToDisk() {
331
+ try {
332
+ await this.execute('SAVE MYSQL SERVERS TO DISK');
333
+ await this.execute('SAVE MYSQL USERS TO DISK');
334
+ await this.execute('SAVE MYSQL QUERY RULES TO DISK');
335
+ await this.execute('SAVE MYSQL VARIABLES TO DISK');
336
+ return true;
337
+ }
338
+ catch {
339
+ return false;
340
+ }
341
+ }
342
+ /**
343
+ * Get servers configured in ProxySQL (queries live from mysql_servers table)
344
+ */
345
+ async getServers(hostgroupId) {
346
+ try {
347
+ const rows = await this.execute(`SELECT hostgroup_id, hostname, port, weight, status, max_connections, comment
348
+ FROM mysql_servers`);
349
+ const servers = rows.map((row) => ({
350
+ hostgroupId: Number(row.hostgroup_id),
351
+ hostname: row.hostname,
352
+ port: Number(row.port),
353
+ weight: Number(row.weight),
354
+ status: row.status,
355
+ maxConnections: Number(row.max_connections),
356
+ comment: row.comment,
357
+ }));
358
+ // Update in-memory cache
359
+ this.servers.clear();
360
+ for (const server of servers) {
361
+ const key = `${server.hostgroupId}:${server.hostname}:${server.port}`;
362
+ this.servers.set(key, server);
363
+ }
364
+ if (hostgroupId !== undefined) {
365
+ return servers.filter(s => s.hostgroupId === hostgroupId);
366
+ }
367
+ return servers;
368
+ }
369
+ catch (error) {
370
+ logger.error({ error }, 'Failed to get servers from ProxySQL');
371
+ // Fallback to in-memory cache
372
+ const cachedServers = Array.from(this.servers.values());
373
+ if (hostgroupId !== undefined) {
374
+ return cachedServers.filter(s => s.hostgroupId === hostgroupId);
375
+ }
376
+ return cachedServers;
377
+ }
378
+ }
379
+ /**
380
+ * Get live server statistics from ProxySQL stats_mysql_connection_pool
381
+ */
382
+ async getServerStats() {
383
+ try {
384
+ const rows = await this.execute(`SELECT hostgroup, srv_host, srv_port, status,
385
+ ConnUsed, ConnFree, ConnOK, ConnERR, Queries
386
+ FROM stats_mysql_connection_pool`);
387
+ return rows.map((row) => ({
388
+ hostgroupId: Number(row.hostgroup),
389
+ host: row.srv_host,
390
+ port: Number(row.srv_port),
391
+ status: row.status,
392
+ connUsed: Number(row.ConnUsed),
393
+ connFree: Number(row.ConnFree),
394
+ connOk: Number(row.ConnOK),
395
+ connErr: Number(row.ConnERR),
396
+ queries: Number(row.Queries),
397
+ }));
398
+ }
399
+ catch (error) {
400
+ logger.error({ error }, 'Failed to get server stats from ProxySQL');
401
+ return [];
402
+ }
403
+ }
404
+ /**
405
+ * Get replication hostgroup mappings
406
+ */
407
+ async getReplicationHostgroups() {
408
+ try {
409
+ const rows = await this.execute(`SELECT writer_hostgroup, reader_hostgroup, comment
410
+ FROM mysql_replication_hostgroups`);
411
+ return rows.map((row) => ({
412
+ writerHostgroup: Number(row.writer_hostgroup),
413
+ readerHostgroup: Number(row.reader_hostgroup),
414
+ comment: row.comment,
415
+ }));
416
+ }
417
+ catch (error) {
418
+ logger.error({ error }, 'Failed to get replication hostgroups from ProxySQL');
419
+ return [];
420
+ }
421
+ }
422
+ /**
423
+ * Get the MySQL port that clients connect to
424
+ */
425
+ getMySQLPort() {
426
+ return this.settings.mysqlPort;
427
+ }
428
+ /**
429
+ * Get the ProxySQL host
430
+ */
431
+ getHost() {
432
+ return this.settings.host;
433
+ }
434
+ /**
435
+ * Relocate a replica to follow a new primary
436
+ * This is used after failover to reconfigure replicas
437
+ */
438
+ async relocateReplica(replica, newPrimary) {
439
+ logger.info({ replica: `${replica.host}:${replica.port}`, newPrimary: `${newPrimary.host}:${newPrimary.port}` }, 'Relocating replica to follow new primary');
440
+ // This is handled by Orchestrator's relocateReplica method
441
+ // The ProxySQL manager just updates its internal tracking
442
+ // The actual replication change is done via Orchestrator
443
+ return true;
444
+ }
445
+ /**
446
+ * Get configuration summary
447
+ */
448
+ getConfigSummary() {
449
+ return {
450
+ hostgroups: this.hostgroups.size,
451
+ servers: this.servers.size,
452
+ rules: this.rules.length,
453
+ };
454
+ }
455
+ // =========================================================================
456
+ // Database Mirror Methods
457
+ // =========================================================================
458
+ /**
459
+ * Mirror server configuration to metadata database
460
+ */
461
+ async mirrorServer(server, action) {
462
+ const db = (0, database_js_1.getDatabase)();
463
+ try {
464
+ if (action === 'INSERT') {
465
+ await db.execute(`INSERT INTO proxysql_servers (hostgroup_id, hostname, port, status, weight, max_connections, comment)
466
+ VALUES (?, ?, ?, ?, ?, ?, ?)
467
+ ON DUPLICATE KEY UPDATE status = VALUES(status), weight = VALUES(weight), synced_at = NOW()`, [
468
+ server.hostgroupId,
469
+ server.hostname,
470
+ server.port,
471
+ server.status,
472
+ server.weight,
473
+ server.maxConnections,
474
+ server.comment || '',
475
+ ]);
476
+ }
477
+ else {
478
+ await db.execute('DELETE FROM proxysql_servers WHERE hostgroup_id = ? AND hostname = ? AND port = ?', [server.hostgroupId, server.hostname, server.port]);
479
+ }
480
+ // Log to audit
481
+ await this.auditLog(action === 'INSERT' ? 'ADD_SERVER' : 'REMOVE_SERVER', 'server', `${server.hostgroupId}:${server.hostname}:${server.port}`, null, server);
482
+ }
483
+ catch (error) {
484
+ logger.error({ error, server, action }, 'Failed to mirror server to database');
485
+ }
486
+ }
487
+ /**
488
+ * Mirror hostgroup configuration to metadata database
489
+ */
490
+ async mirrorHostgroup(writerHostgroup, readerHostgroup, clusterId, comment) {
491
+ const db = (0, database_js_1.getDatabase)();
492
+ try {
493
+ await db.execute(`INSERT INTO proxysql_hostgroups (writer_hostgroup, reader_hostgroup, cluster_id, comment)
494
+ VALUES (?, ?, ?, ?)
495
+ ON DUPLICATE KEY UPDATE reader_hostgroup = VALUES(reader_hostgroup), cluster_id = VALUES(cluster_id)`, [writerHostgroup, readerHostgroup, clusterId || null, comment || '']);
496
+ await this.auditLog('SYNC_HOSTGROUP', 'hostgroup', `${writerHostgroup}/${readerHostgroup}`, null, { writerHostgroup, readerHostgroup, clusterId });
497
+ }
498
+ catch (error) {
499
+ logger.error({ error, writerHostgroup, readerHostgroup }, 'Failed to mirror hostgroup to database');
500
+ }
501
+ }
502
+ /**
503
+ * Mirror query rule to metadata database
504
+ */
505
+ async mirrorQueryRule(rule) {
506
+ const db = (0, database_js_1.getDatabase)();
507
+ try {
508
+ await db.execute(`INSERT INTO proxysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply, comment)
509
+ VALUES (?, ?, ?, ?, ?, ?)
510
+ ON DUPLICATE KEY UPDATE active = VALUES(active), match_pattern = VALUES(match_pattern)`, [
511
+ rule.ruleId,
512
+ rule.active ? 1 : 0,
513
+ rule.matchPattern,
514
+ rule.destinationHostgroup,
515
+ rule.apply ? 1 : 0,
516
+ rule.comment || '',
517
+ ]);
518
+ }
519
+ catch (error) {
520
+ logger.error({ error, rule }, 'Failed to mirror query rule to database');
521
+ }
522
+ }
523
+ /**
524
+ * Log action to audit table
525
+ */
526
+ async auditLog(action, entityType, entityId, oldValue, newValue) {
527
+ const db = (0, database_js_1.getDatabase)();
528
+ try {
529
+ await db.execute(`INSERT INTO proxysql_audit_log (action, entity_type, entity_id, old_value, new_value)
530
+ VALUES (?, ?, ?, ?, ?)`, [
531
+ action,
532
+ entityType,
533
+ entityId,
534
+ oldValue ? JSON.stringify(oldValue) : null,
535
+ newValue ? JSON.stringify(newValue) : null,
536
+ ]);
537
+ }
538
+ catch (error) {
539
+ logger.error({ error, action, entityType, entityId }, 'Failed to write audit log');
540
+ }
541
+ }
542
+ /**
543
+ * Restore ProxySQL configuration from metadata database
544
+ * Called on startup to sync ProxySQL with stored config
545
+ */
546
+ async restoreFromDatabase() {
547
+ logger.info('Restoring ProxySQL configuration from metadata database');
548
+ const result = { servers: 0, hostgroups: 0, rules: 0 };
549
+ try {
550
+ const db = (0, database_js_1.getDatabase)();
551
+ // Restore servers
552
+ const servers = await db.query('SELECT * FROM proxysql_servers WHERE status = "ONLINE"');
553
+ for (const server of servers) {
554
+ try {
555
+ await this.addServer({ host: server.hostname, port: server.port }, server.hostgroup_id, server.weight, server.max_connections);
556
+ result.servers++;
557
+ }
558
+ catch (error) {
559
+ logger.warn({ error, server }, 'Failed to restore server');
560
+ }
561
+ }
562
+ // Restore hostgroups
563
+ const hostgroups = await db.query('SELECT * FROM proxysql_hostgroups');
564
+ for (const hg of hostgroups) {
565
+ try {
566
+ await this.execute(`INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, comment)
567
+ VALUES (?, ?, ?)`, [hg.writer_hostgroup, hg.reader_hostgroup, hg.comment || '']);
568
+ result.hostgroups++;
569
+ }
570
+ catch (error) {
571
+ logger.debug({ error, hostgroup: hg }, 'Hostgroup may already exist');
572
+ }
573
+ }
574
+ // Restore query rules
575
+ const rules = await db.query('SELECT * FROM proxysql_query_rules WHERE active = 1');
576
+ for (const rule of rules) {
577
+ try {
578
+ await this.execute(`INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply, comment)
579
+ VALUES (?, ?, ?, ?, ?, ?)`, [rule.rule_id, rule.active, rule.match_pattern, rule.destination_hostgroup, rule.apply, rule.comment || '']);
580
+ result.rules++;
581
+ }
582
+ catch (error) {
583
+ logger.debug({ error, rule }, 'Query rule may already exist');
584
+ }
585
+ }
586
+ // Load to runtime
587
+ await this.loadConfigToRuntime();
588
+ logger.info(result, 'ProxySQL configuration restored from database');
589
+ }
590
+ catch (error) {
591
+ logger.error({ error }, 'Failed to restore ProxySQL configuration from database');
592
+ }
593
+ return result;
594
+ }
595
+ /**
596
+ * Get all mirrored servers from database
597
+ */
598
+ async getMirroredServers() {
599
+ const db = (0, database_js_1.getDatabase)();
600
+ const rows = await db.query('SELECT * FROM proxysql_servers ORDER BY hostgroup_id, hostname');
601
+ return rows.map((row) => ({
602
+ hostgroupId: row.hostgroup_id,
603
+ hostname: row.hostname,
604
+ port: row.port,
605
+ status: row.status,
606
+ weight: row.weight,
607
+ maxConnections: row.max_connections,
608
+ comment: row.comment,
609
+ }));
610
+ }
611
+ /**
612
+ * Get audit log entries
613
+ */
614
+ async getAuditLog(limit = 100) {
615
+ const db = (0, database_js_1.getDatabase)();
616
+ return db.query('SELECT * FROM proxysql_audit_log ORDER BY changed_at DESC LIMIT ?', [limit]);
617
+ }
618
+ }
619
+ exports.ProxySQLManager = ProxySQLManager;
620
+ // Singleton instance
621
+ let proxysqlManager = null;
622
+ /**
623
+ * Get the ProxySQL manager instance
624
+ */
625
+ function getProxySQLManager() {
626
+ if (!proxysqlManager) {
627
+ const { getSettings } = require('../../config/settings.js');
628
+ proxysqlManager = new ProxySQLManager(getSettings().proxysql);
629
+ }
630
+ return proxysqlManager;
631
+ }
632
+ //# sourceMappingURL=proxysql-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxysql-manager.js","sourceRoot":"","sources":["../../../src/core/routing/proxysql-manager.ts"],"names":[],"mappings":"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"}