@calltelemetry/cli 1.2.0 → 1.2.1

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Check whether IPv6 dual-stack is currently enabled in docker-compose.yml.
2
+ * Check whether the installed compose graph selects IPv6 address mode.
3
3
  */
4
4
  export declare function getIpv6Status(): 'enabled' | 'disabled' | 'unknown';
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ipv6.d.ts","sourceRoot":"","sources":["../../src/lib/ipv6.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,GAAG,UAAU,GAAG,SAAS,CAKlE;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
1
+ {"version":3,"file":"ipv6.d.ts","sourceRoot":"","sources":["../../src/lib/ipv6.ts"],"names":[],"mappings":"AAwBA;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,GAAG,UAAU,GAAG,SAAS,CAKlE;AAmBD;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
package/dist/lib/ipv6.js CHANGED
@@ -2,14 +2,44 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { writeFileSafe } from './fs.js';
3
3
  import { getPaths } from './paths.js';
4
4
  /**
5
- * Check whether IPv6 dual-stack is currently enabled in docker-compose.yml.
5
+ * The live EXTERNAL_IP binding is the only source of truth for IPv6 address
6
+ * mode. `enable_ipv6: true` only declares the Docker network dual-stack
7
+ * capable; treating it as address mode flips IPv4 appliances into a
8
+ * DEFAULT_IPV6 contract they never configured.
9
+ *
10
+ * Accepts every form the shell and native CLIs have written:
11
+ * EXTERNAL_IP=$DEFAULT_IPV6
12
+ * EXTERNAL_IP=${DEFAULT_IPV6}
13
+ * EXTERNAL_IP=${DEFAULT_IPV6:?DEFAULT_IPV6 must be set when IPv6 is enabled}
14
+ * EXTERNAL_IP: ${DEFAULT_IPV6}
15
+ */
16
+ const IPV6_BINDING = /^[\t ]*(?:-[\t ]*)?['"]?EXTERNAL_IP['"]?[\t ]*(?:=|:)[\t ]*['"]?\$(?:DEFAULT_IPV6(?![\w])|\{DEFAULT_IPV6(?:[:}][^}]*)?\})/m;
17
+ const EXTERNAL_IP_ASSIGN = /^([\t ]*)(-[\t ]+)?['"]?EXTERNAL_IP=.*$/gm;
18
+ const EXTERNAL_IP_MAPPING = /^([\t ]*)['"]?EXTERNAL_IP['"]?[\t ]*:.*$/gm;
19
+ const ENABLE_IPV6_COMMENTED = /^([\t ]*)#[\t ]*enable_ipv6: true[\t ]*$/gm;
20
+ const ENABLE_IPV6_ACTIVE = /^[\t ]*enable_ipv6: true/m;
21
+ /**
22
+ * Check whether the installed compose graph selects IPv6 address mode.
6
23
  */
7
24
  export function getIpv6Status() {
8
25
  const { composeFile } = getPaths();
9
26
  if (!existsSync(composeFile))
10
27
  return 'unknown';
11
28
  const content = readFileSync(composeFile, 'utf-8');
12
- return content.includes('EXTERNAL_IP=$DEFAULT_IPV6') ? 'enabled' : 'disabled';
29
+ return IPV6_BINDING.test(content) ? 'enabled' : 'disabled';
30
+ }
31
+ function replaceExternalIP(content, family) {
32
+ // Idempotent: a file already in the requested family is not rewritten, so a
33
+ // repeated enable/disable does not churn the contract message.
34
+ if ((family === 'ipv6') === IPV6_BINDING.test(content)) {
35
+ return content;
36
+ }
37
+ const value = family === 'ipv6'
38
+ ? '${DEFAULT_IPV6:?DEFAULT_IPV6 must be set when IPv6 is enabled}'
39
+ : '${EXTERNAL_IP:?EXTERNAL_IP must be set by ct network set-external-ip auto or ct network set-external-ip <ip>}';
40
+ return content
41
+ .replace(EXTERNAL_IP_ASSIGN, (_match, indent, dash) => dash ? `${indent}${dash}'EXTERNAL_IP=${value}'` : `${indent}EXTERNAL_IP=${value}`)
42
+ .replace(EXTERNAL_IP_MAPPING, (_match, indent) => `${indent}EXTERNAL_IP: '${value}'`);
13
43
  }
14
44
  /**
15
45
  * Enable IPv6 dual-stack in docker-compose.yml.
@@ -18,8 +48,11 @@ export function getIpv6Status() {
18
48
  export async function enableIpv6() {
19
49
  const { composeFile } = getPaths();
20
50
  let content = readFileSync(composeFile, 'utf-8');
21
- content = content.replace(/# enable_ipv6: true/g, 'enable_ipv6: true');
22
- content = content.replace(/EXTERNAL_IP=\$DEFAULT_IPV4/g, 'EXTERNAL_IP=$DEFAULT_IPV6');
51
+ content = content.replace(ENABLE_IPV6_COMMENTED, '$1enable_ipv6: true');
52
+ if (!ENABLE_IPV6_ACTIVE.test(content)) {
53
+ content = content.replace(/^([\t ]*)ct:[ \t]*$/m, '$1ct:\n$1 enable_ipv6: true');
54
+ }
55
+ content = replaceExternalIP(content, 'ipv6');
23
56
  await writeFileSafe(composeFile, content);
24
57
  }
25
58
  /**
@@ -29,8 +62,8 @@ export async function enableIpv6() {
29
62
  export async function disableIpv6() {
30
63
  const { composeFile } = getPaths();
31
64
  let content = readFileSync(composeFile, 'utf-8');
32
- content = content.replace(/^\s*enable_ipv6: true/gm, ' # enable_ipv6: true');
33
- content = content.replace(/EXTERNAL_IP=\$DEFAULT_IPV6/g, 'EXTERNAL_IP=$DEFAULT_IPV4');
65
+ content = content.replace(/^[\t ]*enable_ipv6: true/gm, ' # enable_ipv6: true');
66
+ content = replaceExternalIP(content, 'ipv4');
34
67
  await writeFileSafe(composeFile, content);
35
68
  }
36
69
  //# sourceMappingURL=ipv6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipv6.js","sourceRoot":"","sources":["../../src/lib/ipv6.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAC;IACvE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,CAAC;IACtF,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC;IAChF,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,CAAC;IACtF,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"ipv6.js","sourceRoot":"","sources":["../../src/lib/ipv6.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAChB,4HAA4H,CAAC;AAE/H,MAAM,kBAAkB,GAAG,2CAA2C,CAAC;AACvE,MAAM,mBAAmB,GAAG,4CAA4C,CAAC;AACzE,MAAM,qBAAqB,GAAG,4CAA4C,CAAC;AAC3E,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAAuB;IACjE,4EAA4E;IAC5E,+DAA+D;IAC/D,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GACT,MAAM,KAAK,MAAM;QACf,CAAC,CAAC,gEAAgE;QAClE,CAAC,CAAC,+GAA+G,CAAC;IACtH,OAAO,OAAO;SACX,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAc,EAAE,IAAwB,EAAE,EAAE,CAChF,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,gBAAgB,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,eAAe,KAAK,EAAE,CAClF;SACA,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,MAAM,iBAAiB,KAAK,GAAG,CAAC,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;IACxE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,8BAA8B,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,4BAA4B,EAAE,yBAAyB,CAAC,CAAC;IACnF,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export declare const VERSION = "1.2.0";
2
+ export declare const VERSION = "1.2.1";
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 = '1.2.0';
2
+ export const VERSION = '1.2.1';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calltelemetry/cli",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Call Telemetry appliance management CLI",
5
5
  "type": "module",
6
6
  "bin": {