aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-core/src/cli.ts
diff options
context:
space:
mode:
authorBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
committerBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
commit98064f0652d8e1dff661e3bb0d8791f4af04ad6f (patch)
tree5d278fd1fab17b0c4b03cc89bcea678edd3789d3 /packages/anastasis-core/src/cli.ts
parent8d9386ac008e9d095867433bfc789d09bd93414d (diff)
parent842cc327541ebcfc761208f42bf5f74e22c6283c (diff)
added some logging messages
Diffstat (limited to 'packages/anastasis-core/src/cli.ts')
-rw-r--r--packages/anastasis-core/src/cli.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/anastasis-core/src/cli.ts b/packages/anastasis-core/src/cli.ts
new file mode 100644
index 000000000..517f2876d
--- /dev/null
+++ b/packages/anastasis-core/src/cli.ts
@@ -0,0 +1,64 @@
+import { clk } from "@gnu-taler/taler-util";
+import {
+ getBackupStartState,
+ getRecoveryStartState,
+ reduceAction,
+} from "./index.js";
+import fs from "fs";
+
+export const reducerCli = clk
+ .program("reducer", {
+ help: "Command line interface for Anastasis.",
+ })
+ .flag("initBackup", ["-b", "--backup"])
+ .flag("initRecovery", ["-r", "--restore"])
+ .maybeOption("argumentsJson", ["-a", "--arguments"], clk.STRING)
+ .maybeArgument("action", clk.STRING)
+ .maybeArgument("stateFile", clk.STRING);
+
+async function read(stream: NodeJS.ReadStream): Promise<string> {
+ const chunks = [];
+ for await (const chunk of stream) {
+ chunks.push(chunk);
+ }
+ return Buffer.concat(chunks).toString("utf8");
+}
+
+reducerCli.action(async (x) => {
+ if (x.reducer.initBackup) {
+ console.log(JSON.stringify(await getBackupStartState()));
+ return;
+ } else if (x.reducer.initRecovery) {
+ console.log(JSON.stringify(await getRecoveryStartState()));
+ return;
+ }
+
+ const action = x.reducer.action;
+ if (!action) {
+ console.log("action required");
+ return;
+ }
+
+ let lastState: any;
+ if (x.reducer.stateFile) {
+ const s = fs.readFileSync(x.reducer.stateFile, { encoding: "utf-8" });
+ lastState = JSON.parse(s);
+ } else {
+ const s = await read(process.stdin);
+ lastState = JSON.parse(s);
+ }
+
+ let args: any;
+ if (x.reducer.argumentsJson) {
+ args = JSON.parse(x.reducer.argumentsJson);
+ } else {
+ args = {};
+ }
+
+ const nextState = await reduceAction(lastState, action, args);
+ console.log(JSON.stringify(nextState));
+});
+
+export function reducerCliMain() {
+ reducerCli.run();
+}