@calltelemetry/cli 0.12.11 → 0.12.12
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 +25 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +42 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db.d.ts +24 -0
- package/dist/commands/db.d.ts.map +1 -1
- package/dist/commands/db.js +43 -4
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/go-parity.d.ts +32 -0
- package/dist/commands/go-parity.d.ts.map +1 -0
- package/dist/commands/go-parity.js +359 -0
- package/dist/commands/go-parity.js.map +1 -0
- package/dist/commands/jtapi.d.ts.map +1 -1
- package/dist/commands/jtapi.js +2 -0
- package/dist/commands/jtapi.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +2 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/network.d.ts.map +1 -1
- package/dist/commands/network.js +63 -50
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/offline.d.ts.map +1 -1
- package/dist/commands/offline.js +2 -0
- package/dist/commands/offline.js.map +1 -1
- package/dist/commands/seed.d.ts.map +1 -1
- package/dist/commands/seed.js +2 -0
- package/dist/commands/seed.js.map +1 -1
- package/dist/commands/ship-certs.d.ts +7 -0
- package/dist/commands/ship-certs.d.ts.map +1 -0
- package/dist/commands/ship-certs.js +105 -0
- package/dist/commands/ship-certs.js.map +1 -0
- package/dist/commands/ship-db.d.ts +8 -0
- package/dist/commands/ship-db.d.ts.map +1 -0
- package/dist/commands/ship-db.js +358 -0
- package/dist/commands/ship-db.js.map +1 -0
- package/dist/commands/ship-diag.d.ts +10 -0
- package/dist/commands/ship-diag.d.ts.map +1 -0
- package/dist/commands/ship-diag.js +73 -0
- package/dist/commands/ship-diag.js.map +1 -0
- package/dist/commands/ship-ipv6.d.ts +6 -0
- package/dist/commands/ship-ipv6.d.ts.map +1 -0
- package/dist/commands/ship-ipv6.js +59 -0
- package/dist/commands/ship-ipv6.js.map +1 -0
- package/dist/commands/ship-logging.d.ts +7 -0
- package/dist/commands/ship-logging.d.ts.map +1 -0
- package/dist/commands/ship-logging.js +71 -0
- package/dist/commands/ship-logging.js.map +1 -0
- package/dist/commands/ship-migrate.d.ts +6 -0
- package/dist/commands/ship-migrate.d.ts.map +1 -0
- package/dist/commands/ship-migrate.js +152 -0
- package/dist/commands/ship-migrate.js.map +1 -0
- package/dist/commands/ship-os-updates.d.ts +6 -0
- package/dist/commands/ship-os-updates.d.ts.map +1 -0
- package/dist/commands/ship-os-updates.js +116 -0
- package/dist/commands/ship-os-updates.js.map +1 -0
- package/dist/commands/ship-postgres.d.ts +6 -0
- package/dist/commands/ship-postgres.d.ts.map +1 -0
- package/dist/commands/ship-postgres.js +84 -0
- package/dist/commands/ship-postgres.js.map +1 -0
- package/dist/commands/ship-services.d.ts +7 -0
- package/dist/commands/ship-services.d.ts.map +1 -0
- package/dist/commands/ship-services.js +127 -0
- package/dist/commands/ship-services.js.map +1 -0
- package/dist/commands/ship-sql-monitor.d.ts +6 -0
- package/dist/commands/ship-sql-monitor.d.ts.map +1 -0
- package/dist/commands/ship-sql-monitor.js +89 -0
- package/dist/commands/ship-sql-monitor.js.map +1 -0
- package/dist/commands/ship-status.d.ts +6 -0
- package/dist/commands/ship-status.d.ts.map +1 -0
- package/dist/commands/ship-status.js +21 -0
- package/dist/commands/ship-status.js.map +1 -0
- package/dist/commands/ship-update.d.ts +31 -0
- package/dist/commands/ship-update.d.ts.map +1 -0
- package/dist/commands/ship-update.js +234 -0
- package/dist/commands/ship-update.js.map +1 -0
- package/dist/commands/ship-users.d.ts +7 -0
- package/dist/commands/ship-users.d.ts.map +1 -0
- package/dist/commands/ship-users.js +118 -0
- package/dist/commands/ship-users.js.map +1 -0
- package/dist/commands/update.d.ts +45 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +74 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +51 -0
- package/dist/commands/users.js.map +1 -1
- package/dist/index.js +3 -72
- package/dist/index.js.map +1 -1
- package/dist/lib/network-apply.d.ts +102 -0
- package/dist/lib/network-apply.d.ts.map +1 -0
- package/dist/lib/network-apply.js +472 -0
- package/dist/lib/network-apply.js.map +1 -0
- package/dist/lib/ops-port.d.ts +205 -0
- package/dist/lib/ops-port.d.ts.map +1 -0
- package/dist/lib/ops-port.js +906 -0
- package/dist/lib/ops-port.js.map +1 -0
- package/dist/lib/public-doc.d.ts +37 -0
- package/dist/lib/public-doc.d.ts.map +1 -0
- package/dist/lib/public-doc.js +27 -0
- package/dist/lib/public-doc.js.map +1 -0
- package/dist/lib/ship-identity.d.ts +9 -0
- package/dist/lib/ship-identity.d.ts.map +1 -0
- package/dist/lib/ship-identity.js +12 -0
- package/dist/lib/ship-identity.js.map +1 -0
- package/dist/lib/ship-logo.d.ts +11 -0
- package/dist/lib/ship-logo.d.ts.map +1 -0
- package/dist/lib/ship-logo.js +17 -0
- package/dist/lib/ship-logo.js.map +1 -0
- package/dist/lib/ship-status.d.ts +21 -0
- package/dist/lib/ship-status.d.ts.map +1 -0
- package/dist/lib/ship-status.js +82 -0
- package/dist/lib/ship-status.js.map +1 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/program.d.ts +22 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +124 -0
- package/dist/program.js.map +1 -0
- package/dist/shell/commands/diag.d.ts.map +1 -1
- package/dist/shell/commands/diag.js +47 -19
- package/dist/shell/commands/diag.js.map +1 -1
- package/dist/shell/commands/ops-mutates.d.ts +16 -0
- package/dist/shell/commands/ops-mutates.d.ts.map +1 -0
- package/dist/shell/commands/ops-mutates.js +62 -0
- package/dist/shell/commands/ops-mutates.js.map +1 -0
- package/dist/shell/commands/registry.d.ts.map +1 -1
- package/dist/shell/commands/registry.js +43 -0
- package/dist/shell/commands/registry.js.map +1 -1
- package/dist/shell/commands/show.d.ts +12 -0
- package/dist/shell/commands/show.d.ts.map +1 -1
- package/dist/shell/commands/show.js +190 -10
- package/dist/shell/commands/show.js.map +1 -1
- package/dist/shell/commands/telemetry.d.ts +11 -0
- package/dist/shell/commands/telemetry.d.ts.map +1 -0
- package/dist/shell/commands/telemetry.js +49 -0
- package/dist/shell/commands/telemetry.js.map +1 -0
- package/dist/shell/network-onboarding.d.ts +7 -4
- package/dist/shell/network-onboarding.d.ts.map +1 -1
- package/dist/shell/network-onboarding.js +22 -38
- package/dist/shell/network-onboarding.js.map +1 -1
- package/dist/ship-entry.d.ts +3 -0
- package/dist/ship-entry.d.ts.map +1 -0
- package/dist/ship-entry.js +121 -0
- package/dist/ship-entry.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { getPostgresVersion, getCurrentPostgresImage, setPostgresVersion, applyPgProfile, getPgProfileStatus, VALID_PROFILES, } from '../lib/postgres.js';
|
|
2
|
+
import { fetchPostgresPerformance, postgresPerformanceLines } from '../lib/postgres-performance.js';
|
|
3
|
+
import { getPaths } from '../lib/paths.js';
|
|
4
|
+
import * as out from '../utils/output.js';
|
|
5
|
+
export function registerShipPostgresCommand(program) {
|
|
6
|
+
const pg = program
|
|
7
|
+
.command('postgres [action] [version]')
|
|
8
|
+
.description('PostgreSQL version and connection profile management')
|
|
9
|
+
.action(async (action, version) => {
|
|
10
|
+
try {
|
|
11
|
+
const { postgresSupportedVersions } = getPaths();
|
|
12
|
+
if (!action || action === 'status') {
|
|
13
|
+
out.header('PostgreSQL Configuration');
|
|
14
|
+
console.log(`Configured version: ${getPostgresVersion()}`);
|
|
15
|
+
console.log(`Current image: ${getCurrentPostgresImage()}`);
|
|
16
|
+
console.log(`Supported versions: ${postgresSupportedVersions.join(', ')}`);
|
|
17
|
+
const { profile, settings } = getPgProfileStatus();
|
|
18
|
+
console.log(`Connection profile: ${profile}`);
|
|
19
|
+
for (const [key, value] of Object.entries(settings)) {
|
|
20
|
+
console.log(` ${key.padEnd(30)} ${value}`);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const performance = await fetchPostgresPerformance();
|
|
24
|
+
console.log();
|
|
25
|
+
console.log('Timing and WAL performance:');
|
|
26
|
+
for (const line of postgresPerformanceLines(performance)) {
|
|
27
|
+
console.log(` ${line.label.padEnd(24)} ${line.value}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(`Timing and WAL performance: unavailable (${err.message})`);
|
|
33
|
+
}
|
|
34
|
+
console.log();
|
|
35
|
+
console.log('Usage:');
|
|
36
|
+
console.log(' ct postgres set <version>');
|
|
37
|
+
console.log(` ct postgres profile <${VALID_PROFILES.join('|')}|show>`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (action === 'profile') {
|
|
41
|
+
if (!version || version === 'show') {
|
|
42
|
+
const { profile, settings } = getPgProfileStatus();
|
|
43
|
+
out.header(`PostgreSQL Profile: ${profile}`);
|
|
44
|
+
for (const [key, value] of Object.entries(settings)) {
|
|
45
|
+
console.log(` ${key.padEnd(30)} ${value}`);
|
|
46
|
+
}
|
|
47
|
+
console.log(`Available: ${VALID_PROFILES.join(', ')}`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!VALID_PROFILES.includes(version)) {
|
|
51
|
+
out.fail(`Invalid profile '${version}'`);
|
|
52
|
+
console.log(`Available: ${VALID_PROFILES.join(', ')}`);
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await applyPgProfile(version);
|
|
57
|
+
out.ok(`PostgreSQL profile set to: ${version}`);
|
|
58
|
+
out.info('Restart services to apply — ct restart or ct services restart db');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (action === 'set') {
|
|
62
|
+
if (!version) {
|
|
63
|
+
console.log('Usage: ct postgres set <version>');
|
|
64
|
+
console.log(`Supported: ${postgresSupportedVersions.join(', ')}`);
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
await setPostgresVersion(version);
|
|
69
|
+
out.ok(`PostgreSQL version set to ${version}`);
|
|
70
|
+
console.log("Note: Run 'ct update' to apply.");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
out.fail(`Unknown postgres command: ${action}`);
|
|
74
|
+
console.log('Usage: ct postgres status|set|profile');
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
out.fail(err instanceof Error ? err.message : String(err));
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
void pg;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ship-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-postgres.js","sourceRoot":"","sources":["../../src/commands/ship-postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship (no-Ink) service lifecycle: start | stop | restart | fix-service.
|
|
3
|
+
* Wave 1 customer-critical argv on the Bun ship binary.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function registerShipServicesCommands(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=ship-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-services.d.ts","sourceRoot":"","sources":["../../src/commands/ship-services.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwGnE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { compose, composeUp } from '../lib/compose.js';
|
|
4
|
+
import { getPaths } from '../lib/paths.js';
|
|
5
|
+
import * as out from '../utils/output.js';
|
|
6
|
+
const UNIT = 'docker-compose-app.service';
|
|
7
|
+
async function systemctl(args) {
|
|
8
|
+
await execa('systemctl', args, { stdio: 'inherit' });
|
|
9
|
+
}
|
|
10
|
+
async function trySystemctl(args) {
|
|
11
|
+
try {
|
|
12
|
+
await execa('systemctl', args, { stdio: 'pipe' });
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function registerShipServicesCommands(program) {
|
|
20
|
+
program
|
|
21
|
+
.command('start')
|
|
22
|
+
.description('Start Call Telemetry services (compose unit or compose up)')
|
|
23
|
+
.action(async () => {
|
|
24
|
+
if (await trySystemctl(['start', UNIT])) {
|
|
25
|
+
out.ok(`Started ${UNIT}`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
await composeUp(['-d', '--remove-orphans'], { pipe: false });
|
|
30
|
+
out.ok('Started stack via docker compose up -d');
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
out.fail(`start failed: ${e?.message ?? e}`);
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
program
|
|
38
|
+
.command('stop')
|
|
39
|
+
.description('Stop Call Telemetry services')
|
|
40
|
+
.action(async () => {
|
|
41
|
+
if (await trySystemctl(['stop', UNIT])) {
|
|
42
|
+
out.ok(`Stopped ${UNIT}`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
await compose(['stop'], { pipe: false });
|
|
47
|
+
out.ok('Stopped stack via docker compose stop');
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
out.fail(`stop failed: ${e?.message ?? e}`);
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
program
|
|
55
|
+
.command('restart')
|
|
56
|
+
.description('Restart Call Telemetry services')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
if (await trySystemctl(['restart', UNIT])) {
|
|
59
|
+
out.ok(`Restarted ${UNIT}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await compose(['restart'], { pipe: false });
|
|
64
|
+
out.ok('Restarted stack via docker compose restart');
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
// Fall back to up if restart unavailable
|
|
68
|
+
try {
|
|
69
|
+
await composeUp(['-d', '--force-recreate', '--remove-orphans'], { pipe: false });
|
|
70
|
+
out.ok('Recreated stack via docker compose up -d --force-recreate');
|
|
71
|
+
}
|
|
72
|
+
catch (e2) {
|
|
73
|
+
out.fail(`restart failed: ${e2?.message ?? e2}`);
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
program
|
|
79
|
+
.command('fix-service')
|
|
80
|
+
.description('Repair docker-compose-app.service unit (WorkingDirectory + daemon-reload)')
|
|
81
|
+
.action(async () => {
|
|
82
|
+
const { installDir, composeFile } = getPaths();
|
|
83
|
+
if (!existsSync(composeFile)) {
|
|
84
|
+
out.fail(`No docker-compose.yml under ${installDir}`);
|
|
85
|
+
process.exitCode = 1;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const unitPath = `/etc/systemd/system/${UNIT}`;
|
|
89
|
+
const unitBody = `[Unit]
|
|
90
|
+
Description=CallTelemetry Docker Compose Application
|
|
91
|
+
Requires=docker.service
|
|
92
|
+
After=docker.service network-online.target
|
|
93
|
+
Wants=network-online.target
|
|
94
|
+
|
|
95
|
+
[Service]
|
|
96
|
+
Type=oneshot
|
|
97
|
+
RemainAfterExit=yes
|
|
98
|
+
WorkingDirectory=${installDir}
|
|
99
|
+
ExecStart=/usr/bin/docker compose -f docker-compose.yml up -d --remove-orphans
|
|
100
|
+
ExecStop=/usr/bin/docker compose -f docker-compose.yml stop
|
|
101
|
+
TimeoutStartSec=0
|
|
102
|
+
TimeoutStopSec=120
|
|
103
|
+
|
|
104
|
+
[Install]
|
|
105
|
+
WantedBy=multi-user.target
|
|
106
|
+
`;
|
|
107
|
+
try {
|
|
108
|
+
// Prefer root write; fall back to sudo tee
|
|
109
|
+
try {
|
|
110
|
+
writeFileSync(unitPath, unitBody, { mode: 0o644 });
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
await execa('sudo', ['tee', unitPath], { input: unitBody, stdio: ['pipe', 'inherit', 'inherit'] });
|
|
114
|
+
}
|
|
115
|
+
await execa('sudo', ['systemctl', 'daemon-reload'], { stdio: 'inherit' }).catch(async () => {
|
|
116
|
+
await systemctl(['daemon-reload']);
|
|
117
|
+
});
|
|
118
|
+
out.ok(`Service file updated at ${unitPath}`);
|
|
119
|
+
out.info(`Restart with: sudo systemctl restart ${UNIT}`);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
out.fail(`fix-service failed: ${e?.message ?? e}`);
|
|
123
|
+
process.exitCode = 1;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=ship-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-services.js","sourceRoot":"","sources":["../../src/commands/ship-services.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAE1C,KAAK,UAAU,SAAS,CAAC,IAAc;IACrC,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAgB;IAC3D,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,GAAG,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC,EAAE,CAAC,uCAAuC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,EAAE,CAAC,4CAA4C,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,yCAAyC;YACzC,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjF,GAAG,CAAC,EAAE,CAAC,2DAA2D,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,EAAO,EAAE,CAAC;gBACjB,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,uBAAuB,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG;;;;;;;;;mBASJ,UAAU;;;;;;;;CAQ5B,CAAC;QACI,IAAI,CAAC;YACH,2CAA2C;YAC3C,IAAI,CAAC;gBACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;gBACzF,MAAM,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-sql-monitor.d.ts","sourceRoot":"","sources":["../../src/commands/ship-sql-monitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgEpE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readEnvKeys, updateEnvKeys } from '../lib/env.js';
|
|
2
|
+
import { composeUp, compose } from '../lib/compose.js';
|
|
3
|
+
import { attachSqlMonitorPassword } from './go-parity.js';
|
|
4
|
+
import * as out from '../utils/output.js';
|
|
5
|
+
const PROFILE = 'sql-monitor';
|
|
6
|
+
const SERVICE = 'pghero';
|
|
7
|
+
function parseProfiles(raw) {
|
|
8
|
+
return (raw ?? '')
|
|
9
|
+
.split(',')
|
|
10
|
+
.map((p) => p.trim())
|
|
11
|
+
.filter(Boolean);
|
|
12
|
+
}
|
|
13
|
+
function isEnabled(raw) {
|
|
14
|
+
return parseProfiles(raw).includes(PROFILE);
|
|
15
|
+
}
|
|
16
|
+
function addProfile(raw) {
|
|
17
|
+
const p = parseProfiles(raw);
|
|
18
|
+
if (!p.includes(PROFILE))
|
|
19
|
+
p.push(PROFILE);
|
|
20
|
+
return p.join(',');
|
|
21
|
+
}
|
|
22
|
+
function removeProfile(raw) {
|
|
23
|
+
return parseProfiles(raw).filter((x) => x !== PROFILE).join(',');
|
|
24
|
+
}
|
|
25
|
+
export function registerShipSqlMonitorCommand(program) {
|
|
26
|
+
const sql = program
|
|
27
|
+
.command('sql-monitor')
|
|
28
|
+
.description('PgHero SQL-health dashboard (opt-in compose profile)');
|
|
29
|
+
attachSqlMonitorPassword(sql);
|
|
30
|
+
sql
|
|
31
|
+
.command('status')
|
|
32
|
+
.description('Show whether sql-monitor profile is enabled')
|
|
33
|
+
.action(() => {
|
|
34
|
+
const env = readEnvKeys();
|
|
35
|
+
const on = isEnabled(env.COMPOSE_PROFILES);
|
|
36
|
+
console.log(`sql-monitor profile: ${on ? 'enabled' : 'disabled'}`);
|
|
37
|
+
console.log(`COMPOSE_PROFILES=${env.COMPOSE_PROFILES ?? '(unset)'}`);
|
|
38
|
+
});
|
|
39
|
+
sql
|
|
40
|
+
.command('enable')
|
|
41
|
+
.description('Enable sql-monitor compose profile and start pghero')
|
|
42
|
+
.action(async () => {
|
|
43
|
+
try {
|
|
44
|
+
const env = readEnvKeys();
|
|
45
|
+
await updateEnvKeys({ COMPOSE_PROFILES: addProfile(env.COMPOSE_PROFILES) });
|
|
46
|
+
out.ok('sql-monitor profile enabled in .env');
|
|
47
|
+
try {
|
|
48
|
+
await composeUp(['-d', SERVICE]);
|
|
49
|
+
out.ok(`${SERVICE} started`);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
out.info('Profile written. Recreate stack: ct restart');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
out.fail(err instanceof Error ? err.message : String(err));
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
sql
|
|
61
|
+
.command('disable')
|
|
62
|
+
.description('Disable sql-monitor compose profile and stop pghero')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
try {
|
|
65
|
+
const env = readEnvKeys();
|
|
66
|
+
const next = removeProfile(env.COMPOSE_PROFILES);
|
|
67
|
+
await updateEnvKeys({
|
|
68
|
+
COMPOSE_PROFILES: next.length > 0 ? next : undefined,
|
|
69
|
+
});
|
|
70
|
+
out.ok('sql-monitor profile removed from .env');
|
|
71
|
+
try {
|
|
72
|
+
await compose(['stop', SERVICE]);
|
|
73
|
+
await compose(['rm', '-f', SERVICE]);
|
|
74
|
+
out.ok(`${SERVICE} stopped`);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
out.info('Profile cleared. Stop remaining containers if needed.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
out.fail(err instanceof Error ? err.message : String(err));
|
|
82
|
+
process.exitCode = 1;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
sql.action(() => {
|
|
86
|
+
console.log('Usage: ct sql-monitor status|enable|disable|password|rotate-password');
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=ship-sql-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-sql-monitor.js","sourceRoot":"","sources":["../../src/commands/ship-sql-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-status.d.ts","sourceRoot":"","sources":["../../src/commands/ship-status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBhE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { collectShipStatus, formatShipStatus } from '../lib/ship-status.js';
|
|
2
|
+
import * as out from '../utils/output.js';
|
|
3
|
+
export function registerShipStatusCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('status')
|
|
6
|
+
.description('Show appliance status (compose, version, install dir)')
|
|
7
|
+
.action(async () => {
|
|
8
|
+
try {
|
|
9
|
+
const snapshot = await collectShipStatus();
|
|
10
|
+
console.log(formatShipStatus(snapshot));
|
|
11
|
+
if (snapshot.error && !snapshot.composeFileExists) {
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
out.fail(err?.message ?? String(err));
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ship-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-status.js","sourceRoot":"","sources":["../../src/commands/ship-status.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slim non-Ink `ct update` for the multi-arch ship binary.
|
|
3
|
+
*
|
|
4
|
+
* Uses lib/update-steps (preflightSteps + executeSteps + runStepsCli) — the same
|
|
5
|
+
* pipeline as the full Node CLI, without Ink TUI or Node runtime self-upgrade.
|
|
6
|
+
*/
|
|
7
|
+
import type { Command } from 'commander';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the operator's version argument / flags to a concrete release string.
|
|
10
|
+
* Fail-closed on unknown targets.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveShipUpdateTarget(versionArg: string | undefined, opts: {
|
|
13
|
+
latest?: boolean;
|
|
14
|
+
rc?: boolean;
|
|
15
|
+
stable?: boolean;
|
|
16
|
+
line?: string;
|
|
17
|
+
channel?: string;
|
|
18
|
+
}): Promise<string>;
|
|
19
|
+
/** Run the non-Ink update pipeline. Throws / sets exitCode on failure. */
|
|
20
|
+
export declare function runShipUpdate(versionArg: string | undefined, opts: {
|
|
21
|
+
latest?: boolean;
|
|
22
|
+
rc?: boolean;
|
|
23
|
+
stable?: boolean;
|
|
24
|
+
line?: string;
|
|
25
|
+
channel?: string;
|
|
26
|
+
forceUpgrade?: boolean;
|
|
27
|
+
cleanup?: boolean;
|
|
28
|
+
backupDb?: boolean;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
export declare function registerShipUpdateCommand(program: Command): void;
|
|
31
|
+
//# sourceMappingURL=ship-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-update.d.ts","sourceRoot":"","sources":["../../src/commands/ship-update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,CAkGjB;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAmFf;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2ChE"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { fetchLatestVersion, fetchLatestForLine, fetchLatestForChannel } from '../lib/bundle.js';
|
|
2
|
+
import { detectTargetType, getPin, setPin } from '../lib/prefs.js';
|
|
3
|
+
import { getCurrentVersion } from '../lib/update.js';
|
|
4
|
+
import { createDatabaseBackup } from '../lib/db-backup.js';
|
|
5
|
+
import { preflightSteps, executeSteps, runStepsCli } from '../lib/update-steps.js';
|
|
6
|
+
import { capturePostUpgradeHealth } from '../lib/post-upgrade-health.js';
|
|
7
|
+
import { getDockerVersion } from '../lib/system.js';
|
|
8
|
+
import { updateService } from '../lib/ops-port.js';
|
|
9
|
+
import { reportOpsResult } from './go-parity.js';
|
|
10
|
+
import * as out from '../utils/output.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the operator's version argument / flags to a concrete release string.
|
|
13
|
+
* Fail-closed on unknown targets.
|
|
14
|
+
*/
|
|
15
|
+
export async function resolveShipUpdateTarget(versionArg, opts) {
|
|
16
|
+
let version = versionArg;
|
|
17
|
+
let pinIntent = null;
|
|
18
|
+
if (opts.line) {
|
|
19
|
+
pinIntent = { type: 'line', value: opts.line };
|
|
20
|
+
version = opts.line;
|
|
21
|
+
}
|
|
22
|
+
else if (opts.channel) {
|
|
23
|
+
pinIntent = { type: 'channel', value: opts.channel };
|
|
24
|
+
version = opts.channel;
|
|
25
|
+
}
|
|
26
|
+
else if (versionArg) {
|
|
27
|
+
const detected = detectTargetType(versionArg);
|
|
28
|
+
if (detected === 'line')
|
|
29
|
+
pinIntent = { type: 'line', value: versionArg };
|
|
30
|
+
else if (detected === 'channel')
|
|
31
|
+
pinIntent = { type: 'channel', value: versionArg };
|
|
32
|
+
else if (detected === 'unknown') {
|
|
33
|
+
throw new Error(`Don't know how to interpret target '${versionArg}'. Accepted forms:\n` +
|
|
34
|
+
` ct update # follow saved pin or global stable\n` +
|
|
35
|
+
` ct update 0.8.6 # pin to the 0.8.6 line\n` +
|
|
36
|
+
` ct update 0.8.6.5 # install exact version\n` +
|
|
37
|
+
` ct update stable # follow the stable channel\n` +
|
|
38
|
+
` ct update --line 0.8.6 # explicit line flag\n` +
|
|
39
|
+
` ct update --channel stable # explicit channel flag`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (pinIntent) {
|
|
43
|
+
setPin(pinIntent);
|
|
44
|
+
console.log(`Pinned: ${pinIntent.type} = ${pinIntent.value}`);
|
|
45
|
+
console.log(`(saved to ~/.ct/preferences.json)`);
|
|
46
|
+
}
|
|
47
|
+
if (!version && !opts.latest && !opts.rc && !opts.stable) {
|
|
48
|
+
const saved = getPin();
|
|
49
|
+
if (saved) {
|
|
50
|
+
console.log(`Using saved pin: ${saved.type} = ${saved.value}`);
|
|
51
|
+
version = saved.value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const targetType = detectTargetType(version);
|
|
55
|
+
if (targetType === 'line') {
|
|
56
|
+
console.log(`Fetching latest stable for line ${version}...`);
|
|
57
|
+
const resolved = await fetchLatestForLine(version);
|
|
58
|
+
console.log(`Latest ${version} stable: ${resolved}`);
|
|
59
|
+
return resolved;
|
|
60
|
+
}
|
|
61
|
+
if (targetType === 'channel') {
|
|
62
|
+
console.log(`Fetching latest on channel '${version}'...`);
|
|
63
|
+
const resolved = await fetchLatestForChannel(version);
|
|
64
|
+
console.log(`Latest on ${version}: ${resolved}`);
|
|
65
|
+
return resolved;
|
|
66
|
+
}
|
|
67
|
+
if (targetType === 'keyword') {
|
|
68
|
+
if (version === 'latest') {
|
|
69
|
+
console.log('Fetching latest version (including pre-releases)...');
|
|
70
|
+
const resolved = await fetchLatestVersion('latest');
|
|
71
|
+
console.log(`Latest version: ${resolved}`);
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
74
|
+
if (version === 'rc') {
|
|
75
|
+
console.log('Fetching latest release candidate...');
|
|
76
|
+
const resolved = await fetchLatestVersion('rc');
|
|
77
|
+
console.log(`Latest release candidate: ${resolved}`);
|
|
78
|
+
return resolved;
|
|
79
|
+
}
|
|
80
|
+
if (version === 'dev') {
|
|
81
|
+
console.log("Fetching latest on channel 'dev'...");
|
|
82
|
+
const resolved = await fetchLatestForChannel('dev');
|
|
83
|
+
console.log(`Latest on dev: ${resolved}`);
|
|
84
|
+
return resolved;
|
|
85
|
+
}
|
|
86
|
+
console.log('Fetching latest stable version...');
|
|
87
|
+
const resolved = await fetchLatestVersion('stable');
|
|
88
|
+
console.log(`Latest stable version: ${resolved}`);
|
|
89
|
+
return resolved;
|
|
90
|
+
}
|
|
91
|
+
if (!version && opts.latest) {
|
|
92
|
+
console.log('Fetching latest version (including pre-releases)...');
|
|
93
|
+
const resolved = await fetchLatestVersion('latest');
|
|
94
|
+
console.log(`Latest version: ${resolved}`);
|
|
95
|
+
return resolved;
|
|
96
|
+
}
|
|
97
|
+
if (!version && opts.rc) {
|
|
98
|
+
console.log('Fetching latest release candidate...');
|
|
99
|
+
const resolved = await fetchLatestVersion('rc');
|
|
100
|
+
console.log(`Latest release candidate: ${resolved}`);
|
|
101
|
+
return resolved;
|
|
102
|
+
}
|
|
103
|
+
if (!version || opts.stable) {
|
|
104
|
+
console.log('Fetching latest stable version...');
|
|
105
|
+
const resolved = await fetchLatestVersion('stable');
|
|
106
|
+
console.log(`Latest stable version: ${resolved}`);
|
|
107
|
+
return resolved;
|
|
108
|
+
}
|
|
109
|
+
// exact version
|
|
110
|
+
return version;
|
|
111
|
+
}
|
|
112
|
+
/** Run the non-Ink update pipeline. Throws / sets exitCode on failure. */
|
|
113
|
+
export async function runShipUpdate(versionArg, opts) {
|
|
114
|
+
const version = await resolveShipUpdateTarget(versionArg, opts);
|
|
115
|
+
const currentVersion = getCurrentVersion();
|
|
116
|
+
console.log(`Current version: ${currentVersion}`);
|
|
117
|
+
console.log(`Target version: ${version}`);
|
|
118
|
+
console.log();
|
|
119
|
+
if (!opts.forceUpgrade) {
|
|
120
|
+
try {
|
|
121
|
+
await runStepsCli(preflightSteps(version));
|
|
122
|
+
console.log();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
out.fail('Pre-flight checks failed. Use --force-upgrade to proceed anyway.');
|
|
126
|
+
process.exitCode = 1;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const dockerVer = await getDockerVersion();
|
|
131
|
+
if (dockerVer === null) {
|
|
132
|
+
out.warn('Docker not found or not responding');
|
|
133
|
+
}
|
|
134
|
+
else if (dockerVer < 26) {
|
|
135
|
+
out.warn(`Docker version ${dockerVer} detected — Docker 26+ is recommended`);
|
|
136
|
+
// Ship path: fail-closed when force not set (no automatic dnf upgrade here).
|
|
137
|
+
if (!opts.forceUpgrade) {
|
|
138
|
+
out.fail('Docker < 26. Use --force-upgrade to continue, or upgrade Docker first.');
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
out.ok(`Docker version ${dockerVer} is supported`);
|
|
145
|
+
}
|
|
146
|
+
console.log();
|
|
147
|
+
console.log(`Upgrading from ${currentVersion} to ${version}`);
|
|
148
|
+
console.log('(ship binary — non-interactive step runner; no Ink TUI)');
|
|
149
|
+
let steps = executeSteps(version);
|
|
150
|
+
if (opts.forceUpgrade) {
|
|
151
|
+
steps = steps.filter((s) => s.label !== 'Check image availability');
|
|
152
|
+
}
|
|
153
|
+
if (opts.cleanup === false) {
|
|
154
|
+
steps = steps.filter((s) => s.label !== 'Cleanup unused resources');
|
|
155
|
+
}
|
|
156
|
+
if (opts.backupDb) {
|
|
157
|
+
steps = [
|
|
158
|
+
{
|
|
159
|
+
label: 'Database backup',
|
|
160
|
+
run: async (ctx) => {
|
|
161
|
+
ctx?.log('Creating database backup before update...');
|
|
162
|
+
const backup = await createDatabaseBackup();
|
|
163
|
+
return backup.filePath;
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
...steps,
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
console.log();
|
|
170
|
+
let stepError;
|
|
171
|
+
try {
|
|
172
|
+
await runStepsCli(steps);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
stepError = err;
|
|
176
|
+
}
|
|
177
|
+
console.log();
|
|
178
|
+
const anyFailed = await capturePostUpgradeHealth(`post-upgrade container health check (${version})`, { upgradeFailed: Boolean(stepError) });
|
|
179
|
+
if (stepError) {
|
|
180
|
+
out.fail(`Update failed: ${stepError instanceof Error ? stepError.message : String(stepError)}`);
|
|
181
|
+
process.exitCode = 1;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (anyFailed) {
|
|
185
|
+
out.warn('Update applied, but one or more containers are unhealthy — see captured logs above.');
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
out.successBox('Update complete!');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export function registerShipUpdateCommand(program) {
|
|
193
|
+
const update = program
|
|
194
|
+
.command('update [version]')
|
|
195
|
+
.description('Update to a version, line, channel, or latest stable (ship binary step runner)')
|
|
196
|
+
.option('--latest', 'Use latest build including pre-releases')
|
|
197
|
+
.option('--rc', 'Use latest release candidate')
|
|
198
|
+
.option('--stable', 'Use latest stable release (default)')
|
|
199
|
+
.option('--line <X.Y.Z>', 'Pin to a specific version line')
|
|
200
|
+
.option('--channel <name>', 'Pin to a customer-facing channel')
|
|
201
|
+
.option('--force-upgrade', 'Skip preflight / allow Docker < 26')
|
|
202
|
+
.option('--no-cleanup', 'Skip Docker cleanup after update')
|
|
203
|
+
.option('--backup-db', 'Create a database backup before update', false)
|
|
204
|
+
.option('--no-backup-db', 'Skip database backup before update')
|
|
205
|
+
.action(async (versionArg, opts) => {
|
|
206
|
+
try {
|
|
207
|
+
await runShipUpdate(versionArg, {
|
|
208
|
+
latest: opts.latest,
|
|
209
|
+
rc: opts.rc,
|
|
210
|
+
stable: opts.stable,
|
|
211
|
+
line: opts.line,
|
|
212
|
+
channel: opts.channel,
|
|
213
|
+
forceUpgrade: opts.forceUpgrade,
|
|
214
|
+
cleanup: opts.cleanup,
|
|
215
|
+
backupDb: opts.backupDb,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
out.fail(err?.message ?? String(err));
|
|
220
|
+
process.exitCode = 1;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// Dual-form: ct update service <svc> <tag> (also top-level update-service via go-parity)
|
|
224
|
+
update
|
|
225
|
+
.command('service <service> <tag>')
|
|
226
|
+
.description('Update ONE compose service image tag (atomic recreate)')
|
|
227
|
+
.option('-y, --yes', 'Confirm non-interactive apply')
|
|
228
|
+
.option('--dry-run', 'Show plan only')
|
|
229
|
+
.action(async (service, tag, opts) => {
|
|
230
|
+
const r = await updateService(service, tag, { yes: opts.yes, dryRun: opts.dryRun });
|
|
231
|
+
reportOpsResult(r);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=ship-update.js.map
|