ovtools 0.0.0-stage → 1.0.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/LICENSE +21 -0
- package/README.md +121 -2
- package/assets/common/bond-inspect.sh +368 -0
- package/assets/common/config.sh +263 -0
- package/assets/common/extract-data.sh +197 -0
- package/assets/common/harden-host.sh +37 -0
- package/assets/common/install-deps.sh +93 -0
- package/assets/common/node-enroll.sh +65 -0
- package/assets/common/node-setup.sh +150 -0
- package/assets/common/node-start.sh +90 -0
- package/assets/common/node-stop.sh +18 -0
- package/assets/common/node-upgrade.sh +45 -0
- package/assets/common/pre-run.sh +497 -0
- package/assets/common/promote-validator.sh +104 -0
- package/assets/deploy/10-prepare-host.sh +98 -0
- package/assets/deploy/20-install-toolchain.sh +93 -0
- package/assets/deploy/30-setup-node.sh +82 -0
- package/assets/deploy/40-start-node.sh +75 -0
- package/assets/deploy/50-verify.sh +259 -0
- package/assets/deploy/60-enroll.sh +304 -0
- package/assets/deploy/70-promote.sh +152 -0
- package/assets/deploy/lib.sh +398 -0
- package/assets/manage/10-bond-increase.sh +149 -0
- package/assets/manage/10-diagnose-node.sh +169 -0
- package/assets/manage/20-exit-validator.sh +259 -0
- package/assets/manage/25-recover-node.sh +291 -0
- package/assets/manage/30-status.sh +64 -0
- package/assets/manage/40-exit-withdraw.sh +133 -0
- package/assets/manage/bond_inc.sh +318 -0
- package/assets/manage/dashboard_monitor/app.js +1544 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/base.css +113 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/content.css +133 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/controls.css +229 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/data.css +374 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/icons.css +35 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/motion.css +57 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/shell.css +51 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/sidebar.css +242 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/components/topbar.css +138 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/fonts.css +30 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/synteq-ui-v2.css +25 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-dark.css +38 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/theme-light.css +36 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/css/tokens.css +61 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
- package/assets/manage/dashboard_monitor/assets/v2.2/js/synteq-ui-v2.js +869 -0
- package/assets/manage/dashboard_monitor/deploy-dashboard.sh +230 -0
- package/assets/manage/dashboard_monitor/favicon.svg +13 -0
- package/assets/manage/dashboard_monitor/index.html +1197 -0
- package/assets/manage/dashboard_monitor/nginx-octra.conf +76 -0
- package/assets/manage/dashboard_monitor/octra-dashboard.service +29 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.cron +12 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.service +16 -0
- package/assets/manage/dashboard_monitor/octra-node-prune.timer +12 -0
- package/assets/manage/dashboard_monitor/prune-node-junk.sh +329 -0
- package/assets/manage/dashboard_monitor/server.py +1887 -0
- package/assets/manage/dashboard_monitor/ssl-certbot.sh +90 -0
- package/assets/manage/dashboard_monitor/styles.css +327 -0
- package/assets/manage/lib.sh +347 -0
- package/assets/manifest.json +143 -0
- package/assets/migrate/00-backup-identity.sh +67 -0
- package/assets/migrate/01-prepare-target.sh +145 -0
- package/assets/migrate/02-authorize-pull.sh +43 -0
- package/assets/migrate/03-pull-state.sh +102 -0
- package/assets/migrate/04-stop-source.sh +85 -0
- package/assets/migrate/05-finalize-target.sh +140 -0
- package/assets/migrate/06-start-target.sh +57 -0
- package/assets/migrate/07-verify.sh +237 -0
- package/assets/migrate/08-rollback.sh +54 -0
- package/assets/migrate/lib.sh +149 -0
- package/assets/upgrade/10-preflight.sh +120 -0
- package/assets/upgrade/20-upgrade.sh +142 -0
- package/assets/upgrade/30-manual-upgrade.sh +129 -0
- package/assets/upgrade/40-storage-prune.sh +65 -0
- package/assets/upgrade/50-status.sh +58 -0
- package/assets/upgrade/lib.sh +232 -0
- package/bin/ovtools.js +32 -0
- package/dist/api/checks.d.ts +6 -0
- package/dist/api/checks.d.ts.map +1 -0
- package/dist/api/checks.js +173 -0
- package/dist/api/checks.js.map +1 -0
- package/dist/api/hostkeys.d.ts +10 -0
- package/dist/api/hostkeys.d.ts.map +1 -0
- package/dist/api/hostkeys.js +58 -0
- package/dist/api/hostkeys.js.map +1 -0
- package/dist/api/jobs.d.ts +33 -0
- package/dist/api/jobs.d.ts.map +1 -0
- package/dist/api/jobs.js +483 -0
- package/dist/api/jobs.js.map +1 -0
- package/dist/api/nodes.d.ts +16 -0
- package/dist/api/nodes.d.ts.map +1 -0
- package/dist/api/nodes.js +126 -0
- package/dist/api/nodes.js.map +1 -0
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +443 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +301 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +76 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +150 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/base.d.ts +52 -0
- package/dist/orchestrator/base.d.ts.map +1 -0
- package/dist/orchestrator/base.js +219 -0
- package/dist/orchestrator/base.js.map +1 -0
- package/dist/orchestrator/deploy.d.ts +33 -0
- package/dist/orchestrator/deploy.d.ts.map +1 -0
- package/dist/orchestrator/deploy.js +313 -0
- package/dist/orchestrator/deploy.js.map +1 -0
- package/dist/orchestrator/manage.d.ts +28 -0
- package/dist/orchestrator/manage.d.ts.map +1 -0
- package/dist/orchestrator/manage.js +267 -0
- package/dist/orchestrator/manage.js.map +1 -0
- package/dist/orchestrator/migrate.d.ts +31 -0
- package/dist/orchestrator/migrate.d.ts.map +1 -0
- package/dist/orchestrator/migrate.js +442 -0
- package/dist/orchestrator/migrate.js.map +1 -0
- package/dist/ssh/client.d.ts +39 -0
- package/dist/ssh/client.d.ts.map +1 -0
- package/dist/ssh/client.js +418 -0
- package/dist/ssh/client.js.map +1 -0
- package/dist/test/core.test.d.ts +2 -0
- package/dist/test/core.test.d.ts.map +1 -0
- package/dist/test/core.test.js +188 -0
- package/dist/test/core.test.js.map +1 -0
- package/dist/types.d.ts +267 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/assets.d.ts +28 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +583 -0
- package/dist/utils/assets.js.map +1 -0
- package/dist/utils/browser.d.ts +2 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +23 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/dashboard.d.ts +16 -0
- package/dist/utils/dashboard.d.ts.map +1 -0
- package/dist/utils/dashboard.js +177 -0
- package/dist/utils/dashboard.js.map +1 -0
- package/dist/utils/helpers.d.ts +29 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +204 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/scripts.d.ts +60 -0
- package/dist/utils/scripts.d.ts.map +1 -0
- package/dist/utils/scripts.js +174 -0
- package/dist/utils/scripts.js.map +1 -0
- package/dist/utils/state.d.ts +12 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +44 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/tar.d.ts +11 -0
- package/dist/utils/tar.d.ts.map +1 -0
- package/dist/utils/tar.js +93 -0
- package/dist/utils/tar.js.map +1 -0
- package/dist/utils/update.d.ts +9 -0
- package/dist/utils/update.d.ts.map +1 -0
- package/dist/utils/update.js +134 -0
- package/dist/utils/update.js.map +1 -0
- package/dist/utils/websocket.d.ts +10 -0
- package/dist/utils/websocket.d.ts.map +1 -0
- package/dist/utils/websocket.js +203 -0
- package/dist/utils/websocket.js.map +1 -0
- package/package.json +55 -4
- package/public/app.js +2712 -0
- package/public/assets/v2.2/css/base.css +113 -0
- package/public/assets/v2.2/css/components/content.css +133 -0
- package/public/assets/v2.2/css/components/controls.css +229 -0
- package/public/assets/v2.2/css/components/data.css +373 -0
- package/public/assets/v2.2/css/components/icons.css +35 -0
- package/public/assets/v2.2/css/components/motion.css +57 -0
- package/public/assets/v2.2/css/components/shell.css +51 -0
- package/public/assets/v2.2/css/components/sidebar.css +242 -0
- package/public/assets/v2.2/css/components/topbar.css +138 -0
- package/public/assets/v2.2/css/fonts.css +30 -0
- package/public/assets/v2.2/css/synteq-ui-v2.css +25 -0
- package/public/assets/v2.2/css/theme-dark.css +38 -0
- package/public/assets/v2.2/css/theme-light.css +36 -0
- package/public/assets/v2.2/css/tokens.css +61 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-Medium.ttf +0 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-Regular.ttf +0 -0
- package/public/assets/v2.2/fonts/GoogleSansCode-SemiBold.ttf +0 -0
- package/public/assets/v2.2/js/synteq-ui-v2.js +869 -0
- package/public/favicon.svg +7 -0
- package/public/index.html +1080 -0
- package/public/styles.css +552 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BaseOrchestrator } from './base';
|
|
2
|
+
import { Logger } from '../utils/helpers';
|
|
3
|
+
import type { MigrateConfig } from '../types';
|
|
4
|
+
export declare class MigrateOrchestrator extends BaseOrchestrator {
|
|
5
|
+
private config;
|
|
6
|
+
private statePair;
|
|
7
|
+
private oldClient;
|
|
8
|
+
private newClient;
|
|
9
|
+
softStop: {
|
|
10
|
+
state: string;
|
|
11
|
+
detail: string;
|
|
12
|
+
} | null;
|
|
13
|
+
activationPending: boolean;
|
|
14
|
+
constructor(config: MigrateConfig, logger: Logger);
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
private baseSSH;
|
|
17
|
+
private ensure;
|
|
18
|
+
private showStatus;
|
|
19
|
+
private runDirect;
|
|
20
|
+
private runDetached;
|
|
21
|
+
private followDetached;
|
|
22
|
+
private stepBackup;
|
|
23
|
+
private stepPrep;
|
|
24
|
+
private stepPull;
|
|
25
|
+
private stepSwitch;
|
|
26
|
+
private stepFinalize;
|
|
27
|
+
private stepVerify;
|
|
28
|
+
private stepRollback;
|
|
29
|
+
}
|
|
30
|
+
export declare function createMigrateOrchestrator(config: MigrateConfig, logger: Logger): MigrateOrchestrator;
|
|
31
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/orchestrator/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,UAAU,CAAC;AAKzD,qBAAa,mBAAoB,SAAQ,gBAAgB;IACvD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,SAAS,CAA0B;IAC3C,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAC1D,iBAAiB,UAAS;gBAEd,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM;IAO3C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0E1B,OAAO,CAAC,OAAO;YAID,MAAM;YAUN,UAAU;YAYV,SAAS;YAuBT,WAAW;YAaX,cAAc;YA+Cd,UAAU;YAuBV,QAAQ;YAwFR,QAAQ;YAoBR,UAAU;YAuBV,YAAY;YAaZ,UAAU;YAkDV,YAAY;CAa3B;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAEpG"}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MigrateOrchestrator = void 0;
|
|
37
|
+
exports.createMigrateOrchestrator = createMigrateOrchestrator;
|
|
38
|
+
const base_1 = require("./base");
|
|
39
|
+
const client_1 = require("../ssh/client");
|
|
40
|
+
const state_1 = require("../utils/state");
|
|
41
|
+
const constants_1 = require("../constants");
|
|
42
|
+
const helpers_1 = require("../utils/helpers");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
class MigrateOrchestrator extends base_1.BaseOrchestrator {
|
|
45
|
+
config;
|
|
46
|
+
statePair;
|
|
47
|
+
oldClient = null;
|
|
48
|
+
newClient = null;
|
|
49
|
+
softStop = null;
|
|
50
|
+
activationPending = false;
|
|
51
|
+
constructor(config, logger) {
|
|
52
|
+
super(new state_1.StateManager(constants_1.STATE_FILES.migrate), logger);
|
|
53
|
+
this.config = config;
|
|
54
|
+
this.statePair = `${config.oldIp}->${config.newIp}`;
|
|
55
|
+
this.program = 'migrate';
|
|
56
|
+
}
|
|
57
|
+
async run() {
|
|
58
|
+
const phase = this.config.phase || 'all';
|
|
59
|
+
try {
|
|
60
|
+
this.oldClient = await this.connectSSH(this.baseSSH(this.config.oldIp, this.config.oldAuth), `source ${this.config.oldIp}`);
|
|
61
|
+
if (this.config.oldIp === this.config.newIp)
|
|
62
|
+
throw new Error('source and target are the same host');
|
|
63
|
+
if (phase !== 'backup') {
|
|
64
|
+
this.newClient = await this.connectSSH(this.baseSSH(this.config.newIp, this.config.newAuth), `target ${this.config.newIp}`);
|
|
65
|
+
}
|
|
66
|
+
if (this.config.reset) {
|
|
67
|
+
await this.stateManager.reset(this.statePair);
|
|
68
|
+
this.log('resume state cleared', 'info');
|
|
69
|
+
}
|
|
70
|
+
if (phase === 'status') {
|
|
71
|
+
await this.showStatus();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
await this.preflight(this.oldClient);
|
|
75
|
+
await this.pushScripts(this.oldClient, ['migrate']);
|
|
76
|
+
await this.ensureHostTools(this.oldClient, undefined, 'source host tools');
|
|
77
|
+
if (this.newClient) {
|
|
78
|
+
await this.preflight(this.newClient);
|
|
79
|
+
await this.pushScripts(this.newClient, ['migrate']);
|
|
80
|
+
await this.ensureHostTools(this.newClient, undefined, 'target host tools');
|
|
81
|
+
}
|
|
82
|
+
if (phase === 'backup') {
|
|
83
|
+
await this.stepBackup();
|
|
84
|
+
this.log('identity backup finished - archive is in the local backups folder', 'ok');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!this.newClient)
|
|
88
|
+
throw new Error('a target host is required for this phase');
|
|
89
|
+
// Mandatory hardening on EVERY phase that touches the target.
|
|
90
|
+
await this.harden(this.newClient);
|
|
91
|
+
if (phase === 'rollback') {
|
|
92
|
+
await this.stepRollback();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (phase === 'all' || phase === 'auto') {
|
|
96
|
+
await this.ensure('backup', () => this.stepBackup());
|
|
97
|
+
await this.ensure('prep', () => this.stepPrep());
|
|
98
|
+
await this.ensure('pull', () => this.stepPull());
|
|
99
|
+
await this.ensure('switch', () => this.stepSwitch());
|
|
100
|
+
await this.ensure('finalize', () => this.stepFinalize());
|
|
101
|
+
await this.ensure('verify', () => this.stepVerify());
|
|
102
|
+
this.log('=== MIGRATION COMPLETE: the validator now runs on ' + this.config.newIp + ' ===', 'ok');
|
|
103
|
+
this.log(`keep ${this.config.oldIp} powered off / fenced: its pm2 boot unit is disabled`, 'warn');
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
switch (phase) {
|
|
107
|
+
case 'prep':
|
|
108
|
+
await this.stepPrep();
|
|
109
|
+
break;
|
|
110
|
+
case 'pull':
|
|
111
|
+
await this.stepPull();
|
|
112
|
+
break;
|
|
113
|
+
case 'switch':
|
|
114
|
+
await this.stepSwitch();
|
|
115
|
+
break;
|
|
116
|
+
case 'finalize':
|
|
117
|
+
await this.stepFinalize();
|
|
118
|
+
break;
|
|
119
|
+
case 'verify':
|
|
120
|
+
await this.stepVerify();
|
|
121
|
+
break;
|
|
122
|
+
default: throw new Error(`unknown migrate phase: ${phase}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
128
|
+
this.log(`Migration failed: ${msg}`, 'error');
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
await this.disconnectSSH(this.oldClient);
|
|
133
|
+
await this.disconnectSSH(this.newClient);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
baseSSH(host, auth) {
|
|
137
|
+
return { host, port: 22, username: 'root', auth };
|
|
138
|
+
}
|
|
139
|
+
async ensure(name, fn) {
|
|
140
|
+
if (this.aborted)
|
|
141
|
+
throw new Error('operation aborted');
|
|
142
|
+
if (await this.stateManager.isStepDone(this.statePair, name)) {
|
|
143
|
+
this.log(`${name} already completed - skipping`, 'info');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
await fn();
|
|
147
|
+
await this.stateManager.markStepDone(this.statePair, name);
|
|
148
|
+
}
|
|
149
|
+
async showStatus() {
|
|
150
|
+
const cmd = "cat /root/migration/status 2>/dev/null || echo 'no migration status'; " +
|
|
151
|
+
"su - octra -c 'cd /opt/octra/libv_litecore && sh controls/stat.sh' 2>/dev/null | grep -E '^(node|role|address|process|uptime|rpc|epoch|head_epoch|voting|validator_active|validator_enrollment|round_peers|p2p_connected) =' || echo 'node not installed here'";
|
|
152
|
+
for (const [label, client] of [['OLD', this.oldClient], ['NEW', this.newClient]]) {
|
|
153
|
+
if (!client)
|
|
154
|
+
continue;
|
|
155
|
+
this.log(`--- ${label} node status (${client.host}) ---`, 'step', client.host);
|
|
156
|
+
const result = await client.exec(cmd, { timeout: 120000 });
|
|
157
|
+
for (const line of result.stdout.split('\n'))
|
|
158
|
+
if (line.trim())
|
|
159
|
+
this.log(` ${line}`, 'data', client.host);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async runDirect(client, command, label, timeoutSec, options = {}) {
|
|
163
|
+
const host = options.host || client.host;
|
|
164
|
+
this.log(`--> [${host}] ${label}`, 'step', host);
|
|
165
|
+
const env = Object.entries(options.env || {}).map(([k, v]) => `${k}=${(0, client_1.shellQuote)(v)}`).join(' ');
|
|
166
|
+
const full = env ? `${env} ${command}` : command;
|
|
167
|
+
const result = await client.exec(full, {
|
|
168
|
+
timeout: timeoutSec * 1000,
|
|
169
|
+
onLine: line => {
|
|
170
|
+
if (line.trim())
|
|
171
|
+
this.log(` ${line}`, 'remote', host);
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
if (result.exitCode !== 0 && !options.allowFailure) {
|
|
175
|
+
throw new Error(`${label} failed (exit ${result.exitCode})${result.stderr ? `: ${result.stderr.slice(0, 800)}` : ''}`);
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
async runDetached(client, unit, command, label, timeoutSec, env = {}) {
|
|
180
|
+
const outFile = `/root/migration/${unit}.console.log`;
|
|
181
|
+
this.log(`--> [${client.host}] ${label} (detached unit ${unit})`, 'step', client.host);
|
|
182
|
+
return this.followDetached(client, unit, command, label, timeoutSec, env, outFile);
|
|
183
|
+
}
|
|
184
|
+
async followDetached(client, unit, command, label, timeoutSec, env, outFile) {
|
|
185
|
+
const envStr = Object.entries(env).map(([k, v]) => `${k}=${(0, client_1.shellQuote)(v)}`).join(' ');
|
|
186
|
+
const inner = `${envStr ? envStr + ' ' : ''}${command} > ${(0, client_1.shellQuote)(outFile)} 2>&1`;
|
|
187
|
+
await client.exec(`systemctl stop ${(0, client_1.shellQuote)(unit)} 2>/dev/null || true; systemctl reset-failed ${(0, client_1.shellQuote)(unit)} 2>/dev/null || true; rm -f /root/migration/status ${(0, client_1.shellQuote)(outFile)} 2>/dev/null || true`, { timeout: 120000 });
|
|
188
|
+
const launch = `systemd-run --unit=${unit} --collect --no-block --working-directory=/root/migrate bash -c ${(0, client_1.shellQuote)(inner)}`;
|
|
189
|
+
const launched = await client.exec(launch, { timeout: 120000 });
|
|
190
|
+
if (launched.exitCode !== 0)
|
|
191
|
+
throw new Error(`could not launch ${unit}: ${launched.stderr || launched.stdout}`);
|
|
192
|
+
this.log(` ${label} runs as unit ${unit} - following /root/migration/status`, 'info', client.host);
|
|
193
|
+
const started = Date.now();
|
|
194
|
+
let lastSize = 0;
|
|
195
|
+
while (Date.now() - started < timeoutSec * 1000) {
|
|
196
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
197
|
+
const probe = await client.exec(`echo "STATUS:$(head -1 /root/migration/status 2>/dev/null || echo RUNNING)"; echo "ACTIVE:$(systemctl is-active ${(0, client_1.shellQuote)(unit)} 2>/dev/null || true)"; echo "SIZE:$(stat -c %s ${(0, client_1.shellQuote)(outFile)} 2>/dev/null || echo 0)"`, { timeout: 60000 });
|
|
198
|
+
const get = (prefix) => probe.stdout.split('\n').find(l => l.startsWith(prefix))?.slice(prefix.length).trim() || '';
|
|
199
|
+
const statusLine = get('STATUS:');
|
|
200
|
+
const active = get('ACTIVE:');
|
|
201
|
+
const size = Number(get('SIZE:') || 0);
|
|
202
|
+
if (size > lastSize) {
|
|
203
|
+
const tail = await client.exec(`tail -c +${lastSize + 1} ${(0, client_1.shellQuote)(outFile)} 2>/dev/null`, { timeout: 60000 });
|
|
204
|
+
for (const line of tail.stdout.split('\n'))
|
|
205
|
+
if (line.trim())
|
|
206
|
+
this.log(` ${line}`, 'remote', client.host);
|
|
207
|
+
lastSize = size;
|
|
208
|
+
}
|
|
209
|
+
const parts = statusLine.split(/\s+/);
|
|
210
|
+
const state = (parts.shift() || 'RUNNING').toUpperCase();
|
|
211
|
+
const detail = parts.join(' ');
|
|
212
|
+
if (state === 'DONE')
|
|
213
|
+
return { state, detail, soft: false, exitCode: 0 };
|
|
214
|
+
if (state === 'FAILED')
|
|
215
|
+
return { state, detail, soft: false, exitCode: 1 };
|
|
216
|
+
if (state.startsWith('WAITING-'))
|
|
217
|
+
return { state, detail, soft: true, exitCode: 2 };
|
|
218
|
+
if (!/^(active|activating|reloading|deactivating)$/.test(active) && Date.now() - started > 15000) {
|
|
219
|
+
return { state: 'FAILED', detail: `unit ${unit} died without a verdict (see ${outFile})`, soft: false, exitCode: 1 };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return { state: 'TIMEOUT', detail: `${label} did not finish in ${timeoutSec}s`, soft: false, exitCode: 1 };
|
|
223
|
+
}
|
|
224
|
+
async stepBackup() {
|
|
225
|
+
this.startPhase('backup');
|
|
226
|
+
try {
|
|
227
|
+
await this.runDirect(this.oldClient, 'bash /root/migrate/00-backup-identity.sh', '00-backup-identity.sh (source identity snapshot)', 600);
|
|
228
|
+
const listing = await this.oldClient.exec("ls -t /root/migration/backups/*.tar.gz 2>/dev/null | head -1", { timeout: 60000 });
|
|
229
|
+
const remote = listing.stdout.split('\n').map(l => l.trim()).find(l => l.startsWith('/root/'));
|
|
230
|
+
if (!remote) {
|
|
231
|
+
this.log('no identity archive found on the source', 'warn', this.oldClient.host);
|
|
232
|
+
this.completePhase(true);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
await (0, helpers_1.ensureDir)(constants_1.BACKUP_DIR);
|
|
236
|
+
const local = path.join(constants_1.BACKUP_DIR, path.basename(remote));
|
|
237
|
+
this.log(`downloading ${remote} -> ${local}`, 'step', this.oldClient.host);
|
|
238
|
+
await this.oldClient.downloadFile(remote, local);
|
|
239
|
+
this.log(`identity archive copied to ${constants_1.BACKUP_DIR}`, 'ok');
|
|
240
|
+
this.completePhase(true);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
this.completePhase(false, err.message);
|
|
244
|
+
throw err;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async stepPrep() {
|
|
248
|
+
this.startPhase('prep');
|
|
249
|
+
try {
|
|
250
|
+
if (this.config.wipeTargetVolume) {
|
|
251
|
+
this.log('forced reformat requested: the data volume will be formatted even if it holds an Octra data set', 'warn');
|
|
252
|
+
await this.stateManager.reset(this.statePair);
|
|
253
|
+
}
|
|
254
|
+
let alreadyPulled = false;
|
|
255
|
+
for (const step of ['pull', 'switch', 'finalize', 'verify']) {
|
|
256
|
+
if (await this.stateManager.isStepDone(this.statePair, step))
|
|
257
|
+
alreadyPulled = true;
|
|
258
|
+
}
|
|
259
|
+
const prev = await this.getPrerunState(this.newClient, '/root/migration/prerun.env');
|
|
260
|
+
let prevMode = this.prepMode(prev, alreadyPulled, !this.config.keepTargetData);
|
|
261
|
+
let preRun = 'bash /root/pre-run.sh';
|
|
262
|
+
if (this.config.wipeTargetVolume) {
|
|
263
|
+
preRun = 'WIPE_VOLUME=1 bash /root/pre-run.sh';
|
|
264
|
+
}
|
|
265
|
+
else if (prevMode === 'wipe') {
|
|
266
|
+
if (await this.targetNodeRunning(this.newClient)) {
|
|
267
|
+
throw new Error(`the target data store still holds chain state and a node is running on ${this.config.newIp} - refusing to format it`);
|
|
268
|
+
}
|
|
269
|
+
this.log(`the target still holds a stale Octra data set (${prev.dev}, chain-state=yes) and nothing was pulled yet - reformatting it in this pass`, 'warn');
|
|
270
|
+
preRun = 'WIPE_VOLUME=1 bash /root/pre-run.sh';
|
|
271
|
+
}
|
|
272
|
+
else if (prevMode === 'force' && alreadyPulled) {
|
|
273
|
+
this.log(`keeping the data set on ${this.config.newIp}: this migration already pulled into it`, 'info');
|
|
274
|
+
}
|
|
275
|
+
await this.runDirect(this.newClient, preRun, 'pre-run.sh (swap + data store: auto format/mount)', 1800);
|
|
276
|
+
let pre = await this.getPrerunState(this.newClient, '/root/migration/prerun.env');
|
|
277
|
+
this.log(`target data store: ${pre.dev || 'no dedicated volume'} -> ${pre.mount} (action=${pre.action}, data-set=${pre.dataSet ? 'yes' : 'no'}, chain-state=${pre.chain ? 'yes' : 'no'})`, 'info');
|
|
278
|
+
let mode = this.prepMode(pre, alreadyPulled, !this.config.keepTargetData);
|
|
279
|
+
if (mode === 'wipe') {
|
|
280
|
+
if (await this.targetNodeRunning(this.newClient)) {
|
|
281
|
+
throw new Error(`the target data store still holds chain state and a node is running on ${this.config.newIp} - refusing to format it`);
|
|
282
|
+
}
|
|
283
|
+
this.log('the target volume still holds a stale Octra data set and nothing was pulled yet - reformatting it now', 'warn');
|
|
284
|
+
try {
|
|
285
|
+
await this.runDirect(this.newClient, 'WIPE_VOLUME=1 bash /root/pre-run.sh', 'pre-run.sh (WIPE_VOLUME=1: reformat the stale data set)', 1800);
|
|
286
|
+
pre = await this.getPrerunState(this.newClient, '/root/migration/prerun.env');
|
|
287
|
+
mode = 'plain';
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
this.log(`could not reformat the data volume (${err.message}) - dropping the stale node state instead`, 'warn');
|
|
291
|
+
if (await this.targetNodeRunning(this.newClient)) {
|
|
292
|
+
throw new Error(`cannot reformat or reset the target data store on ${this.config.newIp} while a node is running there`);
|
|
293
|
+
}
|
|
294
|
+
mode = 'reset';
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else if (mode === 'reset') {
|
|
298
|
+
this.log(`no dedicated volume to format - the stale node state on ${this.config.newIp} will be dropped (RESET_TARGET=1)`, 'warn');
|
|
299
|
+
}
|
|
300
|
+
else if (mode === 'force') {
|
|
301
|
+
this.log(`keeping the data set on ${this.config.newIp} (a resumable copy) - preparing with FORCE=1`, 'info');
|
|
302
|
+
}
|
|
303
|
+
const runPrepMode = async (m) => {
|
|
304
|
+
const env = m === 'force' ? { FORCE: '1' } : m === 'reset' ? { RESET_TARGET: '1' } : {};
|
|
305
|
+
await this.runDirect(this.newClient, 'bash /root/migrate/01-prepare-target.sh', `01-prepare-target.sh (${m})`, 1800, { env });
|
|
306
|
+
};
|
|
307
|
+
try {
|
|
308
|
+
await runPrepMode(mode);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
if (mode === 'reset' || this.config.keepTargetData)
|
|
312
|
+
throw err;
|
|
313
|
+
this.log(`prep failed (${err.message}) - self-healing: dropping the target node state and preparing again`, 'warn');
|
|
314
|
+
if (await this.targetNodeRunning(this.newClient)) {
|
|
315
|
+
throw new Error(`prep failed and a node is running on ${this.config.newIp} - not touching its data`);
|
|
316
|
+
}
|
|
317
|
+
await runPrepMode('reset');
|
|
318
|
+
}
|
|
319
|
+
const pubkeyResult = await this.newClient.exec('cat /root/migration/target_ssh_key.pub 2>/dev/null || true', { timeout: 60000 });
|
|
320
|
+
const pubkey = pubkeyResult.stdout.split('\n').map(l => l.trim()).find(l => l.startsWith('ssh-'));
|
|
321
|
+
if (!pubkey)
|
|
322
|
+
throw new Error(`could not read the pull public key from ${this.config.newIp}`);
|
|
323
|
+
await this.runDirect(this.oldClient, `bash /root/migrate/02-authorize-pull.sh ${(0, client_1.shellQuote)(pubkey)}`, '02-authorize-pull.sh', 600);
|
|
324
|
+
await this.runDirect(this.newClient, `ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new root@${this.config.oldIp} 'echo KEY_AUTH_OK' | grep KEY_AUTH_OK`, `verify key auth ${this.config.newIp} -> ${this.config.oldIp}`, 300);
|
|
325
|
+
this.log('prep complete', 'ok');
|
|
326
|
+
this.completePhase(true);
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
this.completePhase(false, err.message);
|
|
330
|
+
throw err;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async stepPull() {
|
|
334
|
+
this.startPhase('pull');
|
|
335
|
+
try {
|
|
336
|
+
await this.runDirect(this.oldClient, 'bash /root/migrate/00-backup-identity.sh', '00-backup-identity.sh (source identity snapshot)', 600);
|
|
337
|
+
const result = await this.runDetached(this.newClient, 'octra-pull-initial', 'bash /root/migrate/03-pull-state.sh', 'initial state pull (node stays online)', 90 * 60, { OLD_HOST: this.config.oldIp });
|
|
338
|
+
if (result.state !== 'DONE')
|
|
339
|
+
throw new Error(`initial pull ${result.state}: ${result.detail}`);
|
|
340
|
+
this.completePhase(true);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
this.completePhase(false, err.message);
|
|
344
|
+
throw err;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
async stepSwitch() {
|
|
348
|
+
this.startPhase('switch');
|
|
349
|
+
try {
|
|
350
|
+
this.log('STOPPING SOURCE NODE', 'warn');
|
|
351
|
+
await this.runDirect(this.newClient, 'bash /root/migrate/04-stop-source.sh', '04-stop-source.sh (fence the old wallet)', 900, {
|
|
352
|
+
env: { OLD_HOST: this.config.oldIp },
|
|
353
|
+
});
|
|
354
|
+
const result = await this.runDetached(this.newClient, 'octra-pull-final', 'bash /root/migrate/03-pull-state.sh --final', 'final delta pull (source stopped)', 60 * 60, { OLD_HOST: this.config.oldIp });
|
|
355
|
+
if (result.state !== 'DONE')
|
|
356
|
+
throw new Error(`final pull ${result.state}: ${result.detail}`);
|
|
357
|
+
this.completePhase(true);
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
this.completePhase(false, err.message);
|
|
361
|
+
throw err;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
async stepFinalize() {
|
|
365
|
+
this.startPhase('finalize');
|
|
366
|
+
try {
|
|
367
|
+
await this.runDirect(this.newClient, 'bash /root/migrate/05-finalize-target.sh', '05-finalize-target.sh', 2700, {
|
|
368
|
+
env: { NEW_HOST: this.config.newIp },
|
|
369
|
+
});
|
|
370
|
+
this.completePhase(true);
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
this.completePhase(false, err.message);
|
|
374
|
+
throw err;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async stepVerify() {
|
|
378
|
+
this.startPhase('verify');
|
|
379
|
+
try {
|
|
380
|
+
await this.runDirect(this.newClient, 'bash /root/migrate/06-start-target.sh', '06-start-target.sh (includes double-sign guard)', 900, {
|
|
381
|
+
env: { OLD_HOST: this.config.oldIp },
|
|
382
|
+
});
|
|
383
|
+
const samples = this.config.samples || constants_1.VERIFY_SAMPLES;
|
|
384
|
+
const interval = this.config.interval || constants_1.VERIFY_INTERVAL;
|
|
385
|
+
// rpc wait + set-fold wait + enrollment projection wait + samples + cushion
|
|
386
|
+
const ceiling = 900 + 2700 + 900 + Math.max(1, samples) * Math.max(5, interval) + 600;
|
|
387
|
+
let verify = { exitCode: 1, stdout: '', stderr: '' };
|
|
388
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
389
|
+
verify = await this.runDirect(this.newClient, 'bash /root/migrate/07-verify.sh', attempt === 1 ? '07-verify.sh (voting check)' : '07-verify.sh (voting check, retry 1/1)', ceiling, { allowFailure: true, env: { SAMPLES: String(samples), INTERVAL: String(interval) } });
|
|
390
|
+
if (verify.exitCode === 0 || verify.exitCode === 2)
|
|
391
|
+
break;
|
|
392
|
+
if (attempt === 1) {
|
|
393
|
+
this.log('verify did not pass on the first read - retrying in 30s (the node may still be warming its RPC/enrollment projection)', 'warn');
|
|
394
|
+
await new Promise(resolve => setTimeout(resolve, 30000));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (verify.exitCode === 2) {
|
|
398
|
+
this.log('=== verify: the node runs, is in sync and holds the bond - the set has not admitted it yet ===', 'ok');
|
|
399
|
+
this.log('that is the chain schedule (the fold re-admits it); nothing was re-enrolled and nothing has to be re-run', 'info');
|
|
400
|
+
this.softStop = { state: 'WAITING-FOLD', detail: 'migrated and in sync; waiting for the set fold' };
|
|
401
|
+
this.activationPending = true;
|
|
402
|
+
this.completePhase(true);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (verify.exitCode !== 0) {
|
|
406
|
+
this.log(`verification did NOT pass after 2 attempts (exit ${verify.exitCode})`, 'error');
|
|
407
|
+
if (/validator_enrollment is not ready/i.test(verify.stdout)) {
|
|
408
|
+
this.log('the node is running; only the enrollment projection did not settle. Re-run the verify phase (it resumes here) before considering a rollback.', 'warn');
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
this.log(`the source is stopped - inspect 07-verify.sh output, or bring the old validator back with the rollback phase`, 'warn');
|
|
412
|
+
}
|
|
413
|
+
throw new Error(`07-verify.sh failed (exit ${verify.exitCode})`);
|
|
414
|
+
}
|
|
415
|
+
this.log(`verification passed - validator is live on ${this.config.newIp}`, 'ok');
|
|
416
|
+
this.completePhase(true);
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
this.completePhase(false, err.message);
|
|
420
|
+
throw err;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async stepRollback() {
|
|
424
|
+
this.startPhase('rollback');
|
|
425
|
+
try {
|
|
426
|
+
await this.runDirect(this.newClient, 'bash /root/migrate/08-rollback.sh', '08-rollback.sh', 900, {
|
|
427
|
+
env: { OLD_HOST: this.config.oldIp },
|
|
428
|
+
});
|
|
429
|
+
this.log(`rollback finished - validator is back on ${this.config.oldIp}`, 'ok');
|
|
430
|
+
this.completePhase(true);
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
this.completePhase(false, err.message);
|
|
434
|
+
throw err;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
exports.MigrateOrchestrator = MigrateOrchestrator;
|
|
439
|
+
function createMigrateOrchestrator(config, logger) {
|
|
440
|
+
return new MigrateOrchestrator(config, logger);
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/orchestrator/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SSHConfig, RemoteResult } from '../types';
|
|
2
|
+
export declare class SSHClient {
|
|
3
|
+
private client;
|
|
4
|
+
private config;
|
|
5
|
+
private fingerprint;
|
|
6
|
+
private connected;
|
|
7
|
+
constructor(config: SSHConfig);
|
|
8
|
+
get host(): string;
|
|
9
|
+
get hostFingerprint(): string | null;
|
|
10
|
+
connect(): Promise<void>;
|
|
11
|
+
exec(command: string, options?: {
|
|
12
|
+
timeout?: number;
|
|
13
|
+
onLine?: (line: string, stream: 'stdout' | 'stderr') => void;
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}): Promise<RemoteResult>;
|
|
16
|
+
private sftp;
|
|
17
|
+
private ensureRemoteDir;
|
|
18
|
+
private prepareUpload;
|
|
19
|
+
uploadBatch(items: Array<{
|
|
20
|
+
localPath: string;
|
|
21
|
+
remotePath: string;
|
|
22
|
+
normalizeLf?: boolean;
|
|
23
|
+
}>): Promise<void>;
|
|
24
|
+
uploadFile(localPath: string, remotePath: string, normalizeLf?: boolean): Promise<void>;
|
|
25
|
+
uploadDir(localDir: string, remoteDir: string, filter?: (rel: string) => boolean): Promise<number>;
|
|
26
|
+
downloadFile(remotePath: string, localPath: string): Promise<void>;
|
|
27
|
+
readRemoteFile(remotePath: string): Promise<string | null>;
|
|
28
|
+
ensureConnected(): Promise<void>;
|
|
29
|
+
disconnect(): Promise<void>;
|
|
30
|
+
isConnected(): boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function shellQuote(value: string): string;
|
|
33
|
+
export declare function createSSHClient(config: SSHConfig): Promise<SSHClient>;
|
|
34
|
+
export declare function execWithRetry(client: SSHClient, command: string, options?: {
|
|
35
|
+
retries?: number;
|
|
36
|
+
timeout?: number;
|
|
37
|
+
onLine?: (line: string) => void;
|
|
38
|
+
}): Promise<RemoteResult>;
|
|
39
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ssh/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAiBxD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,SAAS;IAI7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,eAAe,IAAI,MAAM,GAAG,IAAI,CAEnC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoFxB,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrH,OAAO,CAAC,YAAY,CAAC;IAqGxB,OAAO,CAAC,IAAI;YAUE,eAAe;YAWf,aAAa;IAUrB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1G,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBlG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM1D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,WAAW,IAAI,OAAO;CAGvB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAI3E;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GACpF,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
|