@calltelemetry/cli 0.4.26 → 0.5.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/diag.d.ts.map +1 -1
- package/dist/commands/diag.js +29 -0
- package/dist/commands/diag.js.map +1 -1
- package/dist/commands/k8s.d.ts +3 -0
- package/dist/commands/k8s.d.ts.map +1 -0
- package/dist/commands/k8s.js +192 -0
- package/dist/commands/k8s.js.map +1 -0
- package/dist/commands/network.d.ts +3 -0
- package/dist/commands/network.d.ts.map +1 -0
- package/dist/commands/network.js +120 -0
- package/dist/commands/network.js.map +1 -0
- package/dist/commands/shell.d.ts +3 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +10 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/backend.d.ts +85 -0
- package/dist/lib/backend.d.ts.map +1 -0
- package/dist/lib/backend.js +6 -0
- package/dist/lib/backend.js.map +1 -0
- package/dist/lib/compose-backend.d.ts +19 -0
- package/dist/lib/compose-backend.d.ts.map +1 -0
- package/dist/lib/compose-backend.js +78 -0
- package/dist/lib/compose-backend.js.map +1 -0
- package/dist/lib/deployment.d.ts +6 -0
- package/dist/lib/deployment.d.ts.map +1 -0
- package/dist/lib/deployment.js +51 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/doctor.d.ts +13 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +82 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/helmfile.d.ts +14 -0
- package/dist/lib/helmfile.d.ts.map +1 -0
- package/dist/lib/helmfile.js +78 -0
- package/dist/lib/helmfile.js.map +1 -0
- package/dist/lib/k8s-backend.d.ts +36 -0
- package/dist/lib/k8s-backend.d.ts.map +1 -0
- package/dist/lib/k8s-backend.js +301 -0
- package/dist/lib/k8s-backend.js.map +1 -0
- package/dist/lib/k8s-client.d.ts +14 -0
- package/dist/lib/k8s-client.d.ts.map +1 -0
- package/dist/lib/k8s-client.js +42 -0
- package/dist/lib/k8s-client.js.map +1 -0
- package/dist/lib/prefs.d.ts +3 -0
- package/dist/lib/prefs.d.ts.map +1 -1
- package/dist/lib/prefs.js +9 -1
- package/dist/lib/prefs.js.map +1 -1
- package/dist/shell/commands/config.d.ts +11 -0
- package/dist/shell/commands/config.d.ts.map +1 -0
- package/dist/shell/commands/config.js +193 -0
- package/dist/shell/commands/config.js.map +1 -0
- package/dist/shell/commands/connect.d.ts +18 -0
- package/dist/shell/commands/connect.d.ts.map +1 -0
- package/dist/shell/commands/connect.js +99 -0
- package/dist/shell/commands/connect.js.map +1 -0
- package/dist/shell/commands/db.d.ts +11 -0
- package/dist/shell/commands/db.d.ts.map +1 -0
- package/dist/shell/commands/db.js +237 -0
- package/dist/shell/commands/db.js.map +1 -0
- package/dist/shell/commands/debug.d.ts +15 -0
- package/dist/shell/commands/debug.d.ts.map +1 -0
- package/dist/shell/commands/debug.js +310 -0
- package/dist/shell/commands/debug.js.map +1 -0
- package/dist/shell/commands/diag.d.ts +16 -0
- package/dist/shell/commands/diag.d.ts.map +1 -0
- package/dist/shell/commands/diag.js +555 -0
- package/dist/shell/commands/diag.js.map +1 -0
- package/dist/shell/commands/registry.d.ts +7 -0
- package/dist/shell/commands/registry.d.ts.map +1 -0
- package/dist/shell/commands/registry.js +391 -0
- package/dist/shell/commands/registry.js.map +1 -0
- package/dist/shell/commands/secrets.d.ts +18 -0
- package/dist/shell/commands/secrets.d.ts.map +1 -0
- package/dist/shell/commands/secrets.js +100 -0
- package/dist/shell/commands/secrets.js.map +1 -0
- package/dist/shell/commands/services.d.ts +7 -0
- package/dist/shell/commands/services.d.ts.map +1 -0
- package/dist/shell/commands/services.js +115 -0
- package/dist/shell/commands/services.js.map +1 -0
- package/dist/shell/commands/show.d.ts +26 -0
- package/dist/shell/commands/show.d.ts.map +1 -0
- package/dist/shell/commands/show.js +897 -0
- package/dist/shell/commands/show.js.map +1 -0
- package/dist/shell/commands/system.d.ts +13 -0
- package/dist/shell/commands/system.d.ts.map +1 -0
- package/dist/shell/commands/system.js +270 -0
- package/dist/shell/commands/system.js.map +1 -0
- package/dist/shell/commands/test.d.ts +12 -0
- package/dist/shell/commands/test.d.ts.map +1 -0
- package/dist/shell/commands/test.js +197 -0
- package/dist/shell/commands/test.js.map +1 -0
- package/dist/shell/commands/users.d.ts +14 -0
- package/dist/shell/commands/users.d.ts.map +1 -0
- package/dist/shell/commands/users.js +86 -0
- package/dist/shell/commands/users.js.map +1 -0
- package/dist/shell/completer.d.ts +16 -0
- package/dist/shell/completer.d.ts.map +1 -0
- package/dist/shell/completer.js +124 -0
- package/dist/shell/completer.js.map +1 -0
- package/dist/shell/context.d.ts +12 -0
- package/dist/shell/context.d.ts.map +1 -0
- package/dist/shell/context.js +2 -0
- package/dist/shell/context.js.map +1 -0
- package/dist/shell/footer.d.ts +8 -0
- package/dist/shell/footer.d.ts.map +1 -0
- package/dist/shell/footer.js +47 -0
- package/dist/shell/footer.js.map +1 -0
- package/dist/shell/formatter.d.ts +47 -0
- package/dist/shell/formatter.d.ts.map +1 -0
- package/dist/shell/formatter.js +135 -0
- package/dist/shell/formatter.js.map +1 -0
- package/dist/shell/mcp-bridge.d.ts +13 -0
- package/dist/shell/mcp-bridge.d.ts.map +1 -0
- package/dist/shell/mcp-bridge.js +23 -0
- package/dist/shell/mcp-bridge.js.map +1 -0
- package/dist/shell/parser.d.ts +33 -0
- package/dist/shell/parser.d.ts.map +1 -0
- package/dist/shell/parser.js +100 -0
- package/dist/shell/parser.js.map +1 -0
- package/dist/shell/repl.d.ts +5 -0
- package/dist/shell/repl.d.ts.map +1 -0
- package/dist/shell/repl.js +251 -0
- package/dist/shell/repl.js.map +1 -0
- package/dist/shell/sparkline.d.ts +16 -0
- package/dist/shell/sparkline.d.ts.map +1 -0
- package/dist/shell/sparkline.js +56 -0
- package/dist/shell/sparkline.js.map +1 -0
- package/dist/shell/theme.d.ts +72 -0
- package/dist/shell/theme.d.ts.map +1 -0
- package/dist/shell/theme.js +60 -0
- package/dist/shell/theme.js.map +1 -0
- package/dist/ui/views/DbHealthView.d.ts +6 -0
- package/dist/ui/views/DbHealthView.d.ts.map +1 -0
- package/dist/ui/views/DbHealthView.js +180 -0
- package/dist/ui/views/DbHealthView.js.map +1 -0
- package/dist/ui/views/K8sDeployView.d.ts +8 -0
- package/dist/ui/views/K8sDeployView.d.ts.map +1 -0
- package/dist/ui/views/K8sDeployView.js +81 -0
- package/dist/ui/views/K8sDeployView.js.map +1 -0
- package/dist/ui/views/K8sRunbookView.d.ts +8 -0
- package/dist/ui/views/K8sRunbookView.d.ts.map +1 -0
- package/dist/ui/views/K8sRunbookView.js +181 -0
- package/dist/ui/views/K8sRunbookView.js.map +1 -0
- package/dist/ui/views/K8sServicesView.d.ts +8 -0
- package/dist/ui/views/K8sServicesView.d.ts.map +1 -0
- package/dist/ui/views/K8sServicesView.js +106 -0
- package/dist/ui/views/K8sServicesView.js.map +1 -0
- package/dist/ui/views/K8sStatusView.d.ts +8 -0
- package/dist/ui/views/K8sStatusView.d.ts.map +1 -0
- package/dist/ui/views/K8sStatusView.js +135 -0
- package/dist/ui/views/K8sStatusView.js.map +1 -0
- package/dist/ui/views/MainMenu.d.ts.map +1 -1
- package/dist/ui/views/MainMenu.js +54 -24
- package/dist/ui/views/MainMenu.js.map +1 -1
- package/dist/ui/views/SettingsView.d.ts.map +1 -1
- package/dist/ui/views/SettingsView.js +19 -1
- package/dist/ui/views/SettingsView.js.map +1 -1
- package/dist/ui/views/SetupWizardView.d.ts +7 -0
- package/dist/ui/views/SetupWizardView.d.ts.map +1 -0
- package/dist/ui/views/SetupWizardView.js +244 -0
- package/dist/ui/views/SetupWizardView.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* K8sBackend — Kubernetes implementation of DeploymentBackend
|
|
3
|
+
* using @kubernetes/client-node native TypeScript API.
|
|
4
|
+
*/
|
|
5
|
+
import * as k8s from '@kubernetes/client-node';
|
|
6
|
+
import { execa } from 'execa';
|
|
7
|
+
import stream from 'node:stream';
|
|
8
|
+
import { coreApi, appsApi, customObjectsApi, execClient } from './k8s-client.js';
|
|
9
|
+
import { debug } from './log.js';
|
|
10
|
+
const TIMEOUT = 10_000;
|
|
11
|
+
function withTimeout(promise, ms, label) {
|
|
12
|
+
return Promise.race([
|
|
13
|
+
promise,
|
|
14
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms)),
|
|
15
|
+
]);
|
|
16
|
+
}
|
|
17
|
+
export class K8sBackend {
|
|
18
|
+
namespace;
|
|
19
|
+
mode = 'k3s';
|
|
20
|
+
constructor(namespace = 'ct') {
|
|
21
|
+
this.namespace = namespace;
|
|
22
|
+
}
|
|
23
|
+
async listServices() {
|
|
24
|
+
const res = await coreApi().listNamespacedPod({ namespace: this.namespace });
|
|
25
|
+
return res.items.map(pod => ({
|
|
26
|
+
name: pod.metadata?.name ?? '',
|
|
27
|
+
status: pod.status?.phase ?? 'Unknown',
|
|
28
|
+
ready: this.podReadiness(pod),
|
|
29
|
+
image: pod.spec?.containers?.[0]?.image ?? '',
|
|
30
|
+
restarts: pod.status?.containerStatuses?.[0]?.restartCount ?? 0,
|
|
31
|
+
age: this.podAge(pod),
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
async startService(_name) {
|
|
35
|
+
// K8s doesn't have a direct "start" — scale from 0 to 1
|
|
36
|
+
await this.scaleService(_name, 1);
|
|
37
|
+
}
|
|
38
|
+
async stopService(name) {
|
|
39
|
+
await this.scaleService(name, 0);
|
|
40
|
+
}
|
|
41
|
+
async restartService(name) {
|
|
42
|
+
const patch = {
|
|
43
|
+
spec: {
|
|
44
|
+
template: {
|
|
45
|
+
metadata: {
|
|
46
|
+
annotations: {
|
|
47
|
+
'kubectl.kubernetes.io/restartedAt': new Date().toISOString(),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
await appsApi().patchNamespacedDeployment({ name, namespace: this.namespace, body: patch }, k8s.setHeaderOptions('Content-Type', k8s.PatchStrategy.StrategicMergePatch));
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Try as StatefulSet if Deployment not found
|
|
58
|
+
if (err.statusCode === 404) {
|
|
59
|
+
await appsApi().patchNamespacedStatefulSet({ name, namespace: this.namespace, body: patch }, k8s.setHeaderOptions('Content-Type', k8s.PatchStrategy.StrategicMergePatch));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async startAll() {
|
|
67
|
+
// Not directly applicable in K8s — use helmfile sync instead
|
|
68
|
+
throw new Error('Use helmfile sync to deploy all services in K8s mode');
|
|
69
|
+
}
|
|
70
|
+
async stopAll() {
|
|
71
|
+
// Scale all deployments to 0
|
|
72
|
+
const deps = await appsApi().listNamespacedDeployment({ namespace: this.namespace });
|
|
73
|
+
await Promise.all(deps.items.map(d => this.scaleService(d.metadata?.name ?? '', 0)));
|
|
74
|
+
}
|
|
75
|
+
async getLogs(service, lines = 100) {
|
|
76
|
+
const pod = await this.findPodByLabel(service);
|
|
77
|
+
if (!pod?.metadata?.name)
|
|
78
|
+
throw new Error(`No pod found for service: ${service}`);
|
|
79
|
+
const res = await coreApi().readNamespacedPodLog({
|
|
80
|
+
name: pod.metadata.name,
|
|
81
|
+
namespace: this.namespace,
|
|
82
|
+
tailLines: lines,
|
|
83
|
+
});
|
|
84
|
+
return typeof res === 'string' ? res : '';
|
|
85
|
+
}
|
|
86
|
+
async getHealth() {
|
|
87
|
+
const errors = {};
|
|
88
|
+
const checks = await Promise.all([
|
|
89
|
+
this.healthCheck('api', async () => {
|
|
90
|
+
const { stdout } = await this.exec('api', ['curl', '-sf', 'http://127.0.0.1:4000/healthz']);
|
|
91
|
+
return stdout.length > 0;
|
|
92
|
+
}, errors),
|
|
93
|
+
this.healthCheck('curri', async () => {
|
|
94
|
+
const { stdout } = await this.exec('api', ['curl', '-sf', 'http://127.0.0.1:4080/healthz']);
|
|
95
|
+
return stdout.length > 0;
|
|
96
|
+
}, errors),
|
|
97
|
+
this.healthCheck('rpc', async () => {
|
|
98
|
+
const { stdout } = await this.exec('api', ['/app/bin/onprem', 'rpc', 'IO.puts("ok")']);
|
|
99
|
+
return stdout.includes('ok');
|
|
100
|
+
}, errors),
|
|
101
|
+
this.healthCheck('db', async () => {
|
|
102
|
+
const { stdout } = await this.exec('api', [
|
|
103
|
+
'/app/bin/onprem', 'rpc',
|
|
104
|
+
'with {:ok, _} <- Ecto.Adapters.SQL.query(Cdrcisco.Repo, "SELECT 1") do IO.puts("ok") end',
|
|
105
|
+
]);
|
|
106
|
+
return stdout.includes('ok');
|
|
107
|
+
}, errors),
|
|
108
|
+
this.healthCheck('dbDirect', async () => {
|
|
109
|
+
const pgPod = await this.findPodByLabel('postgresql');
|
|
110
|
+
if (!pgPod?.metadata?.name)
|
|
111
|
+
return false;
|
|
112
|
+
const { exitCode } = await this.execPod(pgPod.metadata.name, ['pg_isready', '-U', 'calltelemetry', '-d', 'calltelemetry']);
|
|
113
|
+
return exitCode === 0;
|
|
114
|
+
}, errors),
|
|
115
|
+
this.healthCheck('curriProxy', async () => {
|
|
116
|
+
const r = await execa('curl', ['-sf', 'http://127.0.0.1:80/healthz'], { timeout: 5000 });
|
|
117
|
+
return r.exitCode === 0;
|
|
118
|
+
}, errors),
|
|
119
|
+
this.healthCheck('adminProxy', async () => {
|
|
120
|
+
const r = await execa('curl', ['-sfk', '-o', '/dev/null', '-w', '%{http_code}', 'https://127.0.0.1:443/'], { timeout: 5000 });
|
|
121
|
+
return r.stdout.trim() !== '000';
|
|
122
|
+
}, errors),
|
|
123
|
+
this.healthCheck('sftp', async () => {
|
|
124
|
+
const { stdout } = await this.exec('api', [
|
|
125
|
+
'/app/bin/onprem', 'rpc',
|
|
126
|
+
'case Cdrcisco.CTSFTPD.status() do {:error, :down} -> IO.puts("down"); _ -> IO.puts("ok") end',
|
|
127
|
+
]);
|
|
128
|
+
return stdout.trim() === 'ok';
|
|
129
|
+
}, errors),
|
|
130
|
+
]);
|
|
131
|
+
const [api, curri, rpc, dbConnected, dbDirect, curriProxy, adminProxy, sftp] = checks;
|
|
132
|
+
const coreAllPass = api && curri && rpc && dbConnected && dbDirect;
|
|
133
|
+
const allPass = coreAllPass && curriProxy && adminProxy && sftp;
|
|
134
|
+
let overall = 'down';
|
|
135
|
+
if (allPass)
|
|
136
|
+
overall = 'healthy';
|
|
137
|
+
else if (api || curri || rpc || dbDirect)
|
|
138
|
+
overall = 'degraded';
|
|
139
|
+
return { api, curri, rpc, dbConnected, dbDirect, curriProxy, adminProxy, sftp, overall, errors };
|
|
140
|
+
}
|
|
141
|
+
async exec(service, command) {
|
|
142
|
+
const pod = await this.findPodByLabel(service);
|
|
143
|
+
if (!pod?.metadata?.name)
|
|
144
|
+
throw new Error(`No pod found for service: ${service}`);
|
|
145
|
+
return this.execPod(pod.metadata.name, command);
|
|
146
|
+
}
|
|
147
|
+
async getNodes() {
|
|
148
|
+
const res = await coreApi().listNode();
|
|
149
|
+
return res.items.map(node => ({
|
|
150
|
+
name: node.metadata?.name ?? '',
|
|
151
|
+
status: this.nodeReady(node) ? 'Ready' : 'NotReady',
|
|
152
|
+
roles: this.nodeRoles(node),
|
|
153
|
+
version: node.status?.nodeInfo?.kubeletVersion ?? '',
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
async scaleService(name, replicas) {
|
|
157
|
+
try {
|
|
158
|
+
await appsApi().patchNamespacedDeploymentScale({ name, namespace: this.namespace, body: { spec: { replicas } } }, k8s.setHeaderOptions('Content-Type', k8s.PatchStrategy.StrategicMergePatch));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err.statusCode === 404) {
|
|
162
|
+
await appsApi().patchNamespacedStatefulSetScale({ name, namespace: this.namespace, body: { spec: { replicas } } }, k8s.setHeaderOptions('Content-Type', k8s.PatchStrategy.StrategicMergePatch));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async getHelmReleases() {
|
|
170
|
+
try {
|
|
171
|
+
const { stdout } = await execa('helm', ['list', '-n', this.namespace, '-o', 'json']);
|
|
172
|
+
const releases = JSON.parse(stdout || '[]');
|
|
173
|
+
return releases.map((r) => ({
|
|
174
|
+
name: r.name ?? '',
|
|
175
|
+
namespace: r.namespace ?? '',
|
|
176
|
+
revision: r.revision ?? '',
|
|
177
|
+
status: r.status ?? '',
|
|
178
|
+
chart: r.chart ?? '',
|
|
179
|
+
appVersion: r.app_version ?? '',
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
debug(`Failed to list helm releases: ${err.message}`);
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async getCnpgClusterStatus() {
|
|
188
|
+
const result = await customObjectsApi().getNamespacedCustomObject({
|
|
189
|
+
group: 'postgresql.cnpg.io',
|
|
190
|
+
version: 'v1',
|
|
191
|
+
namespace: this.namespace,
|
|
192
|
+
plural: 'clusters',
|
|
193
|
+
name: 'postgresql',
|
|
194
|
+
});
|
|
195
|
+
const obj = result;
|
|
196
|
+
const status = obj.status ?? {};
|
|
197
|
+
return {
|
|
198
|
+
name: obj.metadata?.name ?? 'postgresql',
|
|
199
|
+
phase: status.phase ?? 'Unknown',
|
|
200
|
+
instances: obj.spec?.instances ?? 0,
|
|
201
|
+
readyInstances: status.readyInstances ?? 0,
|
|
202
|
+
primaryPod: status.writeService ?? '',
|
|
203
|
+
currentPrimary: status.currentPrimary ?? '',
|
|
204
|
+
latestGeneratedNode: status.latestGeneratedNode ?? 0,
|
|
205
|
+
lastBackup: status.lastSuccessfulBackup ?? undefined,
|
|
206
|
+
walArchiving: status.walArchiving?.status ?? undefined,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
async getPVCs() {
|
|
210
|
+
const res = await coreApi().listNamespacedPersistentVolumeClaim({ namespace: this.namespace });
|
|
211
|
+
return res.items.map(pvc => ({
|
|
212
|
+
name: pvc.metadata?.name ?? '',
|
|
213
|
+
status: pvc.status?.phase ?? 'Unknown',
|
|
214
|
+
size: pvc.spec?.resources?.requests?.['storage'] ?? '',
|
|
215
|
+
storageClass: pvc.spec?.storageClassName ?? '',
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
// --- Private helpers ---
|
|
219
|
+
async healthCheck(label, fn, errors) {
|
|
220
|
+
try {
|
|
221
|
+
return await withTimeout(fn(), TIMEOUT, label);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
errors[label] = err.message || `${label} check failed`;
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async findPodByLabel(service) {
|
|
229
|
+
// Try Helm convention first, then simple app label
|
|
230
|
+
for (const labelSelector of [
|
|
231
|
+
`app.kubernetes.io/name=${service}`,
|
|
232
|
+
`app=${service}`,
|
|
233
|
+
]) {
|
|
234
|
+
const res = await coreApi().listNamespacedPod({
|
|
235
|
+
namespace: this.namespace,
|
|
236
|
+
labelSelector,
|
|
237
|
+
});
|
|
238
|
+
const running = res.items.find(p => p.status?.phase === 'Running');
|
|
239
|
+
if (running)
|
|
240
|
+
return running;
|
|
241
|
+
if (res.items.length > 0)
|
|
242
|
+
return res.items[0];
|
|
243
|
+
}
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
async execPod(podName, command) {
|
|
247
|
+
return new Promise((resolve, reject) => {
|
|
248
|
+
let stdout = '';
|
|
249
|
+
let stderr = '';
|
|
250
|
+
const outStream = new stream.PassThrough();
|
|
251
|
+
const errStream = new stream.PassThrough();
|
|
252
|
+
outStream.on('data', (chunk) => { stdout += chunk.toString(); });
|
|
253
|
+
errStream.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
254
|
+
const exec = execClient();
|
|
255
|
+
exec.exec(this.namespace, podName, '', // first container
|
|
256
|
+
command, outStream, errStream, null, false, (status) => {
|
|
257
|
+
const exitCode = status.status === 'Success' ? 0 : 1;
|
|
258
|
+
resolve({ stdout, exitCode });
|
|
259
|
+
}).catch(reject);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
podReadiness(pod) {
|
|
263
|
+
const statuses = pod.status?.containerStatuses ?? [];
|
|
264
|
+
if (statuses.length === 0)
|
|
265
|
+
return '0/0';
|
|
266
|
+
const ready = statuses.filter(c => c.ready).length;
|
|
267
|
+
return `${ready}/${statuses.length}`;
|
|
268
|
+
}
|
|
269
|
+
podAge(pod) {
|
|
270
|
+
const created = pod.metadata?.creationTimestamp;
|
|
271
|
+
if (!created)
|
|
272
|
+
return '';
|
|
273
|
+
const now = Date.now();
|
|
274
|
+
const then = new Date(created).getTime();
|
|
275
|
+
const diffMs = now - then;
|
|
276
|
+
const days = Math.floor(diffMs / 86400000);
|
|
277
|
+
if (days > 0)
|
|
278
|
+
return `${days}d`;
|
|
279
|
+
const hours = Math.floor(diffMs / 3600000);
|
|
280
|
+
if (hours > 0)
|
|
281
|
+
return `${hours}h`;
|
|
282
|
+
const minutes = Math.floor(diffMs / 60000);
|
|
283
|
+
return `${minutes}m`;
|
|
284
|
+
}
|
|
285
|
+
nodeReady(node) {
|
|
286
|
+
const conditions = node.status?.conditions ?? [];
|
|
287
|
+
const readyCond = conditions.find(c => c.type === 'Ready');
|
|
288
|
+
return readyCond?.status === 'True';
|
|
289
|
+
}
|
|
290
|
+
nodeRoles(node) {
|
|
291
|
+
const labels = node.metadata?.labels ?? {};
|
|
292
|
+
const roles = [];
|
|
293
|
+
for (const [key, value] of Object.entries(labels)) {
|
|
294
|
+
if (key.startsWith('node-role.kubernetes.io/')) {
|
|
295
|
+
roles.push(key.replace('node-role.kubernetes.io/', '') || value);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return roles.join(',') || 'worker';
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=k8s-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-backend.js","sourceRoot":"","sources":["../../src/lib/k8s-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KubeConfig loader and API client factory using @kubernetes/client-node.
|
|
3
|
+
* Centralized so tests can mock individual exports.
|
|
4
|
+
*/
|
|
5
|
+
import * as k8s from '@kubernetes/client-node';
|
|
6
|
+
export declare function loadKubeConfig(): k8s.KubeConfig;
|
|
7
|
+
export declare function resetKubeConfigCache(): void;
|
|
8
|
+
export declare function coreApi(): k8s.CoreV1Api;
|
|
9
|
+
export declare function appsApi(): k8s.AppsV1Api;
|
|
10
|
+
export declare function customObjectsApi(): k8s.CustomObjectsApi;
|
|
11
|
+
export declare function execClient(): k8s.Exec;
|
|
12
|
+
export declare function logClient(): k8s.Log;
|
|
13
|
+
export declare function isKubeConfigAvailable(): boolean;
|
|
14
|
+
//# sourceMappingURL=k8s-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-client.d.ts","sourceRoot":"","sources":["../../src/lib/k8s-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAI/C,wBAAgB,cAAc,IAAI,GAAG,CAAC,UAAU,CAM/C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,OAAO,IAAI,GAAG,CAAC,SAAS,CAEvC;AAED,wBAAgB,OAAO,IAAI,GAAG,CAAC,SAAS,CAEvC;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,gBAAgB,CAEvD;AAED,wBAAgB,UAAU,IAAI,GAAG,CAAC,IAAI,CAErC;AAED,wBAAgB,SAAS,IAAI,GAAG,CAAC,GAAG,CAEnC;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAO/C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KubeConfig loader and API client factory using @kubernetes/client-node.
|
|
3
|
+
* Centralized so tests can mock individual exports.
|
|
4
|
+
*/
|
|
5
|
+
import * as k8s from '@kubernetes/client-node';
|
|
6
|
+
let cachedKc = null;
|
|
7
|
+
export function loadKubeConfig() {
|
|
8
|
+
if (cachedKc)
|
|
9
|
+
return cachedKc;
|
|
10
|
+
const kc = new k8s.KubeConfig();
|
|
11
|
+
kc.loadFromDefault();
|
|
12
|
+
cachedKc = kc;
|
|
13
|
+
return kc;
|
|
14
|
+
}
|
|
15
|
+
export function resetKubeConfigCache() {
|
|
16
|
+
cachedKc = null;
|
|
17
|
+
}
|
|
18
|
+
export function coreApi() {
|
|
19
|
+
return loadKubeConfig().makeApiClient(k8s.CoreV1Api);
|
|
20
|
+
}
|
|
21
|
+
export function appsApi() {
|
|
22
|
+
return loadKubeConfig().makeApiClient(k8s.AppsV1Api);
|
|
23
|
+
}
|
|
24
|
+
export function customObjectsApi() {
|
|
25
|
+
return loadKubeConfig().makeApiClient(k8s.CustomObjectsApi);
|
|
26
|
+
}
|
|
27
|
+
export function execClient() {
|
|
28
|
+
return new k8s.Exec(loadKubeConfig());
|
|
29
|
+
}
|
|
30
|
+
export function logClient() {
|
|
31
|
+
return new k8s.Log(loadKubeConfig());
|
|
32
|
+
}
|
|
33
|
+
export function isKubeConfigAvailable() {
|
|
34
|
+
try {
|
|
35
|
+
loadKubeConfig();
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=k8s-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-client.js","sourceRoot":"","sources":["../../src/lib/k8s-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAE/C,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C,MAAM,UAAU,cAAc;IAC5B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;IAChC,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,QAAQ,GAAG,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/lib/prefs.d.ts
CHANGED
package/dist/lib/prefs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefs.d.ts","sourceRoot":"","sources":["../../src/lib/prefs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"prefs.d.ts","sourceRoot":"","sources":["../../src/lib/prefs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAClD;AAeD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,WAAW,GAAG,IAAI,CAU9C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAQlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,WAAW,CAEtC"}
|
package/dist/lib/prefs.js
CHANGED
|
@@ -4,7 +4,15 @@ import { homedir } from 'node:os';
|
|
|
4
4
|
import { debug } from './log.js';
|
|
5
5
|
const PREFS_DIR = join(homedir(), '.ct');
|
|
6
6
|
const PREFS_FILE = join(PREFS_DIR, 'preferences.json');
|
|
7
|
-
const DEFAULTS = {
|
|
7
|
+
const DEFAULTS = {
|
|
8
|
+
autoUpdate: false,
|
|
9
|
+
ipv6: false,
|
|
10
|
+
otel: false,
|
|
11
|
+
jtapi: false,
|
|
12
|
+
deploymentMode: 'docker-compose',
|
|
13
|
+
k8sNamespace: 'ct',
|
|
14
|
+
k8sEnvironment: 'ct-dev',
|
|
15
|
+
};
|
|
8
16
|
/**
|
|
9
17
|
* Load preferences from ~/.ct/preferences.json.
|
|
10
18
|
* Returns null if the file doesn't exist (first run).
|
package/dist/lib/prefs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefs.js","sourceRoot":"","sources":["../../src/lib/prefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"prefs.js","sourceRoot":"","sources":["../../src/lib/prefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAYjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEvD,MAAM,QAAQ,GAAgB;IAC5B,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,KAAK;IACZ,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,QAAQ;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1E,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,SAAS,EAAE,IAAI,QAAQ,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ShellContext } from '../context.js';
|
|
2
|
+
import type { CommandNode } from '../parser.js';
|
|
3
|
+
export declare function handleLogging(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
4
|
+
export declare function handleIpv6(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
5
|
+
export declare function handleOtel(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
6
|
+
export declare function handlePostgres(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
7
|
+
export declare function handleCertsReset(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
8
|
+
export declare function handleAuditRun(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
9
|
+
export declare function handleAuditReport(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
10
|
+
export declare function wireConfigHandlers(configNode: CommandNode): void;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/config.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrH;AAID,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxH;AAID,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtH;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxH;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAoChE"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell command handlers for the `config` command group.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { writeFileSafe } from '../../lib/fs.js';
|
|
6
|
+
import { getPaths } from '../../lib/paths.js';
|
|
7
|
+
import { enableIpv6, disableIpv6 } from '../../lib/ipv6.js';
|
|
8
|
+
import { enableOtel, disableOtel } from '../../lib/otel.js';
|
|
9
|
+
import { setPostgresVersion } from '../../lib/postgres.js';
|
|
10
|
+
import { resetCerts } from '../../lib/certs.js';
|
|
11
|
+
import { rpc } from '../../lib/rpc.js';
|
|
12
|
+
import { banner, statusLine, stepProgress } from '../formatter.js';
|
|
13
|
+
// ── config logging ──────────────────────────────────────────────────────────
|
|
14
|
+
export async function handleLogging(args, _opts, _ctx) {
|
|
15
|
+
const level = args[0];
|
|
16
|
+
if (!level) {
|
|
17
|
+
console.log('% Usage: config logging <debug|info|warning|error>');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const validLevels = ['debug', 'info', 'warning', 'error'];
|
|
21
|
+
if (!validLevels.includes(level)) {
|
|
22
|
+
console.log(statusLine(`Invalid logging level '${level}'`, 'fail', `valid: ${validLevels.join(', ')}`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const { composeFile } = getPaths();
|
|
27
|
+
if (!existsSync(composeFile)) {
|
|
28
|
+
console.log(statusLine('docker-compose.yml not found', 'fail'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const content = readFileSync(composeFile, 'utf-8');
|
|
32
|
+
const updated = content.replace(/LOGGING_LEVEL=\w+/, `LOGGING_LEVEL=${level}`);
|
|
33
|
+
await writeFileSafe(composeFile, updated);
|
|
34
|
+
console.log(statusLine(`Logging level set to ${level}`, 'ok', 'restart services to apply'));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
38
|
+
console.log(statusLine(`Failed to set logging level: ${msg}`, 'fail'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ── config ipv6 ─────────────────────────────────────────────────────────────
|
|
42
|
+
export async function handleIpv6(args, _opts, _ctx) {
|
|
43
|
+
const action = args[0];
|
|
44
|
+
if (!action || !['enable', 'disable'].includes(action)) {
|
|
45
|
+
console.log('% Usage: config ipv6 <enable|disable>');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
if (action === 'enable') {
|
|
50
|
+
await enableIpv6();
|
|
51
|
+
console.log(statusLine('IPv6 enabled', 'ok', 'restart services to apply'));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
await disableIpv6();
|
|
55
|
+
console.log(statusLine('IPv6 disabled', 'ok', 'restart services to apply'));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
60
|
+
console.log(statusLine(`IPv6 ${action} failed: ${msg}`, 'fail'));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ── config otel ─────────────────────────────────────────────────────────────
|
|
64
|
+
export async function handleOtel(args, _opts, _ctx) {
|
|
65
|
+
const action = args[0];
|
|
66
|
+
if (!action || !['enable', 'disable'].includes(action)) {
|
|
67
|
+
console.log('% Usage: config otel <enable|disable>');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
if (action === 'enable') {
|
|
72
|
+
await enableOtel();
|
|
73
|
+
console.log(statusLine('OpenTelemetry enabled', 'ok', 'restart services to apply'));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await disableOtel();
|
|
77
|
+
console.log(statusLine('OpenTelemetry disabled', 'ok', 'restart services to apply'));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
82
|
+
console.log(statusLine(`OTel ${action} failed: ${msg}`, 'fail'));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ── config postgres ─────────────────────────────────────────────────────────
|
|
86
|
+
export async function handlePostgres(args, _opts, _ctx) {
|
|
87
|
+
const version = args[0];
|
|
88
|
+
if (!version) {
|
|
89
|
+
const { postgresSupportedVersions } = getPaths();
|
|
90
|
+
console.log('% Usage: config postgres <version>');
|
|
91
|
+
console.log(` Supported versions: ${postgresSupportedVersions.join(', ')}`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await setPostgresVersion(version);
|
|
96
|
+
console.log(statusLine(`PostgreSQL version set to ${version}`, 'ok', 'applies on next update'));
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
console.log(statusLine(`Failed to set PostgreSQL version: ${msg}`, 'fail'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── config certs reset ──────────────────────────────────────────────────────
|
|
104
|
+
export async function handleCertsReset(_args, _opts, _ctx) {
|
|
105
|
+
try {
|
|
106
|
+
console.log(banner('Certificate Reset'));
|
|
107
|
+
console.log(stepProgress('Regenerating self-signed certificates', 'running'));
|
|
108
|
+
await resetCerts();
|
|
109
|
+
console.log(stepProgress('Regenerating self-signed certificates', 'done'));
|
|
110
|
+
console.log(statusLine('Certificates reset', 'ok', 'restart services to apply'));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
console.log(stepProgress('Certificate reset', 'fail', msg));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ── config audit run ────────────────────────────────────────────────────────
|
|
118
|
+
export async function handleAuditRun(_args, _opts, _ctx) {
|
|
119
|
+
try {
|
|
120
|
+
console.log(banner('Configuration Audit'));
|
|
121
|
+
console.log(stepProgress('Running audit', 'running'));
|
|
122
|
+
const output = await rpc('Cdrcisco.ConfigAudit.run() |> inspect(pretty: true) |> IO.puts()');
|
|
123
|
+
console.log(stepProgress('Running audit', 'done'));
|
|
124
|
+
if (output.trim()) {
|
|
125
|
+
console.log(output.trim());
|
|
126
|
+
}
|
|
127
|
+
console.log(statusLine('Audit complete', 'ok'));
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
131
|
+
console.log(stepProgress('Audit', 'fail', msg));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ── config audit diff ───────────────────────────────────────────────────────
|
|
135
|
+
export async function handleAuditReport(args, _opts, _ctx) {
|
|
136
|
+
const id = args[0];
|
|
137
|
+
try {
|
|
138
|
+
console.log(banner('Audit Report'));
|
|
139
|
+
console.log(stepProgress('Fetching drift report', 'running'));
|
|
140
|
+
const code = id
|
|
141
|
+
? `Cdrcisco.ConfigAudit.diff(${JSON.stringify(id)}) |> inspect(pretty: true) |> IO.puts()`
|
|
142
|
+
: 'Cdrcisco.ConfigAudit.last_report() |> inspect(pretty: true) |> IO.puts()';
|
|
143
|
+
const output = await rpc(code);
|
|
144
|
+
console.log(stepProgress('Fetching drift report', 'done'));
|
|
145
|
+
if (output.trim()) {
|
|
146
|
+
console.log(output.trim());
|
|
147
|
+
}
|
|
148
|
+
console.log(statusLine('Report retrieved', 'ok'));
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
152
|
+
console.log(stepProgress('Report', 'fail', msg));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Wire handlers into command tree ─────────────────────────────────────────
|
|
156
|
+
export function wireConfigHandlers(configNode) {
|
|
157
|
+
if (!configNode.children)
|
|
158
|
+
return;
|
|
159
|
+
for (const child of configNode.children) {
|
|
160
|
+
switch (child.name) {
|
|
161
|
+
case 'logging':
|
|
162
|
+
child.handler = handleLogging;
|
|
163
|
+
break;
|
|
164
|
+
case 'ipv6':
|
|
165
|
+
child.handler = handleIpv6;
|
|
166
|
+
break;
|
|
167
|
+
case 'otel':
|
|
168
|
+
child.handler = handleOtel;
|
|
169
|
+
break;
|
|
170
|
+
case 'postgres':
|
|
171
|
+
child.handler = handlePostgres;
|
|
172
|
+
break;
|
|
173
|
+
case 'certs':
|
|
174
|
+
child.handler = handleCertsReset;
|
|
175
|
+
break;
|
|
176
|
+
case 'audit':
|
|
177
|
+
if (child.children) {
|
|
178
|
+
for (const ac of child.children) {
|
|
179
|
+
switch (ac.name) {
|
|
180
|
+
case 'run':
|
|
181
|
+
ac.handler = handleAuditRun;
|
|
182
|
+
break;
|
|
183
|
+
case 'report':
|
|
184
|
+
ac.handler = handleAuditReport;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=config.js.map
|