@constellation-network/node-pilot 0.0.7 → 0.0.9
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/README.md +26 -18
- package/bin/dev.js +1 -6
- package/bin/run.js +1 -1
- package/dist/base-command.d.ts +9 -0
- package/dist/base-command.js +20 -0
- package/dist/checks/check-dependencies.d.ts +1 -0
- package/dist/checks/check-dependencies.js +44 -0
- package/dist/checks/check-hardware.js +3 -3
- package/dist/checks/check-initial-setup.js +6 -4
- package/dist/checks/check-layers.js +7 -7
- package/dist/checks/check-network.d.ts +3 -0
- package/dist/checks/check-network.js +92 -9
- package/dist/checks/check-node-ctl.d.ts +5 -0
- package/dist/checks/check-node-ctl.js +88 -0
- package/dist/checks/check-project.js +33 -13
- package/dist/checks/check-wallet.d.ts +3 -0
- package/dist/checks/check-wallet.js +37 -0
- package/dist/clm.d.ts +1 -0
- package/dist/clm.js +4 -1
- package/dist/commands/config/get.d.ts +6 -0
- package/dist/commands/config/get.js +57 -11
- package/dist/commands/config/set.d.ts +0 -1
- package/dist/commands/config/set.js +13 -11
- package/dist/commands/config.js +17 -22
- package/dist/commands/info.js +3 -2
- package/dist/commands/logs.d.ts +2 -1
- package/dist/commands/logs.js +12 -6
- package/dist/commands/restart.d.ts +5 -2
- package/dist/commands/restart.js +25 -5
- package/dist/commands/shutdown.js +3 -3
- package/dist/commands/status.js +8 -0
- package/dist/commands/test.d.ts +1 -0
- package/dist/commands/test.js +35 -5
- package/dist/config-store.d.ts +50 -34
- package/dist/config-store.js +80 -32
- package/dist/helpers/config-helper.js +2 -2
- package/dist/helpers/env-templates.d.ts +4 -3
- package/dist/helpers/env-templates.js +28 -20
- package/dist/helpers/key-file-helper.d.ts +2 -0
- package/dist/helpers/key-file-helper.js +52 -17
- package/dist/helpers/project-helper.d.ts +3 -2
- package/dist/helpers/project-helper.js +86 -35
- package/dist/helpers/prompt-helper.d.ts +0 -2
- package/dist/helpers/prompt-helper.js +15 -66
- package/dist/services/archiver-service.d.ts +17 -0
- package/dist/services/archiver-service.js +104 -0
- package/dist/services/cluster-service.d.ts +10 -5
- package/dist/services/cluster-service.js +46 -36
- package/dist/services/docker-service.d.ts +9 -0
- package/dist/services/docker-service.js +53 -0
- package/dist/services/fastforward-service.js +12 -6
- package/dist/services/get-random-node.d.ts +2 -0
- package/dist/services/get-random-node.js +16 -0
- package/dist/{helpers/github-helper.d.ts → services/github-service.d.ts} +1 -1
- package/dist/{helpers/github-helper.js → services/github-service.js} +1 -1
- package/dist/services/node-service.d.ts +4 -0
- package/dist/services/node-service.js +29 -14
- package/dist/services/shell-service.d.ts +3 -1
- package/dist/services/shell-service.js +32 -6
- package/dist/test.d.ts +1 -0
- package/dist/test.js +50 -0
- package/dist/types.d.ts +42 -3
- package/install-dependencies.sh +98 -0
- package/oclif.manifest.json +31 -4
- package/package.json +12 -8
- package/projects/hypergraph/Dockerfile +27 -18
- package/projects/hypergraph/docker-compose.yml +14 -12
- package/projects/hypergraph/networks/integrationnet/gl0.env +4 -0
- package/projects/hypergraph/networks/integrationnet/gl1.env +4 -0
- package/projects/hypergraph/networks/integrationnet/network.env +8 -0
- package/projects/hypergraph/networks/integrationnet/source-nodes.env +9 -0
- package/projects/hypergraph/networks/mainnet/gl0.env +4 -0
- package/projects/hypergraph/networks/mainnet/gl1.env +4 -0
- package/projects/hypergraph/networks/mainnet/network.env +8 -0
- package/projects/hypergraph/networks/mainnet/source-nodes.env +9 -0
- package/projects/hypergraph/networks/testnet/gl0.env +5 -0
- package/projects/hypergraph/networks/testnet/gl1.env +4 -0
- package/projects/hypergraph/networks/testnet/network.env +8 -0
- package/projects/hypergraph/networks/testnet/source-nodes.env +9 -0
- package/projects/hypergraph/scripts/check-version.sh +31 -0
- package/projects/hypergraph/scripts/docker-build.sh +12 -1
- package/projects/hypergraph/scripts/install-dependencies.sh +3 -3
- package/projects/hypergraph/scripts/install.sh +34 -31
- package/projects/hypergraph/seedlist +268 -0
- package/scripts/autoheal.sh +8 -0
- package/scripts/services/io.constellationnetwork.nodepilot.Updater.plist +16 -0
- package/scripts/services/node-pilot-autoheal.service +14 -0
- package/scripts/services/node-pilot-updater-hypergraph.service +15 -0
- package/scripts/updater.sh +13 -0
- package/dist/helpers/docker-helper.d.ts +0 -7
- package/dist/helpers/docker-helper.js +0 -37
- package/projects/hypergraph/layers/gl1.env +0 -3
- package/projects/hypergraph/networks/integrationnet.env +0 -9
- package/projects/hypergraph/networks/mainnet.env +0 -8
- package/projects/hypergraph/networks/testnet.env +0 -9
- package/projects/scripts/docker-cleanup.sh +0 -64
@@ -0,0 +1,37 @@
|
|
1
|
+
import chalk from "chalk";
|
2
|
+
import { clm } from "../clm.js";
|
3
|
+
import { configStore } from "../config-store.js";
|
4
|
+
import { promptHelper } from "../helpers/prompt-helper.js";
|
5
|
+
export const checkWallet = {
|
6
|
+
async checkCollateral() {
|
7
|
+
const { type } = configStore.getNetworkInfo();
|
8
|
+
if (type !== 'mainnet')
|
9
|
+
return;
|
10
|
+
const skipCollateralCheck = configStore.hasProjectFlag('skipCollateralCheck');
|
11
|
+
if (skipCollateralCheck)
|
12
|
+
return;
|
13
|
+
clm.preStep('Checking for required collateral...');
|
14
|
+
const { dagAddress } = configStore.getProjectInfo();
|
15
|
+
const url = `https://be-mainnet.constellationnetwork.io/addresses/${dagAddress}/balance`;
|
16
|
+
let hasError = false;
|
17
|
+
const balance = await fetch(url)
|
18
|
+
.then(res => res.json())
|
19
|
+
.then(i => i.data.balance)
|
20
|
+
.catch(() => {
|
21
|
+
clm.warn(`Failed to fetch balance from ${url}`);
|
22
|
+
hasError = true;
|
23
|
+
});
|
24
|
+
if (!hasError && balance < 25_000_000_000_000) {
|
25
|
+
clm.warn(`You need at least 250k DAG to run a validator node. Your account ${chalk.cyan(dagAddress)} has a balance of ${chalk.cyan(balance)} DAG.`);
|
26
|
+
hasError = true;
|
27
|
+
}
|
28
|
+
if (hasError) {
|
29
|
+
clm.echo('You may continue and skip this check in the future');
|
30
|
+
await promptHelper.doYouWishToContinue();
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
clm.postStep('Collateral check PASSED');
|
34
|
+
}
|
35
|
+
configStore.setProjectFlag('skipCollateralCheck', true);
|
36
|
+
}
|
37
|
+
};
|
package/dist/clm.d.ts
CHANGED
package/dist/clm.js
CHANGED
@@ -11,6 +11,9 @@ export const clm = {
|
|
11
11
|
echo(msg) {
|
12
12
|
console.log(msg);
|
13
13
|
},
|
14
|
+
echoRepeatLine(char) {
|
15
|
+
process.stdout.write('\r' + char);
|
16
|
+
},
|
14
17
|
error(msg, silent = true) {
|
15
18
|
console.error(chalk.red(msg));
|
16
19
|
process.exit(silent ? 0 : 1);
|
@@ -19,7 +22,7 @@ export const clm = {
|
|
19
22
|
console.log(chalk.green(s));
|
20
23
|
},
|
21
24
|
preStep(s) {
|
22
|
-
console.log('\n'
|
25
|
+
console.log('\n' + chalk.italic(chalk.green(s)));
|
23
26
|
},
|
24
27
|
step(msg) {
|
25
28
|
console.warn(chalk.whiteBright(msg));
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { Args, Command } from '@oclif/core';
|
2
|
-
import {
|
2
|
+
import { clm } from "../../clm.js";
|
3
|
+
import { configStore, layerEnvNames, networkEnvNames } from "../../config-store.js";
|
3
4
|
import { configHelper } from "../../helpers/config-helper.js";
|
4
5
|
export default class ConfigGet extends Command {
|
5
6
|
static args = {
|
@@ -11,27 +12,72 @@ export default class ConfigGet extends Command {
|
|
11
12
|
'<%= config.bin %> <%= command.id %> CL_EXTERNAL_IP',
|
12
13
|
'<%= config.bin %> <%= command.id %> gl0:CL_PUBLIC_HTTP_PORT',
|
13
14
|
];
|
15
|
+
getKeyInfo() {
|
16
|
+
const { dagAddress, nodeId } = configStore.getProjectInfo();
|
17
|
+
const { CL_KEYALIAS, CL_KEYSTORE } = configStore.getEnvInfo();
|
18
|
+
return {
|
19
|
+
KEY_ALIAS: CL_KEYALIAS,
|
20
|
+
KEY_FILE: CL_KEYSTORE,
|
21
|
+
NODE_ADDRESS: dagAddress,
|
22
|
+
NODE_ID: nodeId,
|
23
|
+
};
|
24
|
+
}
|
14
25
|
async run() {
|
15
26
|
configHelper.assertProject('No configuration found. ');
|
16
27
|
const { args } = await this.parse(ConfigGet);
|
17
|
-
const info = configStore.getEnvInfo();
|
28
|
+
// const info = configStore.getEnvInfo();
|
18
29
|
const { layersToRun } = configStore.getProjectInfo();
|
19
|
-
const
|
20
|
-
const
|
30
|
+
const { type: network } = configStore.getNetworkInfo();
|
31
|
+
const networkEnv = configStore.getEnvNetworkInfo(network);
|
32
|
+
// const networkProp = info.network as Record<string, string>;
|
33
|
+
// const layers = info.layers as Record<string, Record<string, string>>;
|
34
|
+
const gl = (l) => configStore.getEnvLayerInfo(network, l);
|
21
35
|
if (Object.keys(args).length === 0 || args.name === undefined) {
|
22
|
-
const
|
23
|
-
const layersList = layersToRun.map(l => (Object.keys(layerEnvNames).map(k => ({ name: `${l}:${k}`, value:
|
24
|
-
|
25
|
-
|
36
|
+
const networkList = Object.keys(networkEnvNames).sort().map(k => ({ name: k, value: networkEnv[k] }));
|
37
|
+
const layersList = layersToRun.map(l => (Object.keys(layerEnvNames).map(k => ({ name: `${l}:${k}`, value: gl(l)[k] }))));
|
38
|
+
const keyInfo = this.getKeyInfo();
|
39
|
+
const keyInfoList = Object.keys(keyInfo).map(k => ({ name: 'key:' + k, value: keyInfo[k] }));
|
40
|
+
configHelper.showEnvInfoList(networkList);
|
41
|
+
configHelper.showEnvInfoList(keyInfoList);
|
26
42
|
configHelper.showEnvInfoList(layersList.flat());
|
27
43
|
}
|
28
44
|
else if (args.name.includes(':')) {
|
29
45
|
const [layer, name] = args.name.split(':');
|
30
|
-
|
46
|
+
if (layer === 'key') {
|
47
|
+
const keyInfo = this.getKeyInfo();
|
48
|
+
if (Object.hasOwn(keyInfo, name)) {
|
49
|
+
configHelper.showEnvInfo(args.name, keyInfo[name]);
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
clm.warn('Invalid key property. Valid properties are: ' + Object.keys(keyInfo).join(', '));
|
53
|
+
}
|
54
|
+
}
|
55
|
+
else if (!layersToRun.includes(layer)) {
|
56
|
+
clm.warn(`Layer ${layer} is not running. Valid layers are: ` + layersToRun.join(', '));
|
57
|
+
}
|
58
|
+
else if (Object.hasOwn(layerEnvNames, name)) {
|
59
|
+
configHelper.showEnvInfo(args.name, gl(layer)[name]);
|
60
|
+
}
|
61
|
+
else {
|
62
|
+
clm.warn('Invalid layer property. Valid properties are: ' + Object.keys(layerEnvNames).join(', '));
|
63
|
+
}
|
64
|
+
}
|
65
|
+
else if (args.name === 'key') {
|
66
|
+
const keyInfo = this.getKeyInfo();
|
67
|
+
const keyInfoList = Object.keys(keyInfo).map(k => ({ name: 'key:' + k, value: keyInfo[k] }));
|
68
|
+
configHelper.showEnvInfoList(keyInfoList);
|
69
|
+
}
|
70
|
+
else if (layersToRun.includes(args.name)) {
|
71
|
+
const layer = args.name;
|
72
|
+
const list = Object.keys(layerEnvNames).map(k => ({ name: `${layer}:${k}`, value: gl(layer)[k] }));
|
73
|
+
configHelper.showEnvInfoList(list);
|
31
74
|
}
|
32
75
|
else {
|
33
|
-
|
34
|
-
|
76
|
+
if (!Object.hasOwn(networkEnvNames, args.name)) {
|
77
|
+
clm.warn('Invalid network-wide property. Valid properties are: ' + Object.keys(networkEnvNames).join(', '));
|
78
|
+
return;
|
79
|
+
}
|
80
|
+
configHelper.showEnvInfo(args.name, networkEnv[args.name]);
|
35
81
|
}
|
36
82
|
}
|
37
83
|
}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import { Args, Command } from '@oclif/core';
|
2
|
-
import
|
2
|
+
import chalk from "chalk";
|
3
|
+
import { clm } from "../../clm.js";
|
4
|
+
import { configStore, layerEnvNames, networkEnvNames } from "../../config-store.js";
|
3
5
|
import { configHelper } from "../../helpers/config-helper.js";
|
4
6
|
export default class ConfigSet extends Command {
|
5
7
|
static args = {
|
@@ -11,31 +13,31 @@ export default class ConfigSet extends Command {
|
|
11
13
|
'<%= config.bin %> <%= command.id %> CL_EXTERNAL_IP 127.0.0.1',
|
12
14
|
'<%= config.bin %> <%= command.id %> gl0:CL_PUBLIC_HTTP_PORT 9000',
|
13
15
|
];
|
14
|
-
logErrorAndExit(message) {
|
15
|
-
this.log(message);
|
16
|
-
this.exit(0);
|
17
|
-
}
|
18
16
|
async run() {
|
19
17
|
configHelper.assertProject('No configuration found. ');
|
20
18
|
const { args } = await this.parse(ConfigSet);
|
21
19
|
const { layersToRun } = configStore.getProjectInfo();
|
20
|
+
if (args.name.startsWith('key')) {
|
21
|
+
clm.error(`Key properties cannot be set directly. Please run ${chalk.cyan('cpilot config')} and select ${chalk.cyan('Key Info')} to manage the key file.`);
|
22
|
+
}
|
23
|
+
const { type: network } = configStore.getNetworkInfo();
|
22
24
|
if (args.name.includes(':')) {
|
23
25
|
const [layer, name] = args.name.split(':');
|
24
26
|
if (!layersToRun.includes(layer)) {
|
25
|
-
|
27
|
+
clm.error(`Invalid layer: ${layer}. Available layers: ${layersToRun.join(',')}`);
|
26
28
|
}
|
27
29
|
const validLayer = layer;
|
28
30
|
if (!Object.hasOwn(layerEnvNames, name)) {
|
29
|
-
|
31
|
+
clm.error(`Invalid layer configuration name: ${name}. Valid names are: ${Object.keys(layerEnvNames).join(', ')}`);
|
30
32
|
}
|
31
|
-
configStore.setEnvLayerInfo(validLayer, { [name]: args.value });
|
33
|
+
configStore.setEnvLayerInfo(network, validLayer, { [name]: args.value });
|
32
34
|
}
|
33
35
|
else {
|
34
36
|
const { name } = args;
|
35
|
-
if (!Object.hasOwn(
|
36
|
-
|
37
|
+
if (!Object.hasOwn(networkEnvNames, name)) {
|
38
|
+
clm.error(`Invalid configuration name: ${name}. Valid names are: ${Object.keys(networkEnvNames).join(', ')}`);
|
37
39
|
}
|
38
|
-
configStore.
|
40
|
+
configStore.setEnvNetworkInfo(network, { [name]: args.value });
|
39
41
|
}
|
40
42
|
}
|
41
43
|
}
|
package/dist/commands/config.js
CHANGED
@@ -3,11 +3,10 @@ import { Command } from '@oclif/core';
|
|
3
3
|
import { checkNetwork } from "../checks/check-network.js";
|
4
4
|
import { checkProject } from "../checks/check-project.js";
|
5
5
|
import { clm } from "../clm.js";
|
6
|
-
import { configStore } from "../config-store.js";
|
7
6
|
import { configHelper } from "../helpers/config-helper.js";
|
8
|
-
import { dockerHelper } from "../helpers/docker-helper.js";
|
9
7
|
import { keyFileHelper } from "../helpers/key-file-helper.js";
|
10
8
|
import { promptHelper } from "../helpers/prompt-helper.js";
|
9
|
+
import { dockerService } from "../services/docker-service.js";
|
11
10
|
export default class Config extends Command {
|
12
11
|
static description = 'Update configuration settings';
|
13
12
|
static examples = [
|
@@ -15,51 +14,47 @@ export default class Config extends Command {
|
|
15
14
|
];
|
16
15
|
async run() {
|
17
16
|
configHelper.assertProject('No configuration found. ');
|
18
|
-
let {
|
19
|
-
name = name.charAt(0).toUpperCase() + name.slice(1);
|
17
|
+
// let {name} = configStore.getProjectInfo();
|
18
|
+
// name = name.charAt(0).toUpperCase() + name.slice(1);
|
20
19
|
const answer = await select({
|
21
20
|
choices: [
|
22
|
-
{ name: 'Auto Restart', value: 'autoRestart' },
|
23
21
|
{ name: 'External IP Address', value: 'externalIp' },
|
24
22
|
{ name: 'Java Memory', value: 'javaMemory' },
|
25
23
|
{ name: 'Key File', value: 'keyFile' },
|
26
|
-
{ name:
|
27
|
-
{ name: `Network
|
24
|
+
{ name: 'Layers To Run', value: 'layersToRun' },
|
25
|
+
{ name: `Network`, value: 'network' },
|
28
26
|
],
|
29
27
|
message: 'What would you like to change?:',
|
30
28
|
});
|
31
29
|
// eslint-disable-next-line unicorn/prefer-switch
|
32
|
-
if (answer === '
|
33
|
-
await promptHelper.configureAutoRestart();
|
34
|
-
}
|
35
|
-
else if (answer === 'externalIp') {
|
30
|
+
if (answer === 'externalIp') {
|
36
31
|
await checkNetwork.configureIpAddress();
|
37
32
|
}
|
38
33
|
else if (answer === 'javaMemory') {
|
34
|
+
await shutdownNodeIfRunning();
|
39
35
|
await promptHelper.configureJavaMemoryArguments();
|
40
|
-
if (await dockerHelper.isRunning()) {
|
41
|
-
clm.preStep('The validator node must be restarted before changes can be applied.');
|
42
|
-
await promptHelper.doYouWishToContinue();
|
43
|
-
await dockerHelper.dockerDown();
|
44
|
-
await dockerHelper.dockerUp();
|
45
|
-
}
|
46
36
|
}
|
47
37
|
else if (answer === 'keyFile') {
|
38
|
+
await shutdownNodeIfRunning();
|
48
39
|
await keyFileHelper.showKeyFileInfo();
|
49
40
|
await keyFileHelper.promptForKeyFile();
|
50
41
|
}
|
51
42
|
else if (answer === 'layersToRun') {
|
52
|
-
|
53
|
-
clm.preStep('The validator node must be stopped first.');
|
54
|
-
await promptHelper.doYouWishToContinue();
|
55
|
-
await dockerHelper.dockerDown();
|
56
|
-
}
|
43
|
+
await shutdownNodeIfRunning();
|
57
44
|
await promptHelper.selectLayers();
|
58
45
|
await promptHelper.configureJavaMemoryArguments();
|
59
46
|
}
|
60
47
|
else if (answer === 'network') {
|
48
|
+
await shutdownNodeIfRunning();
|
61
49
|
await promptHelper.selectNetwork();
|
62
50
|
await checkProject.runInstall();
|
63
51
|
}
|
64
52
|
}
|
65
53
|
}
|
54
|
+
async function shutdownNodeIfRunning() {
|
55
|
+
if (await dockerService.isRunning()) {
|
56
|
+
clm.preStep('The validator node must be stopped first.');
|
57
|
+
await promptHelper.doYouWishToContinue();
|
58
|
+
await dockerService.dockerDown();
|
59
|
+
}
|
60
|
+
}
|
package/dist/commands/info.js
CHANGED
@@ -10,10 +10,13 @@ export default class Info extends Command {
|
|
10
10
|
configHelper.assertProject('No project info found. ');
|
11
11
|
const projectInfo = configStore.getProjectInfo();
|
12
12
|
const networkInfo = configStore.getNetworkInfo();
|
13
|
+
const { CL_EXTERNAL_IP: currentIpAddress } = configStore.getEnvInfo();
|
13
14
|
// Project Name
|
14
15
|
configHelper.showEnvInfo('Project Name', projectInfo.name);
|
15
16
|
// DAG Address
|
16
17
|
configHelper.showEnvInfo('DAG Address', projectInfo.dagAddress);
|
18
|
+
// External IP Address
|
19
|
+
configHelper.showEnvInfo('External IP Address', currentIpAddress);
|
17
20
|
// Node ID
|
18
21
|
configHelper.showEnvInfo('Node ID', projectInfo.nodeId);
|
19
22
|
// Layers to Run
|
@@ -26,7 +29,5 @@ export default class Info extends Command {
|
|
26
29
|
configHelper.showEnvInfo('Project Directory', projectInfo.projectDir);
|
27
30
|
// Fast Forward
|
28
31
|
configHelper.showEnvInfo('Fast Forward Enabled', (projectInfo.fastForward === undefined || Boolean(projectInfo.fastForward)).toString());
|
29
|
-
// Auto Restart
|
30
|
-
configHelper.showEnvInfo('Auto Restart Enabled', Boolean(projectInfo.autoRestart).toString());
|
31
32
|
}
|
32
33
|
}
|
package/dist/commands/logs.d.ts
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
import { Command } from '@oclif/core';
|
2
2
|
export default class Logs extends Command {
|
3
3
|
static args: {
|
4
|
-
layer: import("@oclif/core/interfaces").Arg<string
|
4
|
+
layer: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
5
5
|
};
|
6
6
|
static description: string;
|
7
7
|
static examples: string[];
|
8
8
|
static flags: {
|
9
9
|
follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
10
|
+
numOfLines: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
10
11
|
};
|
11
12
|
run(): Promise<void>;
|
12
13
|
}
|
package/dist/commands/logs.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
import { Args, Command, Flags } from '@oclif/core';
|
2
2
|
import path from "node:path";
|
3
|
-
import { shellService } from "../services/shell-service.js";
|
4
3
|
import { configStore } from "../config-store.js";
|
5
4
|
import { configHelper } from "../helpers/config-helper.js";
|
5
|
+
import { shellService } from "../services/shell-service.js";
|
6
6
|
export default class Logs extends Command {
|
7
7
|
static args = {
|
8
|
-
layer: Args.string({ description: 'network layer to view. e.g. gl0' }),
|
8
|
+
layer: Args.string({ description: 'network layer to view. e.g. gl0', required: true }),
|
9
9
|
};
|
10
10
|
static description = 'view validator node runtime logs';
|
11
11
|
static examples = [
|
@@ -13,16 +13,22 @@ export default class Logs extends Command {
|
|
13
13
|
];
|
14
14
|
static flags = {
|
15
15
|
follow: Flags.boolean({ char: 'f', description: 'continuously wait for additional data to be appended' }),
|
16
|
+
numOfLines: Flags.string({ char: 'n', description: 'number of lines at the end of the log to display' }),
|
16
17
|
};
|
17
18
|
async run() {
|
18
19
|
configHelper.assertProject('No project found. ');
|
19
|
-
|
20
|
-
const
|
20
|
+
const { args, flags } = await this.parse(Logs);
|
21
|
+
const numOfLines = Number.isNaN(Number(flags.numOfLines)) ? 100 : Number(flags.numOfLines);
|
22
|
+
const { layersToRun } = configStore.getProjectInfo();
|
23
|
+
if (!layersToRun.includes(args.layer)) {
|
24
|
+
this.error(`Invalid layer: ${args.layer}. Available layers: ${layersToRun.join(',')}`);
|
25
|
+
}
|
26
|
+
let tailFlag = flags.numOfLines ? `-n ${numOfLines}` : '-n 100';
|
21
27
|
if (flags.follow) {
|
22
|
-
tailFlag = '-f';
|
28
|
+
tailFlag = ' -f';
|
23
29
|
}
|
24
30
|
const { projectDir } = configStore.getProjectInfo();
|
25
|
-
const logPath = path.join(projectDir, 'app-data',
|
31
|
+
const logPath = path.join(projectDir, 'app-data', `${args.layer}-logs`, 'app.log');
|
26
32
|
await shellService.runCommand(`tail ${tailFlag} ${logPath}`).catch(() => 1);
|
27
33
|
}
|
28
34
|
}
|
@@ -1,5 +1,8 @@
|
|
1
|
-
import {
|
2
|
-
export default class Restart extends
|
1
|
+
import { BaseCommand } from "../base-command.js";
|
2
|
+
export default class Restart extends BaseCommand {
|
3
|
+
static args: {
|
4
|
+
layer: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
5
|
+
};
|
3
6
|
static description: string;
|
4
7
|
static examples: string[];
|
5
8
|
run(): Promise<void>;
|
package/dist/commands/restart.js
CHANGED
@@ -1,25 +1,45 @@
|
|
1
|
-
import {
|
1
|
+
import { Args } from '@oclif/core';
|
2
|
+
import { BaseCommand } from "../base-command.js";
|
2
3
|
import { checkProject } from "../checks/check-project.js";
|
3
4
|
import { clm } from "../clm.js";
|
4
5
|
import { configStore } from "../config-store.js";
|
5
6
|
import { configHelper } from "../helpers/config-helper.js";
|
6
|
-
import {
|
7
|
+
import { dockerService } from "../services/docker-service.js";
|
7
8
|
import { nodeService } from "../services/node-service.js";
|
8
|
-
export default class Restart extends
|
9
|
+
export default class Restart extends BaseCommand {
|
10
|
+
static args = {
|
11
|
+
layer: Args.string({ description: 'network layer to view. e.g. gl0' }),
|
12
|
+
};
|
9
13
|
static description = 'A full shutdown of the validator node, then restart';
|
10
14
|
static examples = [
|
11
15
|
'<%= config.bin %> <%= command.id %>',
|
12
16
|
];
|
13
17
|
async run() {
|
18
|
+
const { args, flags } = await this.parse(Restart);
|
19
|
+
this.checkProject(flags);
|
14
20
|
configHelper.assertProject('No project found. ');
|
15
21
|
const { layersToRun } = configStore.getProjectInfo();
|
22
|
+
if (!await dockerService.isRunning()) {
|
23
|
+
this.error('The validator node is not running.');
|
24
|
+
}
|
25
|
+
if (args && args.layer) {
|
26
|
+
const layer = args.layer;
|
27
|
+
if (!layersToRun.includes(layer)) {
|
28
|
+
this.error(`Invalid layer: ${layer}. Available layers: ${layersToRun.join(',')}`);
|
29
|
+
}
|
30
|
+
await nodeService.leaveCluster(layer);
|
31
|
+
await nodeService.pollForLayersState([layer], 'Offline');
|
32
|
+
clm.preStep(`Restarting ${layer.toUpperCase()}...`);
|
33
|
+
await dockerService.dockerRestart(layer);
|
34
|
+
return;
|
35
|
+
}
|
16
36
|
await nodeService.leaveClusterAllLayers();
|
17
37
|
await nodeService.pollForLayersState(layersToRun, 'Offline');
|
18
38
|
clm.preStep('Stopping the node...');
|
19
|
-
await
|
39
|
+
await dockerService.dockerDown();
|
20
40
|
clm.preStep('Checking for a new version...');
|
21
41
|
await checkProject.runUpgrade();
|
22
42
|
clm.preStep('Starting the node...');
|
23
|
-
await
|
43
|
+
await dockerService.dockerUp();
|
24
44
|
}
|
25
45
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Command } from '@oclif/core';
|
2
2
|
import { configStore } from "../config-store.js";
|
3
|
-
import { dockerHelper } from "../helpers/docker-helper.js";
|
4
|
-
import { nodeService } from "../services/node-service.js";
|
5
3
|
import { configHelper } from "../helpers/config-helper.js";
|
4
|
+
import { dockerService } from "../services/docker-service.js";
|
5
|
+
import { nodeService } from "../services/node-service.js";
|
6
6
|
export default class Shutdown extends Command {
|
7
7
|
static description = 'A full shutdown of the validator node';
|
8
8
|
static examples = [
|
@@ -13,6 +13,6 @@ export default class Shutdown extends Command {
|
|
13
13
|
const { layersToRun } = configStore.getProjectInfo();
|
14
14
|
await nodeService.leaveClusterAllLayers();
|
15
15
|
await nodeService.pollForLayersState(layersToRun, 'Offline');
|
16
|
-
await
|
16
|
+
await dockerService.dockerDown();
|
17
17
|
}
|
18
18
|
}
|
package/dist/commands/status.js
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
import { Command } from '@oclif/core';
|
2
2
|
import { checkInitialSetup } from "../checks/check-initial-setup.js";
|
3
3
|
import { checkLayers } from "../checks/check-layers.js";
|
4
|
+
import { checkNetwork } from "../checks/check-network.js";
|
5
|
+
import { checkNodeCtl } from "../checks/check-node-ctl.js";
|
4
6
|
import { checkProject } from "../checks/check-project.js";
|
7
|
+
import { checkWallet } from "../checks/check-wallet.js";
|
5
8
|
import { keyFileHelper } from "../helpers/key-file-helper.js";
|
6
9
|
export default class Status extends Command {
|
7
10
|
// eslint-disable-next-line no-warning-comments
|
@@ -14,8 +17,13 @@ export default class Status extends Command {
|
|
14
17
|
export async function checkInstallationAndConfigurationStatus() {
|
15
18
|
await checkInitialSetup.firstTimeRun();
|
16
19
|
await checkProject.projectInstallation();
|
20
|
+
await checkNetwork.isNetworkConnectable();
|
17
21
|
await checkProject.releaseVersion();
|
22
|
+
await checkNodeCtl.check4Migration();
|
18
23
|
await keyFileHelper.promptIfNoKeyFile();
|
24
|
+
await checkNetwork.checkSeedList();
|
25
|
+
await checkNetwork.checkForExistingNodeIdInCluster();
|
26
|
+
await checkWallet.checkCollateral();
|
19
27
|
await checkLayers.layersRunning();
|
20
28
|
await checkLayers.layersReadyToJoin();
|
21
29
|
await checkLayers.layersStatus();
|
package/dist/commands/test.d.ts
CHANGED
package/dist/commands/test.js
CHANGED
@@ -1,13 +1,43 @@
|
|
1
1
|
import { Command } from "@oclif/core";
|
2
|
+
import dotenv from "dotenv";
|
2
3
|
import fs from "node:fs";
|
4
|
+
import path from "node:path";
|
5
|
+
import { fileURLToPath } from "node:url";
|
6
|
+
import { archiverService } from "../services/archiver-service.js";
|
7
|
+
import { getRandomNode } from "../services/get-random-node.js";
|
3
8
|
export default class Test extends Command {
|
4
9
|
static description = 'node pilot test command';
|
5
10
|
static hidden = true;
|
6
11
|
async run() {
|
7
|
-
// await
|
8
|
-
|
9
|
-
const
|
10
|
-
|
11
|
-
|
12
|
+
// await checkNodeCtl.importKeyInfo(path.resolve('/Users/ffox/Projects/Constellation/node-pilot/cn-config.yaml'));
|
13
|
+
// await this.testRandomNode();
|
14
|
+
// const info = await archiverService.getArchiveSnapshotInfo();
|
15
|
+
// console.log(info);
|
16
|
+
// const ordinal = archiverService.getDownloadedSnapshotRange();
|
17
|
+
// console.log(ordinal)
|
18
|
+
//
|
19
|
+
// await archiverService.syncToLatestSnapshot();
|
20
|
+
await archiverService.checkLogsForMissingSnapshots();
|
21
|
+
}
|
22
|
+
async testRandomNode() {
|
23
|
+
const filePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), `../../projects/hypergraph/networks/mainnet/source-nodes.env`);
|
24
|
+
const conetent = fs.readFileSync(filePath);
|
25
|
+
const parsed = dotenv.parse(conetent);
|
26
|
+
const nodes = ['1', '2', '3'].map(i => {
|
27
|
+
return { host: parsed[`SOURCE_NODE_${i}_HOST`], id: parsed[`SOURCE_NODE_${i}_ID`], publicPort: parsed[`SOURCE_NODE_${i}_PORT`] };
|
28
|
+
});
|
29
|
+
const n = await getRandomNode(nodes);
|
30
|
+
console.log('Random node:', n);
|
12
31
|
}
|
13
32
|
}
|
33
|
+
// type NetworkEnvType = {
|
34
|
+
// SOURCE_NODE_1_HOST:string,
|
35
|
+
// SOURCE_NODE_1_ID:string,
|
36
|
+
// SOURCE_NODE_1_PORT:string,
|
37
|
+
// SOURCE_NODE_2_HOST:string,
|
38
|
+
// SOURCE_NODE_2_ID:string,
|
39
|
+
// SOURCE_NODE_2_PORT:string,
|
40
|
+
// SOURCE_NODE_3_HOST:string,
|
41
|
+
// SOURCE_NODE_3_ID:string,
|
42
|
+
// SOURCE_NODE_3_PORT:string,
|
43
|
+
// }
|