1
0
mirror of https://git.openwrt.org/feed/packages.git synced 2024-06-15 11:53:59 +02:00
openwrt-packages/libs/postgresql/files/postgresql.sh
Daniel Golle f518cfb250
postgresql: improve init script
Use newly introduced procd_add_restart_mount_trigger to make sure
postmaster gets started only once PGDATA becomes available.
Relocate socket directory to /var/lib/postgresql to make it possible
to run postgresql inside a ujail.
Use signal for shutdown, so it works nicely with jail.
Allow multiple script in UCI 'config postgres-db' to be a list and
run them in order listed.
User more silent methods to check for db or role existence and make
it easy to create several databases owned by the same user by passing
the same credentials multiple times.
Remove disfunctional reload handler.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2021-08-12 03:11:09 +01:00

100 lines
2.3 KiB
Bash

#!/bin/sh
PSQL="/usr/bin/psql"
free_megs() {
fsdir=$1
while [ ! -d "$fsdir" ]; do
fsdir="$(dirname "$fsdir")"
done
df -m $fsdir | while read fs bl us av cap mnt; do [ "$av" = "Available" ] || echo $av; done
}
pg_init_data() {
# make sure we got at least 50MB of free space
[ $(free_megs "$1") -lt 50 ] && return 1
pg_ctl initdb -U postgres -D "$1"
}
pg_server_ready() {
t=0
while [ $t -le 90 ]; do
psql -h /var/run/postgresql/ -U postgres -c "\q" 1>/dev/null 2>/dev/null && return 0
t=$((t+1))
sleep 1
done
return 1
}
pg_test_db() {
echo "SELECT datname FROM pg_catalog.pg_database WHERE datname = '$1';" |
$PSQL -h /var/run/postgresql -w -U "postgres" -d "template1" -q |
grep -q "0 rows" && return 1
return 0
}
pg_include_sql() {
if [ "$3" ]; then
env PGPASSWORD="$3" $PSQL -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4"
return $?
else
$PSQL -w -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4"
return $?
fi
}
# $1: dbname, $2: username, $3: password, $4: sql populate script
pg_require_db() {
local ret
local dbname="$1"
local dbuser="$2"
local dbpass="$3"
local exuser
pg_test_db $@ && return 0
shift ; shift ; shift
echo "CREATE DATABASE $dbname;" |
$PSQL -h /var/run/postgresql -U postgres -d template1 -e || return $?
if [ "$dbuser" ]; then
echo "SELECT usename FROM pg_catalog.pg_user WHERE usename = '$dbuser';" |
$PSQL -h /var/run/postgresql -U postgres -d template1 -e | grep -q "0 rows" &&
( echo -n "CREATE USER $dbuser"
[ "$dbpass" ] && echo -n " WITH PASSWORD '$dbpass'"
echo " NOCREATEDB NOSUPERUSER NOCREATEROLE NOINHERIT;" ) |
$PSQL -h /var/run/postgresql -U postgres -d template1 -e
echo "GRANT ALL PRIVILEGES ON DATABASE \"$dbname\" TO $dbuser;" |
$PSQL -h /var/run/postgresql -U postgres -d template1 -e
fi
while [ "$1" ]; do
pg_include_sql "$dbname" "$dbuser" "$dbpass" "$1"
ret=$?
[ $ret != 0 ] && break
shift
done
return $ret
}
uci_require_db() {
local dbname dbuser dbpass dbscript
config_get dbname $1 name
config_get dbuser $1 user
config_get dbpass $1 pass
config_get dbscript $1 script
pg_require_db "$dbname" "$dbuser" "$dbpass" $dbscript
}
[ "$1" = "init" ] && {
. /lib/functions.sh
pg_server_ready $2 || exit 1
config_load postgresql
config_foreach uci_require_db postgres-db
}