sync

Backup service to store encrypted wallet databases (experimental)
Log | Files | Refs | Submodules | README | LICENSE

sync-dbconfig (3724B)


      1 #!/bin/bash
      2 # This file is part of GNU TALER.
      3 # Copyright (C) 2023 Taler Systems SA
      4 #
      5 # TALER is free software; you can redistribute it and/or modify it under the
      6 # terms of the GNU Lesser General Public License as published by the Free Software
      7 # Foundation; either version 2.1, or (at your option) any later version.
      8 #
      9 # TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     10 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11 # A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
     12 #
     13 # You should have received a copy of the GNU Lesser General Public License along with
     14 # TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15 #
     16 # @author Christian Grothoff
     17 #
     18 #
     19 # Error checking on
     20 set -eu
     21 
     22 RESET_DB=0
     23 SKIP_DBINIT=0
     24 DBUSER="sync-httpd"
     25 CFGFILE="/etc/sync/sync.conf"
     26 
     27 # Parse command-line options
     28 while getopts 'c:hrsu:' OPTION; do
     29     case "$OPTION" in
     30         c)
     31             CFGFILE="$OPTARG"
     32             ;;
     33         h)
     34             echo 'Supported options:'
     35             echo "  -c FILENAME  -- write configuration to FILENAME (default: $CFGFILE)"
     36             echo "  -h           -- print this help text"
     37             echo "  -r           -- reset database (dangerous)"
     38             echo "  -s           -- skip database initialization"
     39             echo "  -u USER      -- sync-httpd to be run by USER (default: $DBUSER)"
     40             exit 0
     41             ;;
     42         r)
     43             RESET_DB="1"
     44             ;;
     45         s)
     46             SKIP_DBINIT="1"
     47             ;;
     48         u)
     49             DBUSER="$OPTARG"
     50             ;;
     51         ?)
     52         echo "Unrecognized command line option '$OPTION'" 1>&2
     53         exit 1
     54         ;;
     55     esac
     56 done
     57 
     58 if ! id postgres > /dev/null
     59 then
     60     echo "Could not find 'postgres' user. Please install Postgresql first"
     61     exit 1
     62 fi
     63 
     64 if [ "$(id -u)" -ne 0 ]
     65 then
     66     echo "This script must be run as root"
     67     exit 1
     68 fi
     69 
     70 if [ 0 = "$SKIP_DBINIT" ]
     71 then
     72     if ! sync-dbinit -v 2> /dev/null
     73     then
     74         echo "Required 'sync-dbinit' not found. Please fix your installation."
     75 	exit 1
     76     fi
     77     DBINIT=$(which sync-dbinit)
     78 fi
     79 
     80 if ! id "$DBUSER" > /dev/null
     81 then
     82     echo "Could not find '$DBUSER' user. Please set it up first"
     83     exit 1
     84 fi
     85 
     86 echo "Setting up database user $DBUSER." 1>&2
     87 
     88 if ! sudo -i -u postgres createuser "$DBUSER" 2> /dev/null
     89 then
     90     echo "Database user '$DBUSER' already existed. Continuing anyway." 1>&2
     91 fi
     92 
     93 DBPATH=$(sync-config \
     94              -c "$CFGFILE" \
     95              -s syncdb-postgres \
     96              -o CONFIG)
     97 
     98 if ! echo "$DBPATH" | grep "postgres://" > /dev/null
     99 then
    100     echo "Invalid database configuration value '$DBPATH'." 1>&2
    101     exit 1
    102 fi
    103 
    104 DBNAME=$(echo "$DBPATH" \
    105          | sed \
    106              -e "s/postgres:\/\/.*\///" \
    107              -e "s/?.*//")
    108 
    109 if sudo -i -u postgres psql "$DBNAME" < /dev/null 2> /dev/null
    110 then
    111     if [ 1 = "$RESET_DB" ]
    112     then
    113         echo "Deleting existing database $DBNAME." 1>&2
    114         if ! sudo -i -u postgres dropdb "$DBNAME"
    115 	then
    116             echo "Failed to delete existing database '$DBNAME'"
    117             exit 1
    118 	fi
    119 	DO_CREATE=1
    120     else
    121         echo "Database '$DBNAME' already exists, continuing anyway."
    122 	DO_CREATE=0
    123     fi
    124 else
    125     DO_CREATE=1
    126 fi
    127 
    128 if [1 = "$DO_CREATE" ]
    129 then
    130     echo "Creating database $DBNAME." 1>&2
    131 
    132     if ! sudo -i -u postgres createdb -O "$DBUSER" "$DBNAME"
    133     then
    134 	echo "Failed to create database '$DBNAME'"
    135 	exit 1
    136     fi
    137 fi
    138 
    139 if [ 0 = "$SKIP_DBINIT" ]
    140 then
    141     echo "Initializing database $DBNAME." 1>&2
    142     if ! sudo -u "$DBUSER" "$DBINIT" -c "$CFGFILE"
    143     then
    144         echo "Failed to initialize database schema"
    145         exit 1
    146     fi
    147 fi
    148 
    149 echo "Database configuration finished." 1>&2
    150 
    151 exit 0