aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-08-02 15:20:00 +0200
committerFlorian Dold <florian@dold.me>2021-08-02 15:20:00 +0200
commitfc2be33e32cd858cfaaa2e0faf386f507b8c4857 (patch)
tree86a5fb66add5c5261205079377d3e9bf0e542013
parenta8a4f76ed8be3e6173e7bc9c586f66ed70a6acf4 (diff)
deployment helpers
-rw-r--r--packages/taler-util/src/talerconfig.ts20
-rw-r--r--packages/taler-wallet-cli/src/index.ts44
2 files changed, 54 insertions, 10 deletions
diff --git a/packages/taler-util/src/talerconfig.ts b/packages/taler-util/src/talerconfig.ts
index a40d6a126..624d4ff3d 100644
--- a/packages/taler-util/src/talerconfig.ts
+++ b/packages/taler-util/src/talerconfig.ts
@@ -98,37 +98,37 @@ export class ConfigValue<T> {
constructor(
private sectionName: string,
private optionName: string,
- private val: string | undefined,
+ public value: string | undefined,
private converter: (x: string) => T,
) {}
required(): T {
- if (!this.val) {
+ if (!this.value) {
throw new ConfigError(
`required option [${this.sectionName}]/${this.optionName} not found`,
);
}
- return this.converter(this.val);
+ return this.converter(this.value);
}
orUndefined(): T | undefined {
- if (this.val !== undefined) {
- return this.converter(this.val);
+ if (this.value !== undefined) {
+ return this.converter(this.value);
} else {
return undefined;
}
}
orDefault(v: T): T | undefined {
- if (this.val !== undefined) {
- return this.converter(this.val);
+ if (this.value !== undefined) {
+ return this.converter(this.value);
} else {
return v;
}
}
isDefined(): boolean {
- return this.val !== undefined;
+ return this.value !== undefined;
}
}
@@ -303,7 +303,7 @@ export class Configuration {
private nestLevel = 0;
- loadFromFilename(filename: string, opts: LoadOptions = {}): void {
+ private loadFromFilename(filename: string, opts: LoadOptions = {}): void {
filename = expandPath(filename);
const checkCycle = () => {
@@ -339,7 +339,7 @@ export class Configuration {
}
}
- loadGlob(parentFilename: string, fileglob: string): void {
+ private loadGlob(parentFilename: string, fileglob: string): void {
const resolvedParent = nodejs_fs().realpathSync(parentFilename);
const parentDir = nodejs_path().dirname(resolvedParent);
diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts
index b7bcbd875..26ee95661 100644
--- a/packages/taler-wallet-cli/src/index.ts
+++ b/packages/taler-wallet-cli/src/index.ts
@@ -55,6 +55,7 @@ import {
WalletCoreApiClient,
Wallet,
} from "@gnu-taler/taler-wallet-core";
+import { lintDeployment } from "./lint.js";
// This module also serves as the entry point for the crypto
// thread worker, and thus must expose these two handlers.
@@ -869,6 +870,49 @@ const deploymentCli = walletCli.subcommand("deploymentArgs", "deployment", {
help: "Subcommands for handling GNU Taler deployments.",
});
+deploymentCli.subcommand("lint", "lint").action(async (args) => {
+ lintDeployment();
+});
+
+deploymentCli
+ .subcommand("coincfg", "gen-coin-config", {
+ help: "Generate a coin/denomination configuration for the exchange.",
+ })
+ .requiredOption("currency", ["--currency"], clk.STRING, {
+ help: "Currency to use",
+ })
+ .action(async (args) => {
+ let out = "";
+ const currency = args.coincfg.currency;
+
+ const min = Amounts.parseOrThrow(`${currency}:0.01`);
+ const max = Amounts.parseOrThrow(`${currency}:100`);
+ let x = min;
+ let n = 1;
+
+ out += "# Coin configuration for the exchange.\n";
+ out += '# Should be placed in "/etc/taler/conf.d/exchange-coins.conf".\n';
+ out += "\n";
+
+ while (Amounts.cmp(x, max) < 0) {
+ out += `[COIN_${currency}_${n}]\n`;
+ out += `VALUE = ${Amounts.stringify(x)}\n`;
+ out += `DURATION_WITHDRAW = 7 days\n`;
+ out += `DURATION_SPEND = 2 years\n`;
+ out += `DURATION_LEGAL = 6 years\n`;
+ out += `FEE_WITHDRAW = ${currency}:0\n`;
+ out += `FEE_DEPOSIT = ${currency}:0\n`;
+ out += `FEE_REFRESH = ${currency}:0\n`;
+ out += `FEE_REFUND = ${currency}:0\n`;
+ out += `RSA_KEYSIZE = 2048\n`;
+ out += "\n";
+ x = Amounts.add(x, x).amount;
+ n++;
+ }
+
+ console.log(out);
+ });
+
const deploymentConfigCli = deploymentCli.subcommand("configArgs", "config", {
help: "Subcommands the Taler configuration.",
});