postgresai 0.14.0-dev.42 → 0.14.0-dev.44
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.
- package/bin/postgres-ai.ts +649 -310
- package/bun.lock +258 -0
- package/dist/bin/postgres-ai.js +29491 -1910
- package/dist/sql/01.role.sql +16 -0
- package/dist/sql/02.permissions.sql +37 -0
- package/dist/sql/03.optional_rds.sql +6 -0
- package/dist/sql/04.optional_self_managed.sql +8 -0
- package/dist/sql/05.helpers.sql +415 -0
- package/lib/auth-server.ts +58 -97
- package/lib/checkup-api.ts +175 -0
- package/lib/checkup.ts +833 -0
- package/lib/config.ts +3 -0
- package/lib/init.ts +106 -74
- package/lib/issues.ts +121 -194
- package/lib/mcp-server.ts +6 -17
- package/lib/metrics-loader.ts +156 -0
- package/package.json +13 -9
- package/sql/02.permissions.sql +9 -5
- package/sql/05.helpers.sql +415 -0
- package/test/checkup.test.ts +953 -0
- package/test/init.integration.test.ts +396 -0
- package/test/init.test.ts +345 -0
- package/test/schema-validation.test.ts +188 -0
- package/tsconfig.json +12 -20
- package/dist/bin/postgres-ai.d.ts +0 -3
- package/dist/bin/postgres-ai.d.ts.map +0 -1
- package/dist/bin/postgres-ai.js.map +0 -1
- package/dist/lib/auth-server.d.ts +0 -31
- package/dist/lib/auth-server.d.ts.map +0 -1
- package/dist/lib/auth-server.js +0 -263
- package/dist/lib/auth-server.js.map +0 -1
- package/dist/lib/config.d.ts +0 -45
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -181
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/init.d.ts +0 -85
- package/dist/lib/init.d.ts.map +0 -1
- package/dist/lib/init.js +0 -644
- package/dist/lib/init.js.map +0 -1
- package/dist/lib/issues.d.ts +0 -75
- package/dist/lib/issues.d.ts.map +0 -1
- package/dist/lib/issues.js +0 -336
- package/dist/lib/issues.js.map +0 -1
- package/dist/lib/mcp-server.d.ts +0 -9
- package/dist/lib/mcp-server.d.ts.map +0 -1
- package/dist/lib/mcp-server.js +0 -168
- package/dist/lib/mcp-server.js.map +0 -1
- package/dist/lib/pkce.d.ts +0 -32
- package/dist/lib/pkce.d.ts.map +0 -1
- package/dist/lib/pkce.js +0 -101
- package/dist/lib/pkce.js.map +0 -1
- package/dist/lib/util.d.ts +0 -27
- package/dist/lib/util.d.ts.map +0 -1
- package/dist/lib/util.js +0 -46
- package/dist/lib/util.js.map +0 -1
- package/dist/package.json +0 -46
- package/test/init.integration.test.cjs +0 -382
- package/test/init.test.cjs +0 -392
package/dist/lib/init.js
DELETED
|
@@ -1,644 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.DEFAULT_MONITORING_USER = void 0;
|
|
37
|
-
exports.connectWithSslFallback = connectWithSslFallback;
|
|
38
|
-
exports.redactPasswordsInSql = redactPasswordsInSql;
|
|
39
|
-
exports.maskConnectionString = maskConnectionString;
|
|
40
|
-
exports.parseLibpqConninfo = parseLibpqConninfo;
|
|
41
|
-
exports.describePgConfig = describePgConfig;
|
|
42
|
-
exports.resolveAdminConnection = resolveAdminConnection;
|
|
43
|
-
exports.resolveMonitoringPassword = resolveMonitoringPassword;
|
|
44
|
-
exports.buildInitPlan = buildInitPlan;
|
|
45
|
-
exports.applyInitPlan = applyInitPlan;
|
|
46
|
-
exports.verifyInitSetup = verifyInitSetup;
|
|
47
|
-
const crypto_1 = require("crypto");
|
|
48
|
-
const url_1 = require("url");
|
|
49
|
-
const fs = __importStar(require("fs"));
|
|
50
|
-
const path = __importStar(require("path"));
|
|
51
|
-
exports.DEFAULT_MONITORING_USER = "postgres_ai_mon";
|
|
52
|
-
/**
|
|
53
|
-
* Convert PostgreSQL sslmode to node-postgres ssl config.
|
|
54
|
-
*/
|
|
55
|
-
function sslModeToConfig(mode) {
|
|
56
|
-
if (mode.toLowerCase() === "disable")
|
|
57
|
-
return false;
|
|
58
|
-
if (mode.toLowerCase() === "verify-full" || mode.toLowerCase() === "verify-ca")
|
|
59
|
-
return true;
|
|
60
|
-
// For require/prefer/allow: encrypt without certificate verification
|
|
61
|
-
return { rejectUnauthorized: false };
|
|
62
|
-
}
|
|
63
|
-
/** Extract sslmode from a PostgreSQL connection URI. */
|
|
64
|
-
function extractSslModeFromUri(uri) {
|
|
65
|
-
try {
|
|
66
|
-
return new url_1.URL(uri).searchParams.get("sslmode") ?? undefined;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return uri.match(/[?&]sslmode=([^&]+)/i)?.[1];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/** Remove sslmode parameter from a PostgreSQL connection URI. */
|
|
73
|
-
function stripSslModeFromUri(uri) {
|
|
74
|
-
try {
|
|
75
|
-
const u = new url_1.URL(uri);
|
|
76
|
-
u.searchParams.delete("sslmode");
|
|
77
|
-
return u.toString();
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Fallback regex for malformed URIs
|
|
81
|
-
return uri
|
|
82
|
-
.replace(/[?&]sslmode=[^&]*/gi, "")
|
|
83
|
-
.replace(/\?&/, "?")
|
|
84
|
-
.replace(/\?$/, "");
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if an error indicates SSL negotiation failed and fallback to non-SSL should be attempted.
|
|
89
|
-
* This mimics libpq's sslmode=prefer behavior.
|
|
90
|
-
*
|
|
91
|
-
* IMPORTANT: This should NOT match certificate errors (expired, invalid, self-signed)
|
|
92
|
-
* as those are real errors the user needs to fix, not negotiation failures.
|
|
93
|
-
*/
|
|
94
|
-
function isSslNegotiationError(err) {
|
|
95
|
-
if (!err || typeof err !== "object")
|
|
96
|
-
return false;
|
|
97
|
-
const e = err;
|
|
98
|
-
const msg = typeof e.message === "string" ? e.message.toLowerCase() : "";
|
|
99
|
-
const code = typeof e.code === "string" ? e.code : "";
|
|
100
|
-
// Specific patterns that indicate server doesn't support SSL (should fallback)
|
|
101
|
-
const fallbackPatterns = [
|
|
102
|
-
"the server does not support ssl",
|
|
103
|
-
"ssl off",
|
|
104
|
-
"server does not support ssl connections",
|
|
105
|
-
];
|
|
106
|
-
for (const pattern of fallbackPatterns) {
|
|
107
|
-
if (msg.includes(pattern))
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
// PostgreSQL error code 08P01 (protocol violation) during initial connection
|
|
111
|
-
// often indicates SSL negotiation mismatch, but only if the message suggests it
|
|
112
|
-
if (code === "08P01" && (msg.includes("ssl") || msg.includes("unsupported"))) {
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Connect to PostgreSQL with sslmode=prefer-like behavior.
|
|
119
|
-
* If sslFallbackEnabled is true, tries SSL first, then falls back to non-SSL on failure.
|
|
120
|
-
*/
|
|
121
|
-
async function connectWithSslFallback(ClientClass, adminConn, verbose) {
|
|
122
|
-
const tryConnect = async (config) => {
|
|
123
|
-
const client = new ClientClass(config);
|
|
124
|
-
await client.connect();
|
|
125
|
-
return client;
|
|
126
|
-
};
|
|
127
|
-
// If SSL was explicitly set or no SSL configured, just try once
|
|
128
|
-
if (!adminConn.sslFallbackEnabled) {
|
|
129
|
-
const client = await tryConnect(adminConn.clientConfig);
|
|
130
|
-
return { client, usedSsl: !!adminConn.clientConfig.ssl };
|
|
131
|
-
}
|
|
132
|
-
// sslmode=prefer behavior: try SSL first, fallback to non-SSL
|
|
133
|
-
try {
|
|
134
|
-
const client = await tryConnect(adminConn.clientConfig);
|
|
135
|
-
return { client, usedSsl: true };
|
|
136
|
-
}
|
|
137
|
-
catch (sslErr) {
|
|
138
|
-
if (!isSslNegotiationError(sslErr)) {
|
|
139
|
-
// Not an SSL error, don't retry
|
|
140
|
-
throw sslErr;
|
|
141
|
-
}
|
|
142
|
-
if (verbose) {
|
|
143
|
-
console.log("SSL connection failed, retrying without SSL...");
|
|
144
|
-
}
|
|
145
|
-
// Retry without SSL
|
|
146
|
-
const noSslConfig = { ...adminConn.clientConfig, ssl: false };
|
|
147
|
-
try {
|
|
148
|
-
const client = await tryConnect(noSslConfig);
|
|
149
|
-
return { client, usedSsl: false };
|
|
150
|
-
}
|
|
151
|
-
catch (noSslErr) {
|
|
152
|
-
// If non-SSL also fails, check if it's "SSL required" - throw that instead
|
|
153
|
-
if (isSslNegotiationError(noSslErr)) {
|
|
154
|
-
const msg = noSslErr?.message || "";
|
|
155
|
-
if (msg.toLowerCase().includes("ssl") && msg.toLowerCase().includes("required")) {
|
|
156
|
-
// Server requires SSL but SSL attempt failed - throw original SSL error
|
|
157
|
-
throw sslErr;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// Throw the non-SSL error (it's more relevant since SSL attempt also failed)
|
|
161
|
-
throw noSslErr;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
function packageRootDirFromCompiled() {
|
|
166
|
-
// dist/lib/init.js -> <pkg>/dist/lib ; package root is ../..
|
|
167
|
-
return path.resolve(__dirname, "..", "..");
|
|
168
|
-
}
|
|
169
|
-
function sqlDir() {
|
|
170
|
-
return path.join(packageRootDirFromCompiled(), "sql");
|
|
171
|
-
}
|
|
172
|
-
function loadSqlTemplate(filename) {
|
|
173
|
-
const p = path.join(sqlDir(), filename);
|
|
174
|
-
return fs.readFileSync(p, "utf8");
|
|
175
|
-
}
|
|
176
|
-
function applyTemplate(sql, vars) {
|
|
177
|
-
return sql.replace(/\{\{([A-Z0-9_]+)\}\}/g, (_, key) => {
|
|
178
|
-
const v = vars[key];
|
|
179
|
-
if (v === undefined)
|
|
180
|
-
throw new Error(`Missing SQL template var: ${key}`);
|
|
181
|
-
return v;
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
function quoteIdent(ident) {
|
|
185
|
-
// Always quote. Escape embedded quotes by doubling.
|
|
186
|
-
if (ident.includes("\0")) {
|
|
187
|
-
throw new Error("Identifier cannot contain null bytes");
|
|
188
|
-
}
|
|
189
|
-
return `"${ident.replace(/"/g, "\"\"")}"`;
|
|
190
|
-
}
|
|
191
|
-
function quoteLiteral(value) {
|
|
192
|
-
// Single-quote and escape embedded quotes by doubling.
|
|
193
|
-
// This is used where Postgres grammar requires a literal (e.g., CREATE/ALTER ROLE PASSWORD).
|
|
194
|
-
if (value.includes("\0")) {
|
|
195
|
-
throw new Error("Literal cannot contain null bytes");
|
|
196
|
-
}
|
|
197
|
-
return `'${value.replace(/'/g, "''")}'`;
|
|
198
|
-
}
|
|
199
|
-
function redactPasswordsInSql(sql) {
|
|
200
|
-
// Replace PASSWORD '<literal>' (handles doubled quotes inside).
|
|
201
|
-
return sql.replace(/password\s+'(?:''|[^'])*'/gi, "password '<redacted>'");
|
|
202
|
-
}
|
|
203
|
-
function maskConnectionString(dbUrl) {
|
|
204
|
-
// Hide password if present (postgresql://user:pass@host/db).
|
|
205
|
-
try {
|
|
206
|
-
const u = new url_1.URL(dbUrl);
|
|
207
|
-
if (u.password)
|
|
208
|
-
u.password = "*****";
|
|
209
|
-
return u.toString();
|
|
210
|
-
}
|
|
211
|
-
catch {
|
|
212
|
-
return dbUrl.replace(/\/\/([^:/?#]+):([^@/?#]+)@/g, "//$1:*****@");
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
function isLikelyUri(value) {
|
|
216
|
-
return /^postgres(ql)?:\/\//i.test(value.trim());
|
|
217
|
-
}
|
|
218
|
-
function tokenizeConninfo(input) {
|
|
219
|
-
const s = input.trim();
|
|
220
|
-
const tokens = [];
|
|
221
|
-
let i = 0;
|
|
222
|
-
const isSpace = (ch) => ch === " " || ch === "\t" || ch === "\n" || ch === "\r";
|
|
223
|
-
while (i < s.length) {
|
|
224
|
-
while (i < s.length && isSpace(s[i]))
|
|
225
|
-
i++;
|
|
226
|
-
if (i >= s.length)
|
|
227
|
-
break;
|
|
228
|
-
let tok = "";
|
|
229
|
-
let inSingle = false;
|
|
230
|
-
while (i < s.length) {
|
|
231
|
-
const ch = s[i];
|
|
232
|
-
if (!inSingle && isSpace(ch))
|
|
233
|
-
break;
|
|
234
|
-
if (ch === "'" && !inSingle) {
|
|
235
|
-
inSingle = true;
|
|
236
|
-
i++;
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
if (ch === "'" && inSingle) {
|
|
240
|
-
inSingle = false;
|
|
241
|
-
i++;
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
if (ch === "\\" && i + 1 < s.length) {
|
|
245
|
-
tok += s[i + 1];
|
|
246
|
-
i += 2;
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
tok += ch;
|
|
250
|
-
i++;
|
|
251
|
-
}
|
|
252
|
-
tokens.push(tok);
|
|
253
|
-
while (i < s.length && isSpace(s[i]))
|
|
254
|
-
i++;
|
|
255
|
-
}
|
|
256
|
-
return tokens;
|
|
257
|
-
}
|
|
258
|
-
function parseLibpqConninfo(input) {
|
|
259
|
-
const tokens = tokenizeConninfo(input);
|
|
260
|
-
const cfg = {};
|
|
261
|
-
let sslmode;
|
|
262
|
-
for (const t of tokens) {
|
|
263
|
-
const eq = t.indexOf("=");
|
|
264
|
-
if (eq <= 0)
|
|
265
|
-
continue;
|
|
266
|
-
const key = t.slice(0, eq).trim();
|
|
267
|
-
const rawVal = t.slice(eq + 1);
|
|
268
|
-
const val = rawVal.trim();
|
|
269
|
-
if (!key)
|
|
270
|
-
continue;
|
|
271
|
-
switch (key) {
|
|
272
|
-
case "host":
|
|
273
|
-
cfg.host = val;
|
|
274
|
-
break;
|
|
275
|
-
case "port": {
|
|
276
|
-
const p = Number(val);
|
|
277
|
-
if (Number.isFinite(p))
|
|
278
|
-
cfg.port = p;
|
|
279
|
-
break;
|
|
280
|
-
}
|
|
281
|
-
case "user":
|
|
282
|
-
cfg.user = val;
|
|
283
|
-
break;
|
|
284
|
-
case "password":
|
|
285
|
-
cfg.password = val;
|
|
286
|
-
break;
|
|
287
|
-
case "dbname":
|
|
288
|
-
case "database":
|
|
289
|
-
cfg.database = val;
|
|
290
|
-
break;
|
|
291
|
-
case "sslmode":
|
|
292
|
-
sslmode = val;
|
|
293
|
-
break;
|
|
294
|
-
// ignore everything else (options, application_name, etc.)
|
|
295
|
-
default:
|
|
296
|
-
break;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
// Apply SSL configuration based on sslmode
|
|
300
|
-
if (sslmode) {
|
|
301
|
-
cfg.ssl = sslModeToConfig(sslmode);
|
|
302
|
-
}
|
|
303
|
-
return cfg;
|
|
304
|
-
}
|
|
305
|
-
function describePgConfig(cfg) {
|
|
306
|
-
if (cfg.connectionString)
|
|
307
|
-
return maskConnectionString(cfg.connectionString);
|
|
308
|
-
const user = cfg.user ? cfg.user : "<user>";
|
|
309
|
-
const host = cfg.host ? cfg.host : "<host>";
|
|
310
|
-
const port = cfg.port ? String(cfg.port) : "<port>";
|
|
311
|
-
const db = cfg.database ? cfg.database : "<db>";
|
|
312
|
-
// Don't include password
|
|
313
|
-
return `postgresql://${user}:*****@${host}:${port}/${db}`;
|
|
314
|
-
}
|
|
315
|
-
function resolveAdminConnection(opts) {
|
|
316
|
-
const conn = (opts.conn || "").trim();
|
|
317
|
-
const dbUrlFlag = (opts.dbUrlFlag || "").trim();
|
|
318
|
-
// Resolve explicit SSL setting from environment (undefined = auto-detect)
|
|
319
|
-
const explicitSsl = process.env.PGSSLMODE;
|
|
320
|
-
// NOTE: passwords alone (PGPASSWORD / --admin-password) do NOT constitute a connection.
|
|
321
|
-
// We require at least some connection addressing (host/port/user/db) if no positional arg / --db-url is provided.
|
|
322
|
-
const hasConnDetails = !!(opts.host || opts.port || opts.username || opts.dbname);
|
|
323
|
-
if (conn && dbUrlFlag) {
|
|
324
|
-
throw new Error("Provide either positional connection string or --db-url, not both");
|
|
325
|
-
}
|
|
326
|
-
if (conn || dbUrlFlag) {
|
|
327
|
-
const v = conn || dbUrlFlag;
|
|
328
|
-
if (isLikelyUri(v)) {
|
|
329
|
-
const urlSslMode = extractSslModeFromUri(v);
|
|
330
|
-
const effectiveSslMode = explicitSsl || urlSslMode;
|
|
331
|
-
// SSL priority: PGSSLMODE env > URL param > auto (sslmode=prefer behavior)
|
|
332
|
-
const sslConfig = effectiveSslMode
|
|
333
|
-
? sslModeToConfig(effectiveSslMode)
|
|
334
|
-
: { rejectUnauthorized: false }; // Default: try SSL (with fallback)
|
|
335
|
-
// Enable fallback for: no explicit mode OR explicit "prefer"/"allow"
|
|
336
|
-
const shouldFallback = !effectiveSslMode ||
|
|
337
|
-
effectiveSslMode.toLowerCase() === "prefer" ||
|
|
338
|
-
effectiveSslMode.toLowerCase() === "allow";
|
|
339
|
-
// Strip sslmode from URI so pg uses our ssl config object instead
|
|
340
|
-
const cleanUri = stripSslModeFromUri(v);
|
|
341
|
-
return {
|
|
342
|
-
clientConfig: { connectionString: cleanUri, ssl: sslConfig },
|
|
343
|
-
display: maskConnectionString(v),
|
|
344
|
-
sslFallbackEnabled: shouldFallback,
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
// libpq conninfo (dbname=... host=...)
|
|
348
|
-
const cfg = parseLibpqConninfo(v);
|
|
349
|
-
if (opts.envPassword && !cfg.password)
|
|
350
|
-
cfg.password = opts.envPassword;
|
|
351
|
-
const cfgHadSsl = cfg.ssl !== undefined;
|
|
352
|
-
if (cfg.ssl === undefined) {
|
|
353
|
-
if (explicitSsl)
|
|
354
|
-
cfg.ssl = sslModeToConfig(explicitSsl);
|
|
355
|
-
else
|
|
356
|
-
cfg.ssl = { rejectUnauthorized: false }; // Default: try SSL (with fallback)
|
|
357
|
-
}
|
|
358
|
-
// Enable fallback for: no explicit mode OR explicit "prefer"/"allow"
|
|
359
|
-
const shouldFallback = (!explicitSsl && !cfgHadSsl) ||
|
|
360
|
-
(!!explicitSsl && (explicitSsl.toLowerCase() === "prefer" || explicitSsl.toLowerCase() === "allow"));
|
|
361
|
-
return {
|
|
362
|
-
clientConfig: cfg,
|
|
363
|
-
display: describePgConfig(cfg),
|
|
364
|
-
sslFallbackEnabled: shouldFallback,
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
if (!hasConnDetails) {
|
|
368
|
-
// Keep this message short: the CLI prints full help (including examples) on this error.
|
|
369
|
-
throw new Error("Connection is required.");
|
|
370
|
-
}
|
|
371
|
-
const cfg = {};
|
|
372
|
-
if (opts.host)
|
|
373
|
-
cfg.host = opts.host;
|
|
374
|
-
if (opts.port !== undefined && opts.port !== "") {
|
|
375
|
-
const p = Number(opts.port);
|
|
376
|
-
if (!Number.isFinite(p) || !Number.isInteger(p) || p <= 0 || p > 65535) {
|
|
377
|
-
throw new Error(`Invalid port value: ${String(opts.port)}`);
|
|
378
|
-
}
|
|
379
|
-
cfg.port = p;
|
|
380
|
-
}
|
|
381
|
-
if (opts.username)
|
|
382
|
-
cfg.user = opts.username;
|
|
383
|
-
if (opts.dbname)
|
|
384
|
-
cfg.database = opts.dbname;
|
|
385
|
-
if (opts.adminPassword)
|
|
386
|
-
cfg.password = opts.adminPassword;
|
|
387
|
-
if (opts.envPassword && !cfg.password)
|
|
388
|
-
cfg.password = opts.envPassword;
|
|
389
|
-
if (explicitSsl) {
|
|
390
|
-
cfg.ssl = sslModeToConfig(explicitSsl);
|
|
391
|
-
// Enable fallback for explicit "prefer"/"allow"
|
|
392
|
-
const shouldFallback = explicitSsl.toLowerCase() === "prefer" || explicitSsl.toLowerCase() === "allow";
|
|
393
|
-
return { clientConfig: cfg, display: describePgConfig(cfg), sslFallbackEnabled: shouldFallback };
|
|
394
|
-
}
|
|
395
|
-
// Default: try SSL with fallback (sslmode=prefer behavior)
|
|
396
|
-
cfg.ssl = { rejectUnauthorized: false };
|
|
397
|
-
return { clientConfig: cfg, display: describePgConfig(cfg), sslFallbackEnabled: true };
|
|
398
|
-
}
|
|
399
|
-
function generateMonitoringPassword() {
|
|
400
|
-
// URL-safe and easy to copy/paste; 24 bytes => 32 base64url chars (no padding).
|
|
401
|
-
// Note: randomBytes() throws on failure; we add a tiny sanity check for unexpected output.
|
|
402
|
-
const password = (0, crypto_1.randomBytes)(24).toString("base64url");
|
|
403
|
-
if (password.length < 30) {
|
|
404
|
-
throw new Error("Password generation failed: unexpected output length");
|
|
405
|
-
}
|
|
406
|
-
return password;
|
|
407
|
-
}
|
|
408
|
-
async function resolveMonitoringPassword(opts) {
|
|
409
|
-
const fromFlag = (opts.passwordFlag || "").trim();
|
|
410
|
-
if (fromFlag)
|
|
411
|
-
return { password: fromFlag, generated: false };
|
|
412
|
-
const fromEnv = (opts.passwordEnv || "").trim();
|
|
413
|
-
if (fromEnv)
|
|
414
|
-
return { password: fromEnv, generated: false };
|
|
415
|
-
// Default: auto-generate (safer than prompting; works in non-interactive mode).
|
|
416
|
-
return { password: generateMonitoringPassword(), generated: true };
|
|
417
|
-
}
|
|
418
|
-
async function buildInitPlan(params) {
|
|
419
|
-
// NOTE: kept async for API stability / potential future async template loading.
|
|
420
|
-
const monitoringUser = params.monitoringUser || exports.DEFAULT_MONITORING_USER;
|
|
421
|
-
const database = params.database;
|
|
422
|
-
const qRole = quoteIdent(monitoringUser);
|
|
423
|
-
const qDb = quoteIdent(database);
|
|
424
|
-
const qPw = quoteLiteral(params.monitoringPassword);
|
|
425
|
-
const qRoleNameLit = quoteLiteral(monitoringUser);
|
|
426
|
-
const steps = [];
|
|
427
|
-
const vars = {
|
|
428
|
-
ROLE_IDENT: qRole,
|
|
429
|
-
DB_IDENT: qDb,
|
|
430
|
-
};
|
|
431
|
-
// Role creation/update is done in one template file.
|
|
432
|
-
// Always use a single DO block to avoid race conditions between "role exists?" checks and CREATE USER.
|
|
433
|
-
// We:
|
|
434
|
-
// - create role if missing (and handle duplicate_object in case another session created it concurrently),
|
|
435
|
-
// - then ALTER ROLE to ensure the password is set to the desired value.
|
|
436
|
-
const roleStmt = `do $$ begin
|
|
437
|
-
if not exists (select 1 from pg_catalog.pg_roles where rolname = ${qRoleNameLit}) then
|
|
438
|
-
begin
|
|
439
|
-
create user ${qRole} with password ${qPw};
|
|
440
|
-
exception when duplicate_object then
|
|
441
|
-
null;
|
|
442
|
-
end;
|
|
443
|
-
end if;
|
|
444
|
-
alter user ${qRole} with password ${qPw};
|
|
445
|
-
end $$;`;
|
|
446
|
-
const roleSql = applyTemplate(loadSqlTemplate("01.role.sql"), { ...vars, ROLE_STMT: roleStmt });
|
|
447
|
-
steps.push({ name: "01.role", sql: roleSql });
|
|
448
|
-
steps.push({
|
|
449
|
-
name: "02.permissions",
|
|
450
|
-
sql: applyTemplate(loadSqlTemplate("02.permissions.sql"), vars),
|
|
451
|
-
});
|
|
452
|
-
if (params.includeOptionalPermissions) {
|
|
453
|
-
steps.push({
|
|
454
|
-
name: "03.optional_rds",
|
|
455
|
-
sql: applyTemplate(loadSqlTemplate("03.optional_rds.sql"), vars),
|
|
456
|
-
optional: true,
|
|
457
|
-
}, {
|
|
458
|
-
name: "04.optional_self_managed",
|
|
459
|
-
sql: applyTemplate(loadSqlTemplate("04.optional_self_managed.sql"), vars),
|
|
460
|
-
optional: true,
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
return { monitoringUser, database, steps };
|
|
464
|
-
}
|
|
465
|
-
async function applyInitPlan(params) {
|
|
466
|
-
const applied = [];
|
|
467
|
-
const skippedOptional = [];
|
|
468
|
-
// Apply non-optional steps in a single transaction.
|
|
469
|
-
await params.client.query("begin;");
|
|
470
|
-
try {
|
|
471
|
-
for (const step of params.plan.steps.filter((s) => !s.optional)) {
|
|
472
|
-
try {
|
|
473
|
-
await params.client.query(step.sql, step.params);
|
|
474
|
-
applied.push(step.name);
|
|
475
|
-
}
|
|
476
|
-
catch (e) {
|
|
477
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
478
|
-
const errAny = e;
|
|
479
|
-
const wrapped = new Error(`Failed at step "${step.name}": ${msg}`);
|
|
480
|
-
// Preserve useful Postgres error fields so callers can provide better hints / diagnostics.
|
|
481
|
-
const pgErrorFields = [
|
|
482
|
-
"code",
|
|
483
|
-
"detail",
|
|
484
|
-
"hint",
|
|
485
|
-
"position",
|
|
486
|
-
"internalPosition",
|
|
487
|
-
"internalQuery",
|
|
488
|
-
"where",
|
|
489
|
-
"schema",
|
|
490
|
-
"table",
|
|
491
|
-
"column",
|
|
492
|
-
"dataType",
|
|
493
|
-
"constraint",
|
|
494
|
-
"file",
|
|
495
|
-
"line",
|
|
496
|
-
"routine",
|
|
497
|
-
];
|
|
498
|
-
if (errAny && typeof errAny === "object") {
|
|
499
|
-
for (const field of pgErrorFields) {
|
|
500
|
-
if (errAny[field] !== undefined)
|
|
501
|
-
wrapped[field] = errAny[field];
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
if (e instanceof Error && e.stack) {
|
|
505
|
-
wrapped.stack = e.stack;
|
|
506
|
-
}
|
|
507
|
-
throw wrapped;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
await params.client.query("commit;");
|
|
511
|
-
}
|
|
512
|
-
catch (e) {
|
|
513
|
-
// Rollback errors should never mask the original failure.
|
|
514
|
-
try {
|
|
515
|
-
await params.client.query("rollback;");
|
|
516
|
-
}
|
|
517
|
-
catch {
|
|
518
|
-
// ignore
|
|
519
|
-
}
|
|
520
|
-
throw e;
|
|
521
|
-
}
|
|
522
|
-
// Apply optional steps outside of the transaction so a failure doesn't abort everything.
|
|
523
|
-
for (const step of params.plan.steps.filter((s) => s.optional)) {
|
|
524
|
-
try {
|
|
525
|
-
// Run each optional step in its own mini-transaction to avoid partial application.
|
|
526
|
-
await params.client.query("begin;");
|
|
527
|
-
try {
|
|
528
|
-
await params.client.query(step.sql, step.params);
|
|
529
|
-
await params.client.query("commit;");
|
|
530
|
-
applied.push(step.name);
|
|
531
|
-
}
|
|
532
|
-
catch {
|
|
533
|
-
try {
|
|
534
|
-
await params.client.query("rollback;");
|
|
535
|
-
}
|
|
536
|
-
catch {
|
|
537
|
-
// ignore rollback errors
|
|
538
|
-
}
|
|
539
|
-
skippedOptional.push(step.name);
|
|
540
|
-
// best-effort: ignore
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
catch {
|
|
544
|
-
// If we can't even begin/commit, treat as skipped.
|
|
545
|
-
skippedOptional.push(step.name);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
return { applied, skippedOptional };
|
|
549
|
-
}
|
|
550
|
-
async function verifyInitSetup(params) {
|
|
551
|
-
// Use a repeatable-read snapshot so all checks see a consistent view.
|
|
552
|
-
await params.client.query("begin isolation level repeatable read;");
|
|
553
|
-
try {
|
|
554
|
-
const missingRequired = [];
|
|
555
|
-
const missingOptional = [];
|
|
556
|
-
const role = params.monitoringUser;
|
|
557
|
-
const db = params.database;
|
|
558
|
-
const roleRes = await params.client.query("select 1 from pg_catalog.pg_roles where rolname = $1", [role]);
|
|
559
|
-
const roleExists = (roleRes.rowCount ?? 0) > 0;
|
|
560
|
-
if (!roleExists) {
|
|
561
|
-
missingRequired.push(`role "${role}" does not exist`);
|
|
562
|
-
// If role is missing, other checks will error or be meaningless.
|
|
563
|
-
return { ok: false, missingRequired, missingOptional };
|
|
564
|
-
}
|
|
565
|
-
const connectRes = await params.client.query("select has_database_privilege($1, $2, 'CONNECT') as ok", [role, db]);
|
|
566
|
-
if (!connectRes.rows?.[0]?.ok) {
|
|
567
|
-
missingRequired.push(`CONNECT on database "${db}"`);
|
|
568
|
-
}
|
|
569
|
-
const pgMonitorRes = await params.client.query("select pg_has_role($1, 'pg_monitor', 'member') as ok", [role]);
|
|
570
|
-
if (!pgMonitorRes.rows?.[0]?.ok) {
|
|
571
|
-
missingRequired.push("membership in role pg_monitor");
|
|
572
|
-
}
|
|
573
|
-
const pgIndexRes = await params.client.query("select has_table_privilege($1, 'pg_catalog.pg_index', 'SELECT') as ok", [role]);
|
|
574
|
-
if (!pgIndexRes.rows?.[0]?.ok) {
|
|
575
|
-
missingRequired.push("SELECT on pg_catalog.pg_index");
|
|
576
|
-
}
|
|
577
|
-
const viewExistsRes = await params.client.query("select to_regclass('public.pg_statistic') is not null as ok");
|
|
578
|
-
if (!viewExistsRes.rows?.[0]?.ok) {
|
|
579
|
-
missingRequired.push("view public.pg_statistic exists");
|
|
580
|
-
}
|
|
581
|
-
else {
|
|
582
|
-
const viewPrivRes = await params.client.query("select has_table_privilege($1, 'public.pg_statistic', 'SELECT') as ok", [role]);
|
|
583
|
-
if (!viewPrivRes.rows?.[0]?.ok) {
|
|
584
|
-
missingRequired.push("SELECT on view public.pg_statistic");
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
const schemaUsageRes = await params.client.query("select has_schema_privilege($1, 'public', 'USAGE') as ok", [role]);
|
|
588
|
-
if (!schemaUsageRes.rows?.[0]?.ok) {
|
|
589
|
-
missingRequired.push("USAGE on schema public");
|
|
590
|
-
}
|
|
591
|
-
const rolcfgRes = await params.client.query("select rolconfig from pg_catalog.pg_roles where rolname = $1", [role]);
|
|
592
|
-
const rolconfig = rolcfgRes.rows?.[0]?.rolconfig;
|
|
593
|
-
const spLine = Array.isArray(rolconfig) ? rolconfig.find((v) => String(v).startsWith("search_path=")) : undefined;
|
|
594
|
-
if (typeof spLine !== "string" || !spLine) {
|
|
595
|
-
missingRequired.push("role search_path is set");
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
// We accept any ordering as long as public and pg_catalog are included.
|
|
599
|
-
const sp = spLine.toLowerCase();
|
|
600
|
-
if (!sp.includes("public") || !sp.includes("pg_catalog")) {
|
|
601
|
-
missingRequired.push("role search_path includes public and pg_catalog");
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
if (params.includeOptionalPermissions) {
|
|
605
|
-
// Optional RDS/Aurora extras
|
|
606
|
-
{
|
|
607
|
-
const extRes = await params.client.query("select 1 from pg_extension where extname = 'rds_tools'");
|
|
608
|
-
if ((extRes.rowCount ?? 0) === 0) {
|
|
609
|
-
missingOptional.push("extension rds_tools");
|
|
610
|
-
}
|
|
611
|
-
else {
|
|
612
|
-
const fnRes = await params.client.query("select has_function_privilege($1, 'rds_tools.pg_ls_multixactdir()', 'EXECUTE') as ok", [role]);
|
|
613
|
-
if (!fnRes.rows?.[0]?.ok) {
|
|
614
|
-
missingOptional.push("EXECUTE on rds_tools.pg_ls_multixactdir()");
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
// Optional self-managed extras
|
|
619
|
-
const optionalFns = [
|
|
620
|
-
"pg_catalog.pg_stat_file(text)",
|
|
621
|
-
"pg_catalog.pg_stat_file(text, boolean)",
|
|
622
|
-
"pg_catalog.pg_ls_dir(text)",
|
|
623
|
-
"pg_catalog.pg_ls_dir(text, boolean, boolean)",
|
|
624
|
-
];
|
|
625
|
-
for (const fn of optionalFns) {
|
|
626
|
-
const fnRes = await params.client.query("select has_function_privilege($1, $2, 'EXECUTE') as ok", [role, fn]);
|
|
627
|
-
if (!fnRes.rows?.[0]?.ok) {
|
|
628
|
-
missingOptional.push(`EXECUTE on ${fn}`);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
return { ok: missingRequired.length === 0, missingRequired, missingOptional };
|
|
633
|
-
}
|
|
634
|
-
finally {
|
|
635
|
-
// Read-only: rollback to release snapshot; do not mask original errors.
|
|
636
|
-
try {
|
|
637
|
-
await params.client.query("rollback;");
|
|
638
|
-
}
|
|
639
|
-
catch {
|
|
640
|
-
// ignore
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
//# sourceMappingURL=init.js.map
|
package/dist/lib/init.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../lib/init.ts"],"names":[],"mappings":"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"}
|