From 04e7315d4d1b51af434b68e1269cb25a505b6e45 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 4 Aug 2021 22:24:06 +0200 Subject: linting --- packages/taler-wallet-cli/src/index.ts | 21 +++- packages/taler-wallet-cli/src/lint.ts | 169 +++++++++++++++++++++++++++------ 2 files changed, 154 insertions(+), 36 deletions(-) (limited to 'packages/taler-wallet-cli') diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts index 3afbc87e5..6bc4897fc 100644 --- a/packages/taler-wallet-cli/src/index.ts +++ b/packages/taler-wallet-cli/src/index.ts @@ -870,11 +870,22 @@ const deploymentCli = walletCli.subcommand("deploymentArgs", "deployment", { help: "Subcommands for handling GNU Taler deployments.", }); -deploymentCli.subcommand("lintExchange", "lint-exchange", { - help: "Run checks on the exchange deployment." -}).action(async (args) => { - await lintExchangeDeployment(); -}); +deploymentCli + .subcommand("lintExchange", "lint-exchange", { + help: "Run checks on the exchange deployment.", + }) + .flag("cont", ["--continue"], { + help: "Continue after errors if possible", + }) + .flag("debug", ["--debug"], { + help: "Output extra debug info", + }) + .action(async (args) => { + await lintExchangeDeployment( + args.lintExchange.debug, + args.lintExchange.cont, + ); + }); deploymentCli .subcommand("coincfg", "gen-coin-config", { diff --git a/packages/taler-wallet-cli/src/lint.ts b/packages/taler-wallet-cli/src/lint.ts index e716d053f..7f7cb2dc3 100644 --- a/packages/taler-wallet-cli/src/lint.ts +++ b/packages/taler-wallet-cli/src/lint.ts @@ -55,13 +55,31 @@ interface ShellResult { status: number; } +interface LintContext { + /** + * Be more verbose. + */ + verbose: boolean; + + /** + * Always continue even after errors. + */ + cont: boolean; + + cfg: Configuration; +} + /** * Run a shell command, return stdout. */ export async function sh( + context: LintContext, command: string, env: { [index: string]: string | undefined } = process.env, ): Promise { + if (context.verbose) { + console.log("executing command:", command); + } return new Promise((resolve, reject) => { const stdoutChunks: Buffer[] = []; const stderrChunks: Buffer[] = []; @@ -100,12 +118,14 @@ export async function sh( }); } -function checkBasicConf(cfg: Configuration): BasicConf { +function checkBasicConf(context: LintContext): BasicConf { + const cfg = context.cfg; const currencyEntry = cfg.getString("taler", "currency"); let mainCurrency: string | undefined; if (!currencyEntry.value) { console.log("error: currency not defined in section TALER option CURRENCY"); + console.log("Aborting further checks."); process.exit(1); } else { mainCurrency = currencyEntry.value.toUpperCase(); @@ -126,7 +146,8 @@ function checkBasicConf(cfg: Configuration): BasicConf { return { mainCurrency }; } -function checkCoinConfig(cfg: Configuration, basic: BasicConf): void { +function checkCoinConfig(context: LintContext, basic: BasicConf): void { + const cfg = context.cfg; const coinPrefix1 = "COIN_"; const coinPrefix2 = "COIN-"; let numCoins = 0; @@ -147,7 +168,8 @@ function checkCoinConfig(cfg: Configuration, basic: BasicConf): void { } } -async function checkWireConfig(cfg: Configuration): Promise { +async function checkWireConfig(context: LintContext): Promise { + const cfg = context.cfg; const accountPrefix = "EXCHANGE-ACCOUNT-"; const accountCredentialsPrefix = "EXCHANGE-ACCOUNTCREDENTIALS-"; @@ -174,50 +196,125 @@ async function checkWireConfig(cfg: Configuration): Promise { } } - const res = await sh( - "sudo -u taler-exchange-wirewatch taler-exchange-wirewatch -t", - ); - if (res.status != 0) { - console.log(res.stdout); - console.log(res.stderr); - console.log("error: Could not run aggregator. Please review logs above."); - process.exit(1); + for (const acc of accounts) { + // test debit history + { + const res = await sh( + context, + "su -l --shell /bin/sh " + + "-c 'taler-exchange-wire-gateway-client -s exchange-accountcredentials-${acc} --debit-history'" + + "taler-exchange-wire", + ); + if (res.status != 0) { + console.log(res.stdout); + console.log(res.stderr); + console.log( + "error: Could not run wirewatch. Please review logs above.", + ); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } + } + } + } + + // TWG client + { + const res = await sh( + context, + `su -l --shell /bin/sh -c 'taler-exchange-wirewatch -t' taler-exchange-wire`, + ); + if (res.status != 0) { + console.log(res.stdout); + console.log(res.stderr); + console.log("error: Could not run wirewatch. Please review logs above."); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } + } + } + + // Wirewatch + { + const res = await sh( + context, + `su -l --shell /bin/sh -c 'taler-exchange-wirewatch -t' taler-exchange-wire`, + ); + if (res.status != 0) { + console.log(res.stdout); + console.log(res.stderr); + console.log("error: Could not run wirewatch. Please review logs above."); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } + } } - // FIXME: run wirewatch in test mode here? - // FIXME: run transfer in test mode here? + // Closer + { + const res = await sh( + context, + `su -l --shell /bin/sh -c 'taler-exchange-closer -t' taler-exchange-closer`, + ); + if (res.status != 0) { + console.log(res.stdout); + console.log(res.stderr); + console.log("error: Could not run closer. Please review logs above."); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } + } + } } -async function checkAggregatorConfig(cfg: Configuration) { +async function checkAggregatorConfig(context: LintContext) { const res = await sh( - "sudo -u taler-exchange-aggregator taler-exchange-aggregator -t", + context, + "su -l --shell /bin/sh -c 'taler-exchange-aggregator -t' taler-exchange-aggregator", ); if (res.status != 0) { console.log(res.stdout); console.log(res.stderr); console.log("error: Could not run aggregator. Please review logs above."); - process.exit(1); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } } } -async function checkCloserConfig(cfg: Configuration) { - const res = await sh("sudo -u taler-exchange-close taler-exchange-closer -t"); +async function checkCloserConfig(context: LintContext) { + const res = await sh( + context, + `su -l --shell /bin/sh -c 'taler-exchange-closer -t' taler-exchange-closer`, + ); if (res.status != 0) { console.log(res.stdout); console.log(res.stderr); - console.log("error: Could not run aggregator. Please review logs above."); - process.exit(1); + console.log("error: Could not run closer. Please review logs above."); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } } } -function checkMasterPublicKeyConfig(cfg: Configuration): PubkeyConf { +function checkMasterPublicKeyConfig(context: LintContext): PubkeyConf { + const cfg = context.cfg; const pub = cfg.getString("exchange", "master_public_key"); const pubDecoded = decodeCrock(pub.required()); if (pubDecoded.length != 32) { console.log("error: invalid master public key"); - process.exit(1); + if (!context.cont) { + console.log("Aborting further checks."); + process.exit(1); + } } return { @@ -226,9 +323,10 @@ function checkMasterPublicKeyConfig(cfg: Configuration): PubkeyConf { } export async function checkExchangeHttpd( - cfg: Configuration, + context: LintContext, pubConf: PubkeyConf, ): Promise { + const cfg = context.cfg; const baseUrlEntry = cfg.getString("exchange", "base_url"); if (!baseUrlEntry.isDefined) { @@ -312,7 +410,10 @@ export async function checkExchangeHttpd( /** * Do some basic checks in the configuration of a Taler deployment. */ -export async function lintExchangeDeployment(): Promise { +export async function lintExchangeDeployment( + verbose: boolean, + cont: boolean, +): Promise { if (process.getuid() != 0) { console.log( "warning: the exchange deployment linter is designed to be run as root", @@ -321,17 +422,23 @@ export async function lintExchangeDeployment(): Promise { const cfg = Configuration.load(); - const basic = checkBasicConf(cfg); + const context: LintContext = { + cont, + verbose, + cfg, + }; + + const basic = checkBasicConf(context); - checkCoinConfig(cfg, basic); + checkCoinConfig(context, basic); - await checkWireConfig(cfg); + await checkWireConfig(context); - await checkAggregatorConfig(cfg); + await checkAggregatorConfig(context); - await checkCloserConfig(cfg); + await checkCloserConfig(context); - const pubConf = checkMasterPublicKeyConfig(cfg); + const pubConf = checkMasterPublicKeyConfig(context); - await checkExchangeHttpd(cfg, pubConf); + await checkExchangeHttpd(context, pubConf); } -- cgit v1.2.3