libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit bc2a9e1c3155f7bf7b11341a9cd7b185ed971001
parent b3ccaf4a9f35cebe141dcd951f01a31c0c04087d
Author: Antoine A <>
Date:   Sat,  6 Dec 2025 13:08:27 +0100

ebisync: add dbconfig

Diffstat:
MMakefile | 1+
Acontrib/libeufin-ebisync-dbconfig | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdebian/libeufin-nexus.install | 1+
Mlibeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/Main.kt | 4++--
Mlibeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/cli/LibeufinEbisync.kt | 2+-
Rlibeufin-ebisync/src/main/kotlin/tech/libeufin/constants.kt -> libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/constants.kt | 0
Mtestbench/src/main/kotlin/Main.kt | 4++--
Mtestbench/src/test/kotlin/CliTest.kt | 4++--
8 files changed, 140 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile @@ -54,6 +54,7 @@ install-nobuild-files: install -m 644 -D -t $(share_dir)/libeufin-ebisync/sql database-versioning/versioning.sql install -m 644 -D -t $(share_dir)/libeufin-ebisync/sql database-versioning/libeufin-ebisync*.sql install -D -t $(bin_dir) contrib/libeufin-dbconfig + install -D -t $(bin_dir) contrib/libeufin-ebisync-dbconfig install -D -t $(bin_dir) contrib/libeufin-tan-*.sh .PHONY: install diff --git a/contrib/libeufin-ebisync-dbconfig b/contrib/libeufin-ebisync-dbconfig @@ -0,0 +1,131 @@ +#!/bin/bash +# This file is part of GNU TALER. +# Copyright (C) 2025 Taler Systems SA +# +# TALER is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 2.1, or (at your option) any later version. +# +# TALER is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along with +# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + +# Error checking on +set -eu + +# 1 is true, 0 is false +RESET_DB=0 +FORCE_PERMS=0 +SKIP_INIT=0 +DBUSER="libeufin-ebisync" +CFGFILE="/etc/libeufin/libeufin-ebisync.conf" + +function exit_fail() { + echo "$@" >&2 + exit 1 +} + + +# Parse command-line options +while getopts 'c:g:hprsu:' OPTION; do + case "$OPTION" in + c) + CFGFILE="$OPTARG" + ;; + g) + DBGROUP="$OPTARG" + ;; + h) + echo 'Supported options:' + echo " -c FILENAME -- use configuration FILENAME (default: $CFGFILE)" + echo " -h -- print this help text" + echo " -r -- reset database (dangerous)" + echo " -p -- force permission setup even without database initialization" + echo " -s -- skip database initialization" + echo " -u USER -- libeufin-ebisync to be run by USER (default: $DBUSER)" + exit 0 + ;; + p) + FORCE_PERMS="1" + ;; + r) + RESET_DB="1" + ;; + s) + SKIP_INIT="1" + ;; + u) + DBUSER="$OPTARG" + ;; + ?) + echo "Unrecognized command line option '$OPTION'" 1 &>2 + exit 1 + ;; + esac +done + +if ! id postgres >/dev/null; then + exit_fail "Could not find 'postgres' user. Please install Postgresql first" +fi + +if ! libeufin-ebisync --version 2>/dev/null; then + exit_fail "Required 'libeufin-ebisync' not found. Please fix your installation." +fi + +if [ "$(id -u)" -ne 0 ]; then + exit_fail "This script must be run as root" +fi + +# Check OS users exist +if ! id "$DBUSER" >/dev/null; then + exit_fail "Could not find '$DBUSER' user. Please set it up first" +fi + +# Create DB user matching OS user name +echo "Setting up database user '$DBUSER'." 1>&2 +if ! sudo -i -u postgres createuser "$DBUSER" 2>/dev/null; then + echo "Database user '$DBUSER' already existed. Continuing anyway." 1>&2 +fi + +# Check database name +DBPATH=$(libeufin-ebisync -c "$CFGFILE" config get ebisyncdb-postgres CONFIG) +if ! echo "$DBPATH" | grep "postgres://" >/dev/null; then + exit_fail "Invalid database configuration value '$DBPATH'." 1>&2 +fi +DBNAME=$(echo "$DBPATH" | sed -e "s/postgres:\/\/.*\///" -e "s/?.*//") + +if sudo -i -u postgres psql "$DBNAME" </dev/null 2>/dev/null; then + if [ 1 = "$RESET_DB" ]; then + echo "Deleting existing database '$DBNAME'." 1>&2 + if ! sudo -i -u postgres dropdb "$DBNAME"; then + exit_fail "Failed to delete existing database '$DBNAME'" + fi + DO_CREATE=1 + else + echo "Database '$DBNAME' already exists, continuing anyway." + DO_CREATE=0 + fi +else + DO_CREATE=1 +fi + +# Create database +if [ 1 = "$DO_CREATE" ]; then + echo "Creating database '$DBNAME'." 1>&2 + if ! sudo -i -u postgres createdb -O "$DBUSER" "$DBNAME"; then + exit_fail "Failed to create database '$DBNAME'" + fi +fi + +# Run dbinit +if [ 0 = "$SKIP_INIT" ]; then + echo "Initialize database schema" + if ! sudo -u "$DBUSER" libeufin-ebisync dbinit -c "$CFGFILE"; then + exit_fail "Failed to initialize database schema" + fi +fi + +echo "Database configuration finished." 1>&2 diff --git a/debian/libeufin-nexus.install b/debian/libeufin-nexus.install @@ -2,6 +2,7 @@ debian/etc/libeufin/libeufin-nexus.conf etc/libeufin/ libeufin-nexus/build/install/libeufin-nexus-shadow/bin/libeufin-nexus usr/bin/ contrib/libeufin-nexus-dbinit usr/bin/ +contrib/libeufin-ebisync-dbconfig usr/bin/ database-versioning/libeufin-nexus*.sql usr/share/libeufin/sql/ diff --git a/libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/Main.kt b/libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/Main.kt @@ -29,7 +29,7 @@ import io.ktor.http.* import io.ktor.util.* import tech.libeufin.common.setupSecurityProperties import tech.libeufin.ebics.httpClient -import tech.libeufin.ebisync.cli.LibeufinEbiSync +import tech.libeufin.ebisync.cli.LibeufinEbisync import java.security.Key import java.time.* import java.time.format.DateTimeFormatter @@ -45,7 +45,7 @@ import kotlinx.serialization.Contextual fun main(args: Array<String>) { setupSecurityProperties() setupSecurityProperties() - LibeufinEbiSync().main(args) + LibeufinEbisync().main(args) } @Serializable diff --git a/libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/cli/LibeufinEbisync.kt b/libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/cli/LibeufinEbisync.kt @@ -44,7 +44,7 @@ abstract class EbicsCmd(name: String? = null): TalerCmd(name) { } -class LibeufinEbiSync : CliktCommand() { +class LibeufinEbisync : CliktCommand() { init { versionOption(VERSION) subcommands(DbInit(), Setup(), Fetch(), CliConfigCmd(EBISYNC_CONFIG_SOURCE)) diff --git a/libeufin-ebisync/src/main/kotlin/tech/libeufin/constants.kt b/libeufin-ebisync/src/main/kotlin/tech/libeufin/ebisync/constants.kt diff --git a/testbench/src/main/kotlin/Main.kt b/testbench/src/main/kotlin/Main.kt @@ -34,7 +34,7 @@ import kotlinx.serialization.Serializable import tech.libeufin.common.* import tech.libeufin.nexus.* import tech.libeufin.nexus.cli.LibeufinNexus -import tech.libeufin.ebisync.cli.LibeufinEbiSync +import tech.libeufin.ebisync.cli.LibeufinEbisync import tech.libeufin.ebics.* import java.time.Instant import kotlin.io.path.* @@ -45,7 +45,7 @@ import org.jline.reader.impl.history.* enum class Component { Nexus, Ebisync } val nexusCmd = LibeufinNexus() -val ebisyncCmd = LibeufinEbiSync() +val ebisyncCmd = LibeufinEbisync() val client = HttpClient(CIO) var thread: Thread? = null diff --git a/testbench/src/test/kotlin/CliTest.kt b/testbench/src/test/kotlin/CliTest.kt @@ -24,7 +24,7 @@ import tech.libeufin.common.asUtf8 import tech.libeufin.nexus.* import tech.libeufin.ebics.* import tech.libeufin.nexus.cli.LibeufinNexus -import tech.libeufin.ebisync.cli.LibeufinEbiSync +import tech.libeufin.ebisync.cli.LibeufinEbisync import java.io.ByteArrayOutputStream import java.io.PrintStream import kotlin.io.path.* @@ -32,7 +32,7 @@ import kotlin.test.Test import kotlin.test.assertEquals val nexusCmd = LibeufinNexus() -val ebisyncCmd = LibeufinEbiSync() +val ebisyncCmd = LibeufinEbisync() fun CliktCommand.testErr(cmd: String, msg: String) { val prevOut = System.err