@calltelemetry/cli 0.7.8 → 0.7.9

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/dist/lib/env.d.ts CHANGED
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Read the raw .env file, falling back to passwordless sudo for root-owned
3
+ * appliance files. Returns empty content if the file does not exist or cannot
4
+ * be read.
5
+ */
6
+ export declare function readEnvRaw(): Promise<string>;
1
7
  /**
2
8
  * Read all key-value pairs from the .env file.
3
9
  * Returns empty object if .env doesn't exist.
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAqEf"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAelD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,CA0Df"}
package/dist/lib/env.js CHANGED
@@ -1,6 +1,29 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { getEnvFilePath, parseEnvFile } from './secrets.js';
3
3
  import { writeFileSafe } from './fs.js';
4
+ /**
5
+ * Read the raw .env file, falling back to passwordless sudo for root-owned
6
+ * appliance files. Returns empty content if the file does not exist or cannot
7
+ * be read.
8
+ */
9
+ export async function readEnvRaw() {
10
+ const envPath = getEnvFilePath();
11
+ if (!existsSync(envPath))
12
+ return '';
13
+ try {
14
+ return readFileSync(envPath, 'utf-8');
15
+ }
16
+ catch {
17
+ try {
18
+ const { execa } = await import('execa');
19
+ const { stdout } = await execa('sudo', ['-n', 'cat', envPath]);
20
+ return stdout;
21
+ }
22
+ catch {
23
+ return '';
24
+ }
25
+ }
26
+ }
4
27
  /**
5
28
  * Read all key-value pairs from the .env file.
6
29
  * Returns empty object if .env doesn't exist.
@@ -25,30 +48,15 @@ export function readEnvKeys() {
25
48
  */
26
49
  export async function updateEnvKeys(updates) {
27
50
  const envPath = getEnvFilePath();
28
- let raw = '';
29
- if (existsSync(envPath)) {
30
- try {
31
- raw = readFileSync(envPath, 'utf-8');
32
- }
33
- catch {
34
- // File exists but not readable (owned by root) — read via sudo
35
- try {
36
- const { execa } = await import('execa');
37
- const { stdout } = await execa('sudo', ['-n', 'cat', envPath]);
38
- raw = stdout;
39
- }
40
- catch {
41
- // Can't read even with sudo — start fresh
42
- raw = '';
43
- }
44
- }
45
- }
51
+ const raw = await readEnvRaw();
46
52
  // Split into lines, but drop the final empty string produced by trailing newline
47
53
  const lines = raw.length > 0 ? raw.split('\n') : [];
48
54
  if (lines.length > 0 && lines[lines.length - 1] === '') {
49
55
  lines.pop();
50
56
  }
51
57
  const pending = new Map(Object.entries(updates));
58
+ const targetKeys = new Set(Object.keys(updates));
59
+ const seenUpdatedKeys = new Set();
52
60
  const result = [];
53
61
  for (const line of lines) {
54
62
  const trimmed = line.trim();
@@ -65,14 +73,16 @@ export async function updateEnvKeys(updates) {
65
73
  continue;
66
74
  }
67
75
  const key = stripped.slice(0, eqIdx).trim();
68
- if (pending.has(key)) {
76
+ if (targetKeys.has(key)) {
69
77
  const newValue = pending.get(key);
70
- pending.delete(key);
71
- if (newValue !== undefined) {
72
- // Update in-place
78
+ const firstMatch = !seenUpdatedKeys.has(key);
79
+ seenUpdatedKeys.add(key);
80
+ if (newValue !== undefined && firstMatch) {
73
81
  result.push(`${key}=${newValue}`);
82
+ pending.delete(key);
74
83
  }
75
- // If undefined, skip (remove the line)
84
+ // If undefined, skip all matching lines. If this is a duplicate of a
85
+ // key already updated above, skip it so duplicate env keys collapse.
76
86
  }
77
87
  else {
78
88
  result.push(line);
@@ -80,7 +90,7 @@ export async function updateEnvKeys(updates) {
80
90
  }
81
91
  // Append remaining new keys
82
92
  for (const [key, value] of pending) {
83
- if (value !== undefined) {
93
+ if (value !== undefined && !seenUpdatedKeys.has(key)) {
84
94
  result.push(`${key}=${value}`);
85
95
  }
86
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA2C;IAE3C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;YAC/D,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,GAAG,GAAG,MAAM,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;gBAC1C,GAAG,GAAG,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,iFAAiF;IACjF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACvD,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,oCAAoC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,kBAAkB;gBAClB,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,uCAAuC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,9 @@
1
1
  /**
2
2
  * Migration 013: Generate GRAFANA_PASSWORD for deterministic Grafana auth.
3
3
  *
4
- * The BootProvisioner (Elixir) uses GRAFANA_PASSWORD for basic auth to push
5
- * dashboards to Grafana. Both the web container and grafana container read
6
- * this from .env. If it's missing, dashboard provisioning fails.
7
- *
8
- * This migration:
9
- * 1. Generates a random 32-char hex password
10
- * 2. Writes GRAFANA_PASSWORD=<password> to .env
11
- * 3. Removes stale GRAFANA_TOKEN if present
12
- * 4. Resets Grafana admin password via grafana-cli (for existing volumes)
4
+ * This is a configuration migration only. It seeds .env on fresh or upgraded
5
+ * installs so Grafana can boot with a deterministic admin password. It must not
6
+ * reset Grafana's admin password on existing appliances.
13
7
  */
14
8
  export declare function migrateGrafanaPassword(): Promise<boolean>;
15
9
  //# sourceMappingURL=migration-013-grafana-password.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration-013-grafana-password.d.ts","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoE/D"}
1
+ {"version":3,"file":"migration-013-grafana-password.d.ts","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAkB/D"}
@@ -1,72 +1,26 @@
1
1
  /**
2
2
  * Migration 013: Generate GRAFANA_PASSWORD for deterministic Grafana auth.
3
3
  *
4
- * The BootProvisioner (Elixir) uses GRAFANA_PASSWORD for basic auth to push
5
- * dashboards to Grafana. Both the web container and grafana container read
6
- * this from .env. If it's missing, dashboard provisioning fails.
7
- *
8
- * This migration:
9
- * 1. Generates a random 32-char hex password
10
- * 2. Writes GRAFANA_PASSWORD=<password> to .env
11
- * 3. Removes stale GRAFANA_TOKEN if present
12
- * 4. Resets Grafana admin password via grafana-cli (for existing volumes)
4
+ * This is a configuration migration only. It seeds .env on fresh or upgraded
5
+ * installs so Grafana can boot with a deterministic admin password. It must not
6
+ * reset Grafana's admin password on existing appliances.
13
7
  */
14
- import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
15
8
  import { randomBytes } from 'node:crypto';
16
- import { spawnSync } from 'node:child_process';
17
- import { join } from 'node:path';
18
- import { getPaths } from './paths.js';
9
+ import { readEnvRaw, updateEnvKeys } from './env.js';
10
+ import { parseEnvFile } from './secrets.js';
19
11
  export async function migrateGrafanaPassword() {
20
- const { installDir } = getPaths();
21
- const envFile = join(installDir, '.env');
22
- // If GRAFANA_PASSWORD is already set, nothing to do
23
- if (existsSync(envFile)) {
24
- const content = readFileSync(envFile, 'utf-8');
25
- if (content.includes('GRAFANA_PASSWORD=')) {
26
- return false; // Already configured
27
- }
28
- }
29
- // Generate random password
30
- const password = randomBytes(16).toString('hex');
31
- // Build .env block
32
- const block = '\n# Grafana auth password (auto-generated by migration 013)\n' +
33
- `GRAFANA_PASSWORD=${password}\n`;
34
- const tmp = `/tmp/ct-grafana-pw-${Date.now()}`;
35
- writeFileSync(tmp, block);
36
- // Append to .env
37
- const appendResult = spawnSync('sudo', ['bash', '-c', `cat ${tmp} >> ${envFile}`], {
38
- stdio: 'pipe',
39
- });
40
- try {
41
- unlinkSync(tmp);
42
- }
43
- catch {
44
- /* ignore */
45
- }
46
- if (appendResult.status !== 0) {
47
- throw new Error(`Failed to write GRAFANA_PASSWORD to ${envFile}`);
12
+ const env = parseEnvFile(await readEnvRaw());
13
+ const updates = {};
14
+ if (!env.GRAFANA_PASSWORD) {
15
+ updates.GRAFANA_PASSWORD = randomBytes(16).toString('hex');
48
16
  }
49
- // Remove stale GRAFANA_TOKEN lines from .env (replaced by GRAFANA_PASSWORD)
50
- if (existsSync(envFile)) {
51
- const content = readFileSync(envFile, 'utf-8');
52
- if (content.includes('GRAFANA_TOKEN=')) {
53
- spawnSync('sudo', ['sed', '-i', '/^GRAFANA_TOKEN=/d', envFile], { stdio: 'pipe' });
54
- spawnSync('sudo', ['sed', '-i', '/^# .*GRAFANA_TOKEN/d', envFile], { stdio: 'pipe' });
55
- }
17
+ if (Object.prototype.hasOwnProperty.call(env, 'GRAFANA_TOKEN')) {
18
+ updates.GRAFANA_TOKEN = undefined;
56
19
  }
57
- // Reset Grafana admin password for existing volumes.
58
- // grafana-cli stores the new password in the SQLite DB, overriding whatever
59
- // was set previously (even if changed via the UI).
60
- const resetResult = spawnSync('docker', ['compose', 'exec', '-T', 'grafana', 'grafana-cli', 'admin', 'reset-admin-password', password], { cwd: installDir, stdio: 'pipe', timeout: 30_000 });
61
- if (resetResult.status !== 0) {
62
- // Grafana container might not be running — that's OK.
63
- // On next start, GF_SECURITY_ADMIN_PASSWORD from .env will be used
64
- // (only applies on first start of a fresh volume, but that covers new installs).
65
- const stderr = resetResult.stderr?.toString() ?? '';
66
- if (!stderr.includes('No such container') && !stderr.includes('not running')) {
67
- console.warn(`[migration-013] grafana-cli reset failed (non-fatal): ${stderr.slice(0, 200)}`);
68
- }
20
+ if (Object.keys(updates).length === 0) {
21
+ return false;
69
22
  }
23
+ await updateEnvKeys(updates);
70
24
  return true;
71
25
  }
72
26
  //# sourceMappingURL=migration-013-grafana-password.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration-013-grafana-password.js","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migration-013-grafana-password.js","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAuC,EAAE,CAAC;IAEvD,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,CAAC,gBAAgB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export declare const VERSION = "0.7.8";
2
+ export declare const VERSION = "0.7.9";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export const VERSION = '0.7.8';
2
+ export const VERSION = '0.7.9';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calltelemetry/cli",
3
- "version": "0.7.8",
3
+ "version": "0.7.9",
4
4
  "description": "CallTelemetry appliance management CLI",
5
5
  "type": "module",
6
6
  "bin": {