1
0
mirror of https://git.openwrt.org/feed/packages.git synced 2024-06-15 03:43:53 +02:00

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>
This commit is contained in:
Daniel Golle 2021-08-11 00:48:15 +01:00
parent 05a198ed48
commit f518cfb250
No known key found for this signature in database
GPG Key ID: 5A8F39C31C3217CA
3 changed files with 64 additions and 34 deletions

View File

@ -70,7 +70,7 @@ endef
define Package/pgsql-server define Package/pgsql-server
SECTION:=utils SECTION:=utils
CATEGORY:=Utilities CATEGORY:=Utilities
DEPENDS:=+pgsql-cli DEPENDS:=+pgsql-cli +blockd
TITLE:=PostgreSQL databases Server TITLE:=PostgreSQL databases Server
URL:=http://www.postgresql.org/ URL:=http://www.postgresql.org/
SUBMENU:=Database SUBMENU:=Database

View File

@ -32,40 +32,57 @@ start_service() {
user_exists postgres 5432 || user_add postgres 5432 user_exists postgres 5432 || user_add postgres 5432
group_exists postgres 5432 || group_add postgres 5432 group_exists postgres 5432 || group_add postgres 5432
[ "$_BOOT" = "1" ] &&
[ "$(procd_get_mountpoints $pgdata)" ] && return 0
fix_perms fix_perms
fix_hosts fix_hosts
if [ ! -d "${pgdata}" ]; then if [ ! -e "${pgdata}/PG_VERSION" ]; then
pg_init_data ${pgdata} pg_init_data ${pgdata}
[ $? -gt 0 ] && return 1 [ $? -gt 0 ] && return 1
fi fi
cleanup "${pgdata}" cleanup "${pgdata}"
procd_open_instance mkdir -m 0755 -p /var/run/postgresql
chmod 0750 /var/run/postgresql
chown postgres:postgres /var/run/postgresql
procd_open_instance postmaster
procd_set_param user postgres procd_set_param user postgres
procd_set_param command $PROG procd_set_param command $PROG
procd_append_param command -D "${pgdata}" procd_append_param command -D "${pgdata}"
procd_append_param command -k "/var/run/postgresql"
[ -n "${pgopts}" ] && procd_append_param command -o "${pgopts}" [ -n "${pgopts}" ] && procd_append_param command -o "${pgopts}"
procd_set_param respawn retry=60 procd_set_param respawn retry=60
procd_add_jail postgresql log
procd_add_jail_mount /usr/lib/postgresql /usr/share/postgresql
procd_add_jail_mount_rw /var/run/postgresql "${pgdata}"
procd_add_jail_mount_rw /dev/shm
procd_set_param stderr 1
procd_set_param stdout 1
procd_close_instance procd_close_instance
procd_open_instance procd_open_instance uci_dbinit
procd_set_param user postgres procd_set_param user postgres
procd_set_param command /lib/functions/postgresql.sh init "${pgdata}" procd_set_param command /lib/functions/postgresql.sh init "${pgdata}"
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance procd_close_instance
} }
reload_service() { boot() {
_BOOT=1 start
}
service_triggers() {
config_load "postgresql" config_load "postgresql"
config_get pgdata config PGDATA config_get pgdata config PGDATA
/usr/bin/pg_ctl reload -U postgres -D "${pgdata}" -s procd_add_restart_mount_trigger "${pgdata}"
} }
stop_service() { stop_service() {
config_load "postgresql" procd_send_signal "postgresql" postmaster SIGTERM
config_get pgdata config PGDATA
/usr/bin/pg_ctl stop -U postgres -D "${pgdata}" -s
} }
status_service() { status_service() {

View File

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