Skip to content

Commit

Permalink
refactor(core-snapshots-cli): replace commander.js with @oclif (#2050)
Browse files Browse the repository at this point in the history
  • Loading branch information
faustbrian committed Feb 1, 2019
1 parent 0652c09 commit d77b15a
Show file tree
Hide file tree
Showing 15 changed files with 443 additions and 175 deletions.
5 changes: 5 additions & 0 deletions packages/core-snapshots-cli/bin/run
@@ -0,0 +1,5 @@
#!/usr/bin/env node

require('@oclif/command').run()
.then(require('@oclif/command/flush'))
.catch(require('@oclif/errors/handle'))
3 changes: 3 additions & 0 deletions packages/core-snapshots-cli/bin/run.cmd
@@ -0,0 +1,3 @@
@echo off

node "%~dp0\run" %*
60 changes: 40 additions & 20 deletions packages/core-snapshots-cli/package.json
Expand Up @@ -8,49 +8,61 @@
"license": "MIT",
"main": "dist/index.js",
"files": [
"dist"
"/bin",
"/dist",
"/oclif.manifest.json"
],
"bin": {
"core:snapshot": "node ./dist/index.js"
"snapshot": "./bin/run"
},
"scripts": {
"snapshot": "./bin/run",
"prepublishOnly": "yarn test && yarn build",
"pretest": "yarn lint && yarn build",
"prepack": "oclif-dev manifest && npm shrinkwrap",
"postpack": "rm -f oclif.manifest.json",
"compile": "../../node_modules/typescript/bin/tsc",
"build": "yarn clean && yarn compile",
"build:watch": "yarn clean && yarn compile -w",
"clean": "del dist",
"docs": "../../node_modules/typedoc/bin/typedoc src --out docs",
"lint": "../../node_modules/tslint/bin/tslint -c ../../tslint.json 'src/**/*.ts' '__tests__/**/*.ts' --fix",
"start": "node ./dist/index.js",
"debug": "node --inspect-brk ./dist/index.js",
"create:mainnet": "node ./dist/index.js create --config ../core/src/config/mainnet --network mainnet",
"create:devnet": "node ./dist/index.js create --config ../core/src/config/devnet --network devnet",
"create:testnet": "node ./dist/index.js create --config ../core/src/config/testnet --network testnet",
"import:mainnet": "node ./dist/index.js import --config ../core/src/config/mainnet --network mainnet",
"import:devnet": "node ./dist/index.js import --config ../core/src/config/devnet --network devnet",
"import:testnet": "node ./dist/index.js import --config ../core/src/config/testnet --network testnet",
"verify:mainnet": "node ./dist/index.js verify --config ../core/src/config/mainnet --network mainnet",
"verify:devnet": "node ./dist/index.js verify --config ../core/src/config/devnet --network devnet",
"verify:testnet": "node ./dist/index.js verify --config ../core/src/config/testnet --network testnet",
"rollback:mainnet": "node ./dist/index.js rollback --config ../core/src/config/mainnet --network mainnet",
"rollback:devnet": "node ./dist/index.js rollback --config ../core/src/config/devnet --network devnet",
"rollback:testnet": "node ./dist/index.js rollback --config ../core/src/config/testnet --network testnet",
"truncate:mainnet": "node ./dist/index.js truncate --config ../core/src/config/mainnet --network mainnet",
"truncate:devnet": "node ./dist/index.js truncate --config ../core/src/config/devnet --network devnet",
"truncate:testnet": "node ./dist/index.js truncate --config ../core/src/config/testnet --network testnet",
"dump": "yarn snapshot dump",
"dump:mainnet": "yarn snapshot dump --network mainnet",
"dump:devnet": "yarn snapshot dump --network devnet",
"dump:testnet": "yarn snapshot dump --network testnet",
"restore": "yarn snapshot restore",
"restore:mainnet": "yarn snapshot restore --network mainnet",
"restore:devnet": "yarn snapshot restore --network devnet",
"restore:testnet": "yarn snapshot restore --network testnet",
"verify": "yarn snapshot verify",
"verify:mainnet": "yarn snapshot verify --network mainnet",
"verify:devnet": "yarn snapshot verify --network devnet",
"verify:testnet": "yarn snapshot verify --network testnet",
"rollback": "yarn snapshot rollback",
"rollback:mainnet": "yarn snapshot rollback --network mainnet",
"rollback:devnet": "yarn snapshot rollback --network devnet",
"rollback:testnet": "yarn snapshot rollback --network testnet",
"truncate": "yarn snapshot truncate",
"truncate:mainnet": "yarn snapshot truncate --network mainnet",
"truncate:devnet": "yarn snapshot truncate --network devnet",
"truncate:testnet": "yarn snapshot truncate --network testnet",
"updates": "../../node_modules/npm-check-updates/bin/npm-check-updates -a"
},
"dependencies": {
"@arkecosystem/core-interfaces": "^2.1.0",
"@arkecosystem/core-container": "^2.1.0",
"@arkecosystem/core-interfaces": "^2.1.0",
"@arkecosystem/core-snapshots": "^2.1.0",
"@oclif/command": "^1.5.8",
"@oclif/config": "^1.12.4",
"@oclif/plugin-help": "^2.1.6",
"@oclif/plugin-not-found": "^1.2.2",
"@types/boom": "^7.2.1",
"@types/cli-progress": "^1.8.0",
"@types/commander": "^2.12.2",
"@types/fs-extra": "^5.0.4",
"cli-progress": "^2.1.1",
"commander": "^2.19.0",
"fs-extra": "^7.0.1"
},
"publishConfig": {
Expand All @@ -61,5 +73,13 @@
},
"jest": {
"preset": "../../jest-preset.json"
},
"oclif": {
"commands": "./dist/commands",
"bin": "snapshot",
"plugins": [
"@oclif/plugin-help",
"@oclif/plugin-not-found"
]
}
}
25 changes: 25 additions & 0 deletions packages/core-snapshots-cli/src/commands/command.ts
@@ -0,0 +1,25 @@
import Command, { flags } from "@oclif/command";

export abstract class BaseCommand extends Command {
public static flags = {
data: flags.string({
description: "data directory",
}),
config: flags.string({
description: "network config",
}),
token: flags.string({
description: "token name",
default: "ark",
}),
network: flags.string({
description: "token network",
}),
skipCompression: flags.boolean({
description: "skip gzip compression",
}),
trace: flags.boolean({
description: "dumps generated queries and settings to console",
}),
};
}
16 changes: 0 additions & 16 deletions packages/core-snapshots-cli/src/commands/create.ts

This file was deleted.

38 changes: 38 additions & 0 deletions packages/core-snapshots-cli/src/commands/dump.ts
@@ -0,0 +1,38 @@
import { app } from "@arkecosystem/core-container";
import { Logger } from "@arkecosystem/core-interfaces";
import { SnapshotManager } from "@arkecosystem/core-snapshots";
import { flags } from "@oclif/command";
import fs from "fs-extra";
import { setUpLite } from "../utils";
import { BaseCommand } from "./command";

export class DumpCommand extends BaseCommand {
public static description: string = "create a full snapshot of the database";

public static flags = {
...BaseCommand.flags,
blocks: flags.string({
description: "blocks to append to, correlates to folder name",
}),
start: flags.integer({
description: "start network height to export",
default: -1,
}),
end: flags.integer({
description: "end network height to export",
default: -1,
}),
codec: flags.string({
description: "codec name, default is msg-lite binary",
}),
};

public async run(): Promise<void> {
// tslint:disable-next-line:no-shadowed-variable
const { flags } = this.parse(DumpCommand);

await setUpLite(flags);

await app.resolvePlugin<SnapshotManager>("snapshots").exportData(flags);
}
}
30 changes: 0 additions & 30 deletions packages/core-snapshots-cli/src/commands/import.ts

This file was deleted.

7 changes: 0 additions & 7 deletions packages/core-snapshots-cli/src/commands/index.ts

This file was deleted.

61 changes: 61 additions & 0 deletions packages/core-snapshots-cli/src/commands/restore.ts
@@ -0,0 +1,61 @@
import { app } from "@arkecosystem/core-container";
import { EventEmitter } from "@arkecosystem/core-interfaces";
import { SnapshotManager } from "@arkecosystem/core-snapshots";
import { flags } from "@oclif/command";
import _cliProgress from "cli-progress";
import { setUpLite } from "../utils";
import { BaseCommand } from "./command";

export class RestoreCommand extends BaseCommand {
public static description: string = "import data from specified snapshot";

public static flags = {
...BaseCommand.flags,
blocks: flags.string({
description: "blocks to import, corelates to folder name",
required: true,
}),
codec: flags.string({
description: "codec name, default is msg-lite binary",
}),
truncate: flags.boolean({
description: "empty all tables before running import",
}),
skipRestartRound: flags.boolean({
description: "skip revert to current round",
}),
signatureVerify: flags.boolean({
description: "signature verification",
}),
};

public async run(): Promise<void> {
// tslint:disable-next-line:no-shadowed-variable
const { flags } = this.parse(RestoreCommand);

await setUpLite(flags);

const emitter = app.resolvePlugin<EventEmitter.EventEmitter>("event-emitter");

const progressBar = new _cliProgress.Bar(
{
format: "{bar} {percentage}% | ETA: {eta}s | {value}/{total} | Duration: {duration}s",
},
_cliProgress.Presets.shades_classic,
);

emitter.on("start", data => {
progressBar.start(data.count, 1);
});

emitter.on("progress", data => {
progressBar.update(data.value);
});

emitter.on("complete", data => {
progressBar.stop();
});

await app.resolvePlugin<SnapshotManager>("snapshots").importData(flags);
}
}
38 changes: 28 additions & 10 deletions packages/core-snapshots-cli/src/commands/rollback.ts
@@ -1,17 +1,35 @@
import { app } from "@arkecosystem/core-container";
import { Logger } from "@arkecosystem/core-interfaces";
import { SnapshotManager } from "@arkecosystem/core-snapshots";
import { flags } from "@oclif/command";
import { setUpLite } from "../utils";
import { BaseCommand } from "./command";

export async function rollbackSnapshot(options) {
const logger = app.resolvePlugin<Logger.ILogger>("logger");
const snapshotManager = app.resolvePlugin<SnapshotManager>("snapshots");
export class RollbackCommand extends BaseCommand {
public static description: string = "rollback chain to specified height";

if (options.blockHeight === -1) {
logger.warn("Rollback height is not specified. Rolling back to last completed round.");
}
logger.info(
`Starting the process of blockchain rollback to block height of ${options.blockHeight.toLocaleString()}`,
);
public static flags = {
...BaseCommand.flags,
height: flags.integer({
description: "block network height number to rollback",
default: -1,
}),
};

public async run(): Promise<void> {
// tslint:disable-next-line:no-shadowed-variable
const { flags } = this.parse(RollbackCommand);

await setUpLite(flags);

const logger = app.resolvePlugin<Logger.ILogger>("logger");

await snapshotManager.rollbackChain(options.blockHeight);
if (flags.height === -1) {
logger.warn("Rollback height is not specified. Rolling back to last completed round.");
}

logger.info(`Starting the process of blockchain rollback to block height of ${flags.height.toLocaleString()}`);

await app.resolvePlugin<SnapshotManager>("snapshots").rollbackChain(flags.height);
}
}
16 changes: 13 additions & 3 deletions packages/core-snapshots-cli/src/commands/truncate.ts
@@ -1,7 +1,17 @@
import { app } from "@arkecosystem/core-container";
import { SnapshotManager } from "@arkecosystem/core-snapshots";
import { setUpLite } from "../utils";
import { BaseCommand } from "./command";

export async function truncateSnapshot(options) {
const snapshotManager = app.resolvePlugin<SnapshotManager>("snapshots");
await snapshotManager.truncateChain();
export class TruncateCommand extends BaseCommand {
public static description: string = "truncate blockchain database";

public async run(): Promise<void> {
// tslint:disable-next-line:no-shadowed-variable
const { flags } = this.parse(TruncateCommand);

await setUpLite(flags);

await app.resolvePlugin<SnapshotManager>("snapshots").truncateChain();
}
}
33 changes: 25 additions & 8 deletions packages/core-snapshots-cli/src/commands/verify.ts
@@ -1,16 +1,33 @@
import { app } from "@arkecosystem/core-container";
import { Logger } from "@arkecosystem/core-interfaces";
import { SnapshotManager } from "@arkecosystem/core-snapshots";
import { flags } from "@oclif/command";
import fs from "fs-extra";
import { setUpLite } from "../utils";
import { BaseCommand } from "./command";

export async function verifySnapshot(options) {
const logger = app.resolvePlugin<Logger.ILogger>("logger");
const snapshotManager = app.resolvePlugin<SnapshotManager>("snapshots");
export class VerifyCommand extends BaseCommand {
public static description: string = "check validity of specified snapshot";

if (options.filename && !fs.existsSync(`${process.env.CORE_PATH_DATA}/snapshots/${options.filename}`)) {
logger.error(`Verify not possible. Snapshot ${options.filename} not found.`);
logger.info("Use -f parameter with just the filename and not the full path.");
} else {
await snapshotManager.verifyData(options);
public static flags = {
...BaseCommand.flags,
blocks: flags.string({
description: "blocks to verify, corelates to folder name",
}),
codec: flags.string({
description: "codec name, default is msg-lite binary",
}),
signatureVerify: flags.boolean({
description: "signature verification",
}),
};

public async run(): Promise<void> {
// tslint:disable-next-line:no-shadowed-variable
const { flags } = this.parse(VerifyCommand);

await setUpLite(flags);

await app.resolvePlugin<SnapshotManager>("snapshots").verifyData(flags);
}
}

0 comments on commit d77b15a

Please sign in to comment.