commit bc2a9e1c3155f7bf7b11341a9cd7b185ed971001
parent b3ccaf4a9f35cebe141dcd951f01a31c0c04087d
Author: Antoine A <>
Date: Sat, 6 Dec 2025 13:08:27 +0100
ebisync: add dbconfig
Diffstat:
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