@calltelemetry/cli 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.
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +201 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +3 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +143 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/diag.d.ts +3 -0
- package/dist/commands/diag.d.ts.map +1 -0
- package/dist/commands/diag.js +123 -0
- package/dist/commands/diag.js.map +1 -0
- package/dist/commands/docker.d.ts +3 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +34 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/jtapi.d.ts +3 -0
- package/dist/commands/jtapi.d.ts.map +1 -0
- package/dist/commands/jtapi.js +36 -0
- package/dist/commands/jtapi.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +49 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/offline.d.ts +3 -0
- package/dist/commands/offline.d.ts.map +1 -0
- package/dist/commands/offline.js +170 -0
- package/dist/commands/offline.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +55 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +13 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +202 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bundle.d.ts +5 -0
- package/dist/lib/bundle.d.ts.map +1 -0
- package/dist/lib/bundle.js +134 -0
- package/dist/lib/bundle.js.map +1 -0
- package/dist/lib/certs.d.ts +3 -0
- package/dist/lib/certs.d.ts.map +1 -0
- package/dist/lib/certs.js +29 -0
- package/dist/lib/certs.js.map +1 -0
- package/dist/lib/compose.d.ts +36 -0
- package/dist/lib/compose.d.ts.map +1 -0
- package/dist/lib/compose.js +137 -0
- package/dist/lib/compose.js.map +1 -0
- package/dist/lib/db.d.ts +6 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +6 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/fs.d.ts +20 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +72 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/jtapi.d.ts +6 -0
- package/dist/lib/jtapi.d.ts.map +1 -0
- package/dist/lib/jtapi.js +27 -0
- package/dist/lib/jtapi.js.map +1 -0
- package/dist/lib/network.d.ts +43 -0
- package/dist/lib/network.d.ts.map +1 -0
- package/dist/lib/network.js +172 -0
- package/dist/lib/network.js.map +1 -0
- package/dist/lib/paths.d.ts +19 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +57 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/postgres.d.ts +4 -0
- package/dist/lib/postgres.d.ts.map +1 -0
- package/dist/lib/postgres.js +49 -0
- package/dist/lib/postgres.js.map +1 -0
- package/dist/lib/rpc.d.ts +5 -0
- package/dist/lib/rpc.d.ts.map +1 -0
- package/dist/lib/rpc.js +28 -0
- package/dist/lib/rpc.js.map +1 -0
- package/dist/lib/secrets.d.ts +38 -0
- package/dist/lib/secrets.d.ts.map +1 -0
- package/dist/lib/secrets.js +132 -0
- package/dist/lib/secrets.js.map +1 -0
- package/dist/lib/system.d.ts +12 -0
- package/dist/lib/system.d.ts.map +1 -0
- package/dist/lib/system.js +61 -0
- package/dist/lib/system.js.map +1 -0
- package/dist/ui/components/AppShell.d.ts +9 -0
- package/dist/ui/components/AppShell.d.ts.map +1 -0
- package/dist/ui/components/AppShell.js +6 -0
- package/dist/ui/components/AppShell.js.map +1 -0
- package/dist/ui/components/Confirm.d.ts +7 -0
- package/dist/ui/components/Confirm.d.ts.map +1 -0
- package/dist/ui/components/Confirm.js +14 -0
- package/dist/ui/components/Confirm.js.map +1 -0
- package/dist/ui/components/DataTable.d.ts +12 -0
- package/dist/ui/components/DataTable.d.ts.map +1 -0
- package/dist/ui/components/DataTable.js +28 -0
- package/dist/ui/components/DataTable.js.map +1 -0
- package/dist/ui/components/Divider.d.ts +6 -0
- package/dist/ui/components/Divider.d.ts.map +1 -0
- package/dist/ui/components/Divider.js +6 -0
- package/dist/ui/components/Divider.js.map +1 -0
- package/dist/ui/components/KeyValue.d.ts +11 -0
- package/dist/ui/components/KeyValue.d.ts.map +1 -0
- package/dist/ui/components/KeyValue.js +7 -0
- package/dist/ui/components/KeyValue.js.map +1 -0
- package/dist/ui/components/Section.d.ts +8 -0
- package/dist/ui/components/Section.d.ts.map +1 -0
- package/dist/ui/components/Section.js +6 -0
- package/dist/ui/components/Section.js.map +1 -0
- package/dist/ui/components/SelectMenu.d.ts +14 -0
- package/dist/ui/components/SelectMenu.d.ts.map +1 -0
- package/dist/ui/components/SelectMenu.js +55 -0
- package/dist/ui/components/SelectMenu.js.map +1 -0
- package/dist/ui/components/ShellOutput.d.ts +7 -0
- package/dist/ui/components/ShellOutput.d.ts.map +1 -0
- package/dist/ui/components/ShellOutput.js +10 -0
- package/dist/ui/components/ShellOutput.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +6 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +7 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StatusBox.d.ts +8 -0
- package/dist/ui/components/StatusBox.d.ts.map +1 -0
- package/dist/ui/components/StatusBox.js +12 -0
- package/dist/ui/components/StatusBox.js.map +1 -0
- package/dist/ui/components/StatusLine.d.ts +8 -0
- package/dist/ui/components/StatusLine.d.ts.map +1 -0
- package/dist/ui/components/StatusLine.js +13 -0
- package/dist/ui/components/StatusLine.js.map +1 -0
- package/dist/ui/components/StepList.d.ts +11 -0
- package/dist/ui/components/StepList.d.ts.map +1 -0
- package/dist/ui/components/StepList.js +19 -0
- package/dist/ui/components/StepList.js.map +1 -0
- package/dist/ui/components/SubSection.d.ts +8 -0
- package/dist/ui/components/SubSection.d.ts.map +1 -0
- package/dist/ui/components/SubSection.js +6 -0
- package/dist/ui/components/SubSection.js.map +1 -0
- package/dist/ui/components/TextInput.d.ts +11 -0
- package/dist/ui/components/TextInput.d.ts.map +1 -0
- package/dist/ui/components/TextInput.js +7 -0
- package/dist/ui/components/TextInput.js.map +1 -0
- package/dist/ui/components/index.d.ts +16 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +15 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +7 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.js +5 -0
- package/dist/ui/hooks/index.js.map +1 -0
- package/dist/ui/hooks/useAsyncTask.d.ts +9 -0
- package/dist/ui/hooks/useAsyncTask.d.ts.map +1 -0
- package/dist/ui/hooks/useAsyncTask.js +22 -0
- package/dist/ui/hooks/useAsyncTask.js.map +1 -0
- package/dist/ui/hooks/usePolling.d.ts +8 -0
- package/dist/ui/hooks/usePolling.d.ts.map +1 -0
- package/dist/ui/hooks/usePolling.js +43 -0
- package/dist/ui/hooks/usePolling.js.map +1 -0
- package/dist/ui/hooks/useStepRunner.d.ts +16 -0
- package/dist/ui/hooks/useStepRunner.d.ts.map +1 -0
- package/dist/ui/hooks/useStepRunner.js +42 -0
- package/dist/ui/hooks/useStepRunner.js.map +1 -0
- package/dist/ui/hooks/useStreamingProcess.d.ts +8 -0
- package/dist/ui/hooks/useStreamingProcess.d.ts.map +1 -0
- package/dist/ui/hooks/useStreamingProcess.js +49 -0
- package/dist/ui/hooks/useStreamingProcess.js.map +1 -0
- package/dist/ui/types.d.ts +24 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +2 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/ui/views/CertsStatusView.d.ts +2 -0
- package/dist/ui/views/CertsStatusView.d.ts.map +1 -0
- package/dist/ui/views/CertsStatusView.js +95 -0
- package/dist/ui/views/CertsStatusView.js.map +1 -0
- package/dist/ui/views/DbBackupView.d.ts +2 -0
- package/dist/ui/views/DbBackupView.d.ts.map +1 -0
- package/dist/ui/views/DbBackupView.js +62 -0
- package/dist/ui/views/DbBackupView.js.map +1 -0
- package/dist/ui/views/DbCompactView.d.ts +2 -0
- package/dist/ui/views/DbCompactView.d.ts.map +1 -0
- package/dist/ui/views/DbCompactView.js +28 -0
- package/dist/ui/views/DbCompactView.js.map +1 -0
- package/dist/ui/views/DbListView.d.ts +2 -0
- package/dist/ui/views/DbListView.d.ts.map +1 -0
- package/dist/ui/views/DbListView.js +30 -0
- package/dist/ui/views/DbListView.js.map +1 -0
- package/dist/ui/views/DbSizeView.d.ts +2 -0
- package/dist/ui/views/DbSizeView.d.ts.map +1 -0
- package/dist/ui/views/DbSizeView.js +21 -0
- package/dist/ui/views/DbSizeView.js.map +1 -0
- package/dist/ui/views/DbStatusView.d.ts +2 -0
- package/dist/ui/views/DbStatusView.d.ts.map +1 -0
- package/dist/ui/views/DbStatusView.js +41 -0
- package/dist/ui/views/DbStatusView.js.map +1 -0
- package/dist/ui/views/DbTablesView.d.ts +6 -0
- package/dist/ui/views/DbTablesView.d.ts.map +1 -0
- package/dist/ui/views/DbTablesView.js +28 -0
- package/dist/ui/views/DbTablesView.js.map +1 -0
- package/dist/ui/views/DiagDatabaseView.d.ts +2 -0
- package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -0
- package/dist/ui/views/DiagDatabaseView.js +51 -0
- package/dist/ui/views/DiagDatabaseView.js.map +1 -0
- package/dist/ui/views/DiagNetworkView.d.ts +2 -0
- package/dist/ui/views/DiagNetworkView.d.ts.map +1 -0
- package/dist/ui/views/DiagNetworkView.js +169 -0
- package/dist/ui/views/DiagNetworkView.js.map +1 -0
- package/dist/ui/views/DiagServiceView.d.ts +2 -0
- package/dist/ui/views/DiagServiceView.d.ts.map +1 -0
- package/dist/ui/views/DiagServiceView.js +37 -0
- package/dist/ui/views/DiagServiceView.js.map +1 -0
- package/dist/ui/views/DockerNetworkView.d.ts +2 -0
- package/dist/ui/views/DockerNetworkView.d.ts.map +1 -0
- package/dist/ui/views/DockerNetworkView.js +29 -0
- package/dist/ui/views/DockerNetworkView.js.map +1 -0
- package/dist/ui/views/DockerPruneView.d.ts +2 -0
- package/dist/ui/views/DockerPruneView.d.ts.map +1 -0
- package/dist/ui/views/DockerPruneView.js +57 -0
- package/dist/ui/views/DockerPruneView.js.map +1 -0
- package/dist/ui/views/DockerStatusView.d.ts +2 -0
- package/dist/ui/views/DockerStatusView.d.ts.map +1 -0
- package/dist/ui/views/DockerStatusView.js +43 -0
- package/dist/ui/views/DockerStatusView.js.map +1 -0
- package/dist/ui/views/JtapiDisableView.d.ts +2 -0
- package/dist/ui/views/JtapiDisableView.d.ts.map +1 -0
- package/dist/ui/views/JtapiDisableView.js +55 -0
- package/dist/ui/views/JtapiDisableView.js.map +1 -0
- package/dist/ui/views/JtapiEnableView.d.ts +2 -0
- package/dist/ui/views/JtapiEnableView.d.ts.map +1 -0
- package/dist/ui/views/JtapiEnableView.js +47 -0
- package/dist/ui/views/JtapiEnableView.js.map +1 -0
- package/dist/ui/views/JtapiStatusView.d.ts +2 -0
- package/dist/ui/views/JtapiStatusView.d.ts.map +1 -0
- package/dist/ui/views/JtapiStatusView.js +18 -0
- package/dist/ui/views/JtapiStatusView.js.map +1 -0
- package/dist/ui/views/JtapiTroubleshootView.d.ts +2 -0
- package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -0
- package/dist/ui/views/JtapiTroubleshootView.js +120 -0
- package/dist/ui/views/JtapiTroubleshootView.js.map +1 -0
- package/dist/ui/views/MainMenu.d.ts +8 -0
- package/dist/ui/views/MainMenu.d.ts.map +1 -0
- package/dist/ui/views/MainMenu.js +110 -0
- package/dist/ui/views/MainMenu.js.map +1 -0
- package/dist/ui/views/MigrateHistoryView.d.ts +2 -0
- package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -0
- package/dist/ui/views/MigrateHistoryView.js +25 -0
- package/dist/ui/views/MigrateHistoryView.js.map +1 -0
- package/dist/ui/views/MigrateRollbackView.d.ts +6 -0
- package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -0
- package/dist/ui/views/MigrateRollbackView.js +50 -0
- package/dist/ui/views/MigrateRollbackView.js.map +1 -0
- package/dist/ui/views/MigrateRunView.d.ts +2 -0
- package/dist/ui/views/MigrateRunView.d.ts.map +1 -0
- package/dist/ui/views/MigrateRunView.js +50 -0
- package/dist/ui/views/MigrateRunView.js.map +1 -0
- package/dist/ui/views/MigrateStatusView.d.ts +2 -0
- package/dist/ui/views/MigrateStatusView.d.ts.map +1 -0
- package/dist/ui/views/MigrateStatusView.js +88 -0
- package/dist/ui/views/MigrateStatusView.js.map +1 -0
- package/dist/ui/views/MigrateWatchView.d.ts +6 -0
- package/dist/ui/views/MigrateWatchView.d.ts.map +1 -0
- package/dist/ui/views/MigrateWatchView.js +83 -0
- package/dist/ui/views/MigrateWatchView.js.map +1 -0
- package/dist/ui/views/OfflineListView.d.ts +2 -0
- package/dist/ui/views/OfflineListView.d.ts.map +1 -0
- package/dist/ui/views/OfflineListView.js +47 -0
- package/dist/ui/views/OfflineListView.js.map +1 -0
- package/dist/ui/views/SecretsSetupView.d.ts +2 -0
- package/dist/ui/views/SecretsSetupView.d.ts.map +1 -0
- package/dist/ui/views/SecretsSetupView.js +94 -0
- package/dist/ui/views/SecretsSetupView.js.map +1 -0
- package/dist/ui/views/SecretsStatusView.d.ts +2 -0
- package/dist/ui/views/SecretsStatusView.d.ts.map +1 -0
- package/dist/ui/views/SecretsStatusView.js +36 -0
- package/dist/ui/views/SecretsStatusView.js.map +1 -0
- package/dist/ui/views/StatusView.d.ts +2 -0
- package/dist/ui/views/StatusView.d.ts.map +1 -0
- package/dist/ui/views/StatusView.js +80 -0
- package/dist/ui/views/StatusView.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +30 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/prompt.d.ts +6 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +25 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/version.d.ts +8 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +35 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface NetworkInterfaceInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
family: 'IPv4' | 'IPv6';
|
|
4
|
+
address: string;
|
|
5
|
+
netmask: string;
|
|
6
|
+
mac: string;
|
|
7
|
+
internal: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function getNetworkInterfaceList(): NetworkInterfaceInfo[];
|
|
10
|
+
export declare function getSystemHostname(): string;
|
|
11
|
+
export declare function getPlatformInfo(): {
|
|
12
|
+
platform: string;
|
|
13
|
+
arch: string;
|
|
14
|
+
nodeVersion: string;
|
|
15
|
+
};
|
|
16
|
+
export interface DnsResult {
|
|
17
|
+
host: string;
|
|
18
|
+
ipv4: string[];
|
|
19
|
+
ipv6: string[];
|
|
20
|
+
durationMs: number;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function resolveDns(host: string): Promise<DnsResult>;
|
|
24
|
+
export interface TcpCheckResult {
|
|
25
|
+
host: string;
|
|
26
|
+
port: number;
|
|
27
|
+
open: boolean;
|
|
28
|
+
durationMs: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function checkTcpPort(host: string, port: number, timeoutMs?: number): Promise<TcpCheckResult>;
|
|
32
|
+
export interface HttpsCheckResult {
|
|
33
|
+
url: string;
|
|
34
|
+
status?: number;
|
|
35
|
+
durationMs: number;
|
|
36
|
+
tlsVersion?: string;
|
|
37
|
+
certExpiry?: string;
|
|
38
|
+
error?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function checkHttps(url: string, timeoutMs?: number): Promise<HttpsCheckResult>;
|
|
41
|
+
export declare function getPingArgs(target: string, count?: number, timeoutSec?: number): string[];
|
|
42
|
+
export declare function getDefaultGateway(): Promise<string | null>;
|
|
43
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/lib/network.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,EAAE,CAmBhE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,eAAe,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAMzF;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA8BjE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BlG;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkDpF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,UAAU,SAAI,GAAG,MAAM,EAAE,CAO/E;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBhE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { networkInterfaces, hostname, platform, arch } from 'node:os';
|
|
2
|
+
import { createConnection } from 'node:net';
|
|
3
|
+
import { request as httpsRequest } from 'node:https';
|
|
4
|
+
import * as dns from 'node:dns/promises';
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
export function getNetworkInterfaceList() {
|
|
7
|
+
const ifaces = networkInterfaces();
|
|
8
|
+
const result = [];
|
|
9
|
+
for (const [name, addrs] of Object.entries(ifaces)) {
|
|
10
|
+
if (!addrs)
|
|
11
|
+
continue;
|
|
12
|
+
for (const addr of addrs) {
|
|
13
|
+
result.push({
|
|
14
|
+
name,
|
|
15
|
+
family: addr.family,
|
|
16
|
+
address: addr.address,
|
|
17
|
+
netmask: addr.netmask,
|
|
18
|
+
mac: addr.mac,
|
|
19
|
+
internal: addr.internal,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
export function getSystemHostname() {
|
|
26
|
+
return hostname();
|
|
27
|
+
}
|
|
28
|
+
export function getPlatformInfo() {
|
|
29
|
+
return {
|
|
30
|
+
platform: `${platform()} (${arch()})`,
|
|
31
|
+
arch: arch(),
|
|
32
|
+
nodeVersion: process.version,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function resolveDns(host) {
|
|
36
|
+
const start = performance.now();
|
|
37
|
+
let ipv4 = [];
|
|
38
|
+
let ipv6 = [];
|
|
39
|
+
let error;
|
|
40
|
+
try {
|
|
41
|
+
const [v4Result, v6Result] = await Promise.allSettled([
|
|
42
|
+
dns.resolve4(host),
|
|
43
|
+
dns.resolve6(host),
|
|
44
|
+
]);
|
|
45
|
+
if (v4Result.status === 'fulfilled')
|
|
46
|
+
ipv4 = v4Result.value;
|
|
47
|
+
if (v6Result.status === 'fulfilled')
|
|
48
|
+
ipv6 = v6Result.value;
|
|
49
|
+
if (ipv4.length === 0 && ipv6.length === 0) {
|
|
50
|
+
const v4Err = v4Result.status === 'rejected' ? v4Result.reason.message : '';
|
|
51
|
+
error = v4Err || 'No addresses found';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
error = e.message;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
host,
|
|
59
|
+
ipv4,
|
|
60
|
+
ipv6,
|
|
61
|
+
durationMs: Math.round(performance.now() - start),
|
|
62
|
+
error,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function checkTcpPort(host, port, timeoutMs = 5000) {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
const start = performance.now();
|
|
68
|
+
let socket = null;
|
|
69
|
+
let settled = false;
|
|
70
|
+
const finish = (open, error) => {
|
|
71
|
+
if (settled)
|
|
72
|
+
return;
|
|
73
|
+
settled = true;
|
|
74
|
+
if (socket) {
|
|
75
|
+
socket.removeAllListeners();
|
|
76
|
+
socket.destroy();
|
|
77
|
+
}
|
|
78
|
+
resolve({
|
|
79
|
+
host,
|
|
80
|
+
port,
|
|
81
|
+
open,
|
|
82
|
+
durationMs: Math.round(performance.now() - start),
|
|
83
|
+
error,
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
socket = createConnection({ host, port, timeout: timeoutMs });
|
|
87
|
+
socket.on('connect', () => finish(true));
|
|
88
|
+
socket.on('timeout', () => finish(false, 'timeout'));
|
|
89
|
+
socket.on('error', (err) => {
|
|
90
|
+
const code = err.code;
|
|
91
|
+
finish(false, err.message || code || 'connection failed');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function checkHttps(url, timeoutMs = 10000) {
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
const start = performance.now();
|
|
98
|
+
let settled = false;
|
|
99
|
+
const finish = (result) => {
|
|
100
|
+
if (settled)
|
|
101
|
+
return;
|
|
102
|
+
settled = true;
|
|
103
|
+
resolve({
|
|
104
|
+
url,
|
|
105
|
+
durationMs: Math.round(performance.now() - start),
|
|
106
|
+
...result,
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
try {
|
|
110
|
+
const req = httpsRequest(url, { method: 'HEAD', timeout: timeoutMs }, (res) => {
|
|
111
|
+
const socket = res.socket;
|
|
112
|
+
let tlsVersion;
|
|
113
|
+
let certExpiry;
|
|
114
|
+
if (socket && typeof socket.getProtocol === 'function') {
|
|
115
|
+
tlsVersion = socket.getProtocol() ?? undefined;
|
|
116
|
+
}
|
|
117
|
+
if (socket && typeof socket.getPeerCertificate === 'function') {
|
|
118
|
+
const cert = socket.getPeerCertificate();
|
|
119
|
+
if (cert?.valid_to) {
|
|
120
|
+
certExpiry = cert.valid_to;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
res.resume();
|
|
124
|
+
finish({ status: res.statusCode, tlsVersion, certExpiry });
|
|
125
|
+
});
|
|
126
|
+
req.on('timeout', () => {
|
|
127
|
+
req.destroy();
|
|
128
|
+
finish({ error: 'timeout' });
|
|
129
|
+
});
|
|
130
|
+
req.on('error', (err) => {
|
|
131
|
+
finish({ error: err.message });
|
|
132
|
+
});
|
|
133
|
+
req.end();
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
finish({ error: e.message });
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
export function getPingArgs(target, count = 3, timeoutSec = 2) {
|
|
141
|
+
if (platform() === 'darwin') {
|
|
142
|
+
// macOS: -W takes milliseconds
|
|
143
|
+
return ['-c', String(count), '-W', String(timeoutSec * 1000), target];
|
|
144
|
+
}
|
|
145
|
+
// Linux: -W takes seconds
|
|
146
|
+
return ['-c', String(count), '-W', String(timeoutSec), target];
|
|
147
|
+
}
|
|
148
|
+
export async function getDefaultGateway() {
|
|
149
|
+
try {
|
|
150
|
+
if (platform() === 'darwin') {
|
|
151
|
+
const { stdout } = await execa('netstat', ['-rn']);
|
|
152
|
+
const defaultLine = stdout.split('\n').find(l => l.startsWith('default'));
|
|
153
|
+
if (defaultLine) {
|
|
154
|
+
const parts = defaultLine.split(/\s+/);
|
|
155
|
+
return parts[1] ?? null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const { stdout } = await execa('ip', ['route']);
|
|
160
|
+
const defaultLine = stdout.split('\n').find(l => l.startsWith('default'));
|
|
161
|
+
if (defaultLine) {
|
|
162
|
+
const parts = defaultLine.split(/\s+/);
|
|
163
|
+
return parts[2] ?? null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Command not available
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/lib/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function getPaths(): {
|
|
2
|
+
installDir: string;
|
|
3
|
+
backupDir: string;
|
|
4
|
+
dbDumpsDir: string;
|
|
5
|
+
composeFile: string;
|
|
6
|
+
overrideFile: string;
|
|
7
|
+
certsDir: string;
|
|
8
|
+
postgresDataDir: string;
|
|
9
|
+
jtapiOverlayFile: string;
|
|
10
|
+
jtapiStateFile: string;
|
|
11
|
+
secretsOverlayFile: string;
|
|
12
|
+
gcsBaseUrl: string;
|
|
13
|
+
gcsBundleBaseUrl: string;
|
|
14
|
+
scriptUrl: string;
|
|
15
|
+
prepScriptUrl: string;
|
|
16
|
+
postgresSupportedVersions: string[];
|
|
17
|
+
postgresDefaultVersion: string;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAyDA,wBAAgB,QAAQ;;;;;;;;;;;;;;;;;EAGvB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const GCS_BASE_URL = 'https://storage.googleapis.com/ct_releases';
|
|
5
|
+
const GCS_BUNDLE_BASE_URL = `${GCS_BASE_URL}/releases`;
|
|
6
|
+
const KNOWN_INSTALL_PATHS = ['/home/calltelemetry', '/opt/calltelemetry'];
|
|
7
|
+
function detectInstallDir() {
|
|
8
|
+
const sudoUser = process.env.SUDO_USER;
|
|
9
|
+
const fallback = sudoUser
|
|
10
|
+
? join('/home', sudoUser)
|
|
11
|
+
: homedir();
|
|
12
|
+
for (const checkPath of KNOWN_INSTALL_PATHS) {
|
|
13
|
+
if (checkPath === fallback)
|
|
14
|
+
continue;
|
|
15
|
+
const composePath = join(checkPath, 'docker-compose.yml');
|
|
16
|
+
if (existsSync(composePath)) {
|
|
17
|
+
try {
|
|
18
|
+
const content = readFileSync(composePath, 'utf-8');
|
|
19
|
+
if (content.includes('calltelemetry')) {
|
|
20
|
+
return checkPath;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore read errors
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
let cached = null;
|
|
31
|
+
function buildPaths() {
|
|
32
|
+
const installDir = detectInstallDir();
|
|
33
|
+
return {
|
|
34
|
+
installDir,
|
|
35
|
+
backupDir: join(installDir, 'backups'),
|
|
36
|
+
dbDumpsDir: join(installDir, 'db_dumps'),
|
|
37
|
+
composeFile: join(installDir, 'docker-compose.yml'),
|
|
38
|
+
overrideFile: join(installDir, 'docker-compose.override.yml'),
|
|
39
|
+
certsDir: join(installDir, 'certs'),
|
|
40
|
+
postgresDataDir: join(installDir, 'postgres-data'),
|
|
41
|
+
jtapiOverlayFile: join(installDir, 'docker-compose-jtapi.yml'),
|
|
42
|
+
jtapiStateFile: join(installDir, '.jtapi-enabled'),
|
|
43
|
+
secretsOverlayFile: join(installDir, 'docker-compose.secrets.yml'),
|
|
44
|
+
gcsBaseUrl: GCS_BASE_URL,
|
|
45
|
+
gcsBundleBaseUrl: GCS_BUNDLE_BASE_URL,
|
|
46
|
+
scriptUrl: `${GCS_BASE_URL}/cli.sh`,
|
|
47
|
+
prepScriptUrl: `${GCS_BASE_URL}/prep.sh`,
|
|
48
|
+
postgresSupportedVersions: ['14', '15', '16', '17', '18'],
|
|
49
|
+
postgresDefaultVersion: '17',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function getPaths() {
|
|
53
|
+
if (!cached)
|
|
54
|
+
cached = buildPaths();
|
|
55
|
+
return cached;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAClE,MAAM,mBAAmB,GAAG,GAAG,YAAY,WAAW,CAAC;AAEvD,MAAM,mBAAmB,GAAG,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;AAE1E,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,CAAC,CAAC,OAAO,EAAE,CAAC;IAEd,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;QAC5C,IAAI,SAAS,KAAK,QAAQ;YAAE,SAAS;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC1D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;oBACtC,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,IAAI,MAAM,GAAyC,IAAI,CAAC;AAExD,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,OAAO;QACL,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;QACtC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QACxC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC;QACnD,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,6BAA6B,CAAC;QAC7D,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACnC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC;QAClD,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC;QAC9D,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;QAClD,kBAAkB,EAAE,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC;QAClE,UAAU,EAAE,YAAY;QACxB,gBAAgB,EAAE,mBAAmB;QACrC,SAAS,EAAE,GAAG,YAAY,SAAS;QACnC,aAAa,EAAE,GAAG,YAAY,UAAU;QACxC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACzD,sBAAsB,EAAE,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,UAAU,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/lib/postgres.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAmBhD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import { getPaths } from './paths.js';
|
|
4
|
+
import { writeFileSafe } from './fs.js';
|
|
5
|
+
export function getPostgresVersion() {
|
|
6
|
+
const { overrideFile, postgresDefaultVersion } = getPaths();
|
|
7
|
+
if (existsSync(overrideFile)) {
|
|
8
|
+
const content = readFileSync(overrideFile, 'utf-8');
|
|
9
|
+
const match = content.match(/calltelemetry\/postgres:(\d+)/);
|
|
10
|
+
if (match)
|
|
11
|
+
return match[1];
|
|
12
|
+
}
|
|
13
|
+
return postgresDefaultVersion;
|
|
14
|
+
}
|
|
15
|
+
export function getCurrentPostgresImage() {
|
|
16
|
+
const { overrideFile, composeFile } = getPaths();
|
|
17
|
+
if (existsSync(overrideFile)) {
|
|
18
|
+
const content = readFileSync(overrideFile, 'utf-8');
|
|
19
|
+
const match = content.match(/image:\s*"?([^"\s]+)"?/);
|
|
20
|
+
if (match)
|
|
21
|
+
return match[1];
|
|
22
|
+
}
|
|
23
|
+
if (existsSync(composeFile)) {
|
|
24
|
+
const content = readFileSync(composeFile, 'utf-8');
|
|
25
|
+
const dbSection = content.split(/^\s*db:/m)[1];
|
|
26
|
+
if (dbSection) {
|
|
27
|
+
const match = dbSection.match(/image:\s*"?([^"\s]+)"?/);
|
|
28
|
+
if (match)
|
|
29
|
+
return match[1];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
export async function setPostgresVersion(version) {
|
|
35
|
+
const { postgresSupportedVersions, gcsBaseUrl, overrideFile } = getPaths();
|
|
36
|
+
if (!postgresSupportedVersions.includes(version)) {
|
|
37
|
+
throw new Error(`Invalid PostgreSQL version: ${version}\n` +
|
|
38
|
+
`Supported versions: ${postgresSupportedVersions.join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
const url = `${gcsBaseUrl}/postgres-${version}.yaml`;
|
|
41
|
+
try {
|
|
42
|
+
const { stdout } = await execa('curl', ['-sfL', url]);
|
|
43
|
+
await writeFileSafe(overrideFile, stdout);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new Error(`Failed to download override file from: ${url}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/lib/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC5D,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC7D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEjD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACtD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,MAAM,EAAE,yBAAyB,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE3E,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,IAAI;YAC1C,uBAAuB,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,UAAU,aAAa,OAAO,OAAO,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/lib/rpc.ts"],"names":[],"mappings":"AAIA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvD;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/lib/rpc.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { composeExec } from './compose.js';
|
|
2
|
+
const RELEASE_BIN = '/home/app/onprem/bin/onprem';
|
|
3
|
+
export async function rpc(code) {
|
|
4
|
+
const result = await composeExec('web', [RELEASE_BIN, 'rpc', code], { pipe: true });
|
|
5
|
+
return result.stdout ?? '';
|
|
6
|
+
}
|
|
7
|
+
export async function rpcOk() {
|
|
8
|
+
try {
|
|
9
|
+
const output = await rpc('IO.puts("ok")');
|
|
10
|
+
return output.includes('ok');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function healthCheck() {
|
|
17
|
+
try {
|
|
18
|
+
const result = await composeExec('web', ['curl', '-sf', 'http://127.0.0.1:4080/healthz'], { pipe: true });
|
|
19
|
+
return result.exitCode === 0;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function getReleaseBin() {
|
|
26
|
+
return RELEASE_BIN;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/lib/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,+BAA+B,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1G,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface SecretDef {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
group: 'PostgreSQL' | 'NATS' | 'Minio';
|
|
5
|
+
defaultValue: string;
|
|
6
|
+
sensitive: boolean;
|
|
7
|
+
required: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const SECRET_CATALOG: SecretDef[];
|
|
10
|
+
export declare const SECRET_GROUPS: readonly ["PostgreSQL", "NATS", "Minio"];
|
|
11
|
+
export type SecretGroup = (typeof SECRET_GROUPS)[number];
|
|
12
|
+
export declare function getEnvFilePath(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Parse a .env file into key-value pairs.
|
|
15
|
+
* Handles: comments, blank lines, export prefix, quoted values, values with =
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseEnvFile(content: string): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Load secrets with priority: defaults → .env file → process.env
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSecrets(): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if any secrets have been customized (via .env or process.env)
|
|
24
|
+
*/
|
|
25
|
+
export declare function isCustomized(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Count how many secrets differ from defaults
|
|
28
|
+
*/
|
|
29
|
+
export declare function countOverrides(): number;
|
|
30
|
+
/**
|
|
31
|
+
* Write secrets to .env file with 0600 permissions
|
|
32
|
+
*/
|
|
33
|
+
export declare function writeEnvFile(values: Record<string, string>): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Generate docker-compose.secrets.yml overlay file
|
|
36
|
+
*/
|
|
37
|
+
export declare function writeSecretsOverlay(): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/lib/secrets.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,EAOrC,CAAC;AAEF,eAAO,MAAM,aAAa,0CAA2C,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBpE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4BnD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAMtC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBzD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getPaths } from './paths.js';
|
|
4
|
+
import { writeFileSafe } from './fs.js';
|
|
5
|
+
export const SECRET_CATALOG = [
|
|
6
|
+
{ key: 'POSTGRES_PASSWORD', label: 'PostgreSQL Password', group: 'PostgreSQL', defaultValue: 'postgres', sensitive: true, required: true },
|
|
7
|
+
{ key: 'POSTGRES_USER', label: 'PostgreSQL User', group: 'PostgreSQL', defaultValue: 'calltelemetry', sensitive: false, required: true },
|
|
8
|
+
{ key: 'POSTGRES_DB', label: 'PostgreSQL Database', group: 'PostgreSQL', defaultValue: 'calltelemetry_prod', sensitive: false, required: true },
|
|
9
|
+
{ key: 'NATS_PASSWORD', label: 'NATS Password', group: 'NATS', defaultValue: '', sensitive: true, required: false },
|
|
10
|
+
{ key: 'MINIO_ROOT_USER', label: 'Minio Root User', group: 'Minio', defaultValue: 'minioadmin', sensitive: false, required: false },
|
|
11
|
+
{ key: 'MINIO_ROOT_PASSWORD', label: 'Minio Root Password', group: 'Minio', defaultValue: 'minioadmin', sensitive: true, required: false },
|
|
12
|
+
];
|
|
13
|
+
export const SECRET_GROUPS = ['PostgreSQL', 'NATS', 'Minio'];
|
|
14
|
+
export function getEnvFilePath() {
|
|
15
|
+
return join(getPaths().installDir, '.env');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a .env file into key-value pairs.
|
|
19
|
+
* Handles: comments, blank lines, export prefix, quoted values, values with =
|
|
20
|
+
*/
|
|
21
|
+
export function parseEnvFile(content) {
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const rawLine of content.split('\n')) {
|
|
24
|
+
const line = rawLine.trim();
|
|
25
|
+
if (!line || line.startsWith('#'))
|
|
26
|
+
continue;
|
|
27
|
+
// Strip optional 'export ' prefix
|
|
28
|
+
const stripped = line.startsWith('export ') ? line.slice(7) : line;
|
|
29
|
+
const eqIdx = stripped.indexOf('=');
|
|
30
|
+
if (eqIdx === -1)
|
|
31
|
+
continue;
|
|
32
|
+
const key = stripped.slice(0, eqIdx).trim();
|
|
33
|
+
let value = stripped.slice(eqIdx + 1).trim();
|
|
34
|
+
// Strip matching quotes
|
|
35
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
36
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
37
|
+
value = value.slice(1, -1);
|
|
38
|
+
}
|
|
39
|
+
if (key)
|
|
40
|
+
result[key] = value;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load secrets with priority: defaults → .env file → process.env
|
|
46
|
+
*/
|
|
47
|
+
export function getSecrets() {
|
|
48
|
+
const secrets = {};
|
|
49
|
+
// 1. Start with defaults
|
|
50
|
+
for (const def of SECRET_CATALOG) {
|
|
51
|
+
secrets[def.key] = def.defaultValue;
|
|
52
|
+
}
|
|
53
|
+
// 2. Load .env file (if exists)
|
|
54
|
+
const envPath = getEnvFilePath();
|
|
55
|
+
if (existsSync(envPath)) {
|
|
56
|
+
const content = readFileSync(envPath, 'utf-8');
|
|
57
|
+
const parsed = parseEnvFile(content);
|
|
58
|
+
for (const def of SECRET_CATALOG) {
|
|
59
|
+
if (parsed[def.key] !== undefined) {
|
|
60
|
+
secrets[def.key] = parsed[def.key];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 3. Override with process.env (highest priority)
|
|
65
|
+
for (const def of SECRET_CATALOG) {
|
|
66
|
+
if (process.env[def.key] !== undefined) {
|
|
67
|
+
secrets[def.key] = process.env[def.key];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return secrets;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if any secrets have been customized (via .env or process.env)
|
|
74
|
+
*/
|
|
75
|
+
export function isCustomized() {
|
|
76
|
+
const envPath = getEnvFilePath();
|
|
77
|
+
if (!existsSync(envPath))
|
|
78
|
+
return false;
|
|
79
|
+
const content = readFileSync(envPath, 'utf-8');
|
|
80
|
+
const parsed = parseEnvFile(content);
|
|
81
|
+
return SECRET_CATALOG.some(def => parsed[def.key] !== undefined);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Count how many secrets differ from defaults
|
|
85
|
+
*/
|
|
86
|
+
export function countOverrides() {
|
|
87
|
+
const secrets = getSecrets();
|
|
88
|
+
return SECRET_CATALOG.filter(def => secrets[def.key] !== def.defaultValue).length;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Write secrets to .env file with 0600 permissions
|
|
92
|
+
*/
|
|
93
|
+
export async function writeEnvFile(values) {
|
|
94
|
+
const envPath = getEnvFilePath();
|
|
95
|
+
const lines = [
|
|
96
|
+
'# CallTelemetry secrets — generated by ct secrets setup',
|
|
97
|
+
`# Last updated: ${new Date().toISOString()}`,
|
|
98
|
+
'',
|
|
99
|
+
];
|
|
100
|
+
for (const def of SECRET_CATALOG) {
|
|
101
|
+
const value = values[def.key] ?? def.defaultValue;
|
|
102
|
+
if (value) {
|
|
103
|
+
lines.push(`${def.key}=${value}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
lines.push('');
|
|
107
|
+
await writeFileSafe(envPath, lines.join('\n'), { mode: 0o600 });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Generate docker-compose.secrets.yml overlay file
|
|
111
|
+
*/
|
|
112
|
+
export async function writeSecretsOverlay() {
|
|
113
|
+
const { secretsOverlayFile } = getPaths();
|
|
114
|
+
const content = `# Auto-generated by ct secrets setup — do not edit manually
|
|
115
|
+
# To reconfigure: ct secrets setup
|
|
116
|
+
services:
|
|
117
|
+
db:
|
|
118
|
+
environment:
|
|
119
|
+
POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
|
|
120
|
+
POSTGRES_USER: \${POSTGRES_USER:-calltelemetry}
|
|
121
|
+
POSTGRES_DB: \${POSTGRES_DB:-calltelemetry_prod}
|
|
122
|
+
nats:
|
|
123
|
+
environment:
|
|
124
|
+
NATS_PASSWORD: \${NATS_PASSWORD:-}
|
|
125
|
+
minio:
|
|
126
|
+
environment:
|
|
127
|
+
MINIO_ROOT_USER: \${MINIO_ROOT_USER:-minioadmin}
|
|
128
|
+
MINIO_ROOT_PASSWORD: \${MINIO_ROOT_PASSWORD:-minioadmin}
|
|
129
|
+
`;
|
|
130
|
+
await writeFileSafe(secretsOverlayFile, content);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/lib/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function checkRam(requiredMb?: number): Promise<{
|
|
2
|
+
ok: boolean;
|
|
3
|
+
totalMb: number;
|
|
4
|
+
}>;
|
|
5
|
+
export declare function checkDiskSpace(path?: string, requiredFreePercent?: number): Promise<{
|
|
6
|
+
ok: boolean;
|
|
7
|
+
usedPercent: number;
|
|
8
|
+
freePercent: number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function getDockerVersion(): Promise<number | null>;
|
|
11
|
+
export declare function getSystemStats(): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/lib/system.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,UAAU,SAAO,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI3F;AAED,wBAAsB,cAAc,CAAC,IAAI,SAAM,EAAE,mBAAmB,SAAK,GAAG,OAAO,CAAC;IAClF,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAcD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ/D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAsBtD"}
|