aboutsummaryrefslogtreecommitdiffstats
path: root/main/postgresql/postgresql.initd
diff options
context:
space:
mode:
Diffstat (limited to 'main/postgresql/postgresql.initd')
-rw-r--r--main/postgresql/postgresql.initd269
1 files changed, 161 insertions, 108 deletions
diff --git a/main/postgresql/postgresql.initd b/main/postgresql/postgresql.initd
index b89fe9c78d..63b4f0c522 100644
--- a/main/postgresql/postgresql.initd
+++ b/main/postgresql/postgresql.initd
@@ -1,152 +1,205 @@
#!/sbin/openrc-run
-# Copyright 1999-2008 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/files/postgresql.init-8.3,v 1.4 2008/09/28 22:53:02 caleb Exp $
-# Modifications to support Alpine Linux pg-restore
extra_started_commands="reload"
+description_reload="Reload configuration"
+
extra_stopped_commands="setup"
+description_setup="Initialize a new PostgreSQL cluster"
+
+# Note: Uppercase variables are here for backward compatibility.
+
+: ${user:=${PGUSER:-"postgres"}}
+: ${group:=${PGGROUP:-"postgres"}}
+
+: ${auto_setup:=${AUTO_SETUP:-"yes"}}
+: ${start_timeout:=${START_TIMEOUT:-10}}
+: ${nice_timeout:=${NICE_TIMEOUT:-60}}
+: ${rude_quit:=${RUDE_QUIT:-"yes"}}
+: ${rude_timeout:=${RUDE_TIMEOUT:-30}}
+: ${force_quit:=${FORCE_QUIT:-"no"}}
+: ${force_timeout:=${FORCE_TIMEOUT:-2}}
+
+: ${env_vars:=${PG_EXTRA_ENV:-}}
+: ${initdb_opts:=${PG_INITDB_OPTS:-}}
+: ${logfile:="$PGDATA/postmaster.log"}
+: ${pg_opts:=${PGOPTS:-}}
+: ${port:=${PGPORT:-5432}}
+: ${PGDATA:="/var/lib/postgresql/@VERSION@/data"}
+
+command="/usr/bin/postgres"
+
+conffile="$PGDATA/postgresql.conf"
+pidfile="$PGDATA/postmaster.pid"
+start_stop_daemon_args="
+ --user $user
+ --group $group
+ --pidfile $pidfile
+ --wait 100"
depend() {
use net
after firewall
-}
-get_config() {
- [ -f ${PGDATA%/}/postgresql.conf ] || return 1
- eval echo $(sed -e 's:#.*::' ${PGDATA%/}/postgresql.conf | awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }')
+ if [ "$(get_config log_destination)" = "syslog" ]; then
+ use logger
+ fi
}
-
-checkconfig() {
- configured_port=$(get_config port)
- : ${configured_port:=${PGPORT:-5432}}
- socket_path=$(get_config unix_socket_directories)
- : ${socket_path:=/var/run/postgresql}
-
- checkpath -d -m 0770 -o postgres:postgres ${socket_path}
-
- if [ -n "$WAIT_FOR_START" ]; then
- START_TIMEOUT=$WAIT_FOR_START
+start_pre() {
+ check_deprecated_var WAIT_FOR_START start_timeout
+ check_deprecated_var WAIT_FOR_DISCONNECT nice_timeout
+ check_deprecated_var WAIT_FOR_CLEANUP rude_timeout
+ check_deprecated_var WAIT_FOR_QUIT force_timeout
+
+ if [ ! -d "$PGDATA/base" ]; then
+ if yesno "$auto_setup"; then
+ setup || return 1
+ else
+ eerror "Database not found at: $PGDATA"
+ eerror "Please make sure that PGDATA points to the right path."
+ eerror "You can run '/etc/init.d/postgresql setup' to setup a new database cluster."
+ return 1
+ fi
fi
- [ -d "$PGDATA/base" ] && return 0
- if [ -z "$AUTO_SETUP" ] ; then
- eerror "Database not found at: $PGDATA"
- eerror "Please make sure that PGDATA points to the right path."
- eerror "You can run '/etc/init.d/postgresql setup' to setup a new database cluster."
- return 1
- fi
- setup
+ local socket_dirs=$(get_config "unix_socket_directories" "/run/postgresql")
+ local port=$(get_config "port" "$port")
+
+ start_stop_daemon_args="$start_stop_daemon_args --env PGPORT=$port"
+
+ (
+ # Set the proper permission for the socket paths and create them if
+ # then don't exist.
+ set -f; IFS=","
+ for dir in $socket_dirs; do
+ if [ -e "${dir%/}/.s.PGSQL.$port" ]; then
+ eerror "Socket conflict. A server is already listening on:"
+ eerror " ${dir%/}/.s.PGSQL.$port"
+ eerror "Hint: Change 'port' to listen on a different socket."
+ return 1
+ elif [ "${dir%/}" != "/tmp" ]; then
+ checkpath -d -m 1775 -o $user:$group "$dir"
+ fi
+ done
+ )
}
start() {
- checkconfig || return 1
+ local retval
ebegin "Starting PostgreSQL"
- if [ -f "$PGDATA/postmaster.pid" ] ; then
- rm -f "$PGDATA/postmaster.pid"
- fi
-
- local retval= x= extraenv=
- for x in ${PG_EXTRA_ENV} ; do
- extraenv="${extraenv} --env ${x}"
+ local var; for var in $env_vars; do
+ start_stop_daemon_args="$start_stop_daemon_args --env $var"
done
+ rm -f "$pidfile"
start-stop-daemon --start \
- --user ${PGUSER:-postgres} \
- --group ${PGGROUP:-postgres} \
- --env "PGPORT=${configured_port}" \
- ${extraenv} \
- --pidfile ${PGDATA}/postmaster.pid \
- --wait 100 \
+ $start_stop_daemon_args \
--exec /usr/bin/pg_ctl \
- -- \
- start -s -w -t ${START_TIMEOUT:-10} \
- -l ${PGDATA}/postmaster.log \
- -D ${PGDATA} -o "$PGOPTS"
+ -- start \
+ --silent \
+ -w --timeout="$start_timeout" \
+ --log="$logfile" \
+ --pgdata="$PGDATA" \
+ -o "$pg_opts"
retval=$?
- if [ $retval -ne 0 ] ; then
- eerror "Check the log for a possible explanation of the above error."
- eerror " ${PGDATA}/postmaster.log"
+ if [ $retval -ne 0 ]; then
+ eerror "Check the log for a possible explanation of the above error:"
+ eerror " $logfile"
fi
eend $retval
}
stop() {
- if [ -n "$WAIT_FOR_DISCONNECT" ]; then
- NICE_TIMEOUT=$WAIT_FOR_DISCONNECT
- fi
- if [ -n "$WAIT_FOR_CLEANUP" ]; then
- RUDE_QUIT=YES
- RUDE_TIMEOUT=$WAIT_FOR_CLEANUP
- fi
- if [ -n "$WAIT_FOR_QUIT" ] && [ $WAIT_FOR_QUIT -ne 0 ]; then
- FORCE_QUIT=YES
- FORCE_TIMEOUT=$WAIT_FOR_QUIT
- fi
+ local retry="SIGTERM/$nice_timeout"
- local seconds=${NICE_TIMEOUT}
- local retval
- local retries=SIGTERM/${NICE_TIMEOUT}
- if [ "${RUDE_QUIT}" != "NO" ] ; then
- retries="${retries}/SIGINT/${RUDE_TIMEOUT}"
- seconds=$(( $seconds + ${NICE_TIMEOUT} ))
- fi
- if [ "${FORCE_QUIT}" = "YES" ] ; then
- retries="${retries}/SIGQUIT/${FORCE_TIMEOUT}"
- seconds=$(( $seconds + ${FORCE_TIMEOUT} ))
- fi
+ yesno "$rude_quit" \
+ && retry="$retry/SIGINT/$rude_timeout" \
+ || rude_timeout=0
- ebegin "Stopping PostgreSQL (this can take up to ${seconds} seconds)"
+ yesno "$force_quit" \
+ && retry="$retry/SIGQUIT/$force_timeout" \
+ || force_timeout=0
+
+ local seconds=$(( $nice_timeout + $rude_timeout + $force_timeout ))
+
+ ebegin "Stopping PostgreSQL (this can take up to $seconds seconds)"
- # Loops through nice, rude, and force quit in one go.
start-stop-daemon --stop \
- --exec /usr/bin/postgres \
- --retry ${retries} \
+ --exec "$command" \
+ --retry "$retry" \
--progress \
- --pidfile ${PGDATA}/postmaster.pid
- eend
+ --pidfile "$pidfile"
+ eend $?
}
reload() {
ebegin "Reloading PostgreSQL configuration"
- kill -HUP $(head -n1 ${PGDATA}/postmaster.pid)
+
+ start-stop-daemon --signal HUP --pidfile "$pidfile"
eend $?
}
-setup() {
- ebegin "Creating a new PostgreSQL database cluster"
-
- if [ -d "${PGDATA}/base" ] ; then
- eend 1 "${PGDATA}/base already exists"
- return
- fi
-
- mkdir -p "${PGDATA}" 2>/dev/null
-
- # If the pg_hba.conf and friends exist, move them
- local tmpdir="$( dirname "$PGDATA" )/tmp"
- mkdir -p "${tmpdir}" >/dev/null
- echo mv "${PGDATA}"/* "${tmpdir}"
- mv "${PGDATA}"/* "${tmpdir}" 2>/dev/null
-
- rm -rf "${PGDATA}"/* 2>/dev/null
- chown -Rf postgres:postgres "${PGDATA}"
- chmod 0700 "${PGDATA}"
- cd "${PGDATA}" # to avoid the: could not change directory to "/root"
- su -c "/usr/bin/initdb --pgdata ${PGDATA}" postgres
- local res=$?
-
- # move the pg_hba.conf and friends
- mv $tmpdir/* "$PGDATA" 2>/dev/null
- rm -rf $tmpdir 2>/dev/null
-
- # Do not send a SIGHUP to postmaster; its not necessary for a new database
- # and allows pg-restore to do a blind restore of an old database
-
- eend $res
+setup() {
+ local bkpdir
+
+ ebegin "Creating a new PostgreSQL database cluster"
+
+ if [ -d "$PGDATA/base" ]; then
+ eend 1 "$PGDATA/base already exists!"; return 1
+ fi
+
+ # If the pg_hba.conf and friends exist, backup them.
+ if [ -d "$PGDATA" ]; then
+ bkpdir="$(mktemp -d)"
+ mv "$PGDATA"/* "$bkpdir"/
+ rm -rf "$PGDATA"/*
+ fi
+
+ install -d -m 0700 -o $user -g $group "$PGDATA"
+
+ cd "$PGDATA" # to avoid the: could not change directory to "/root"
+ su $user -c "/usr/bin/initdb $initdb_opts --pgdata $PGDATA"
+ local retval=$?
+
+ if [ -d "$bkpdir" ]; then
+ # Move the pg_hba.conf and friends back.
+ mv "$bkpdir"/* "$PGDATA"/ 2>/dev/null
+ rm -rf "$bkpdir"
+ fi
+
+ eend $retval
}
+
+get_config() {
+ local name="$1"
+ local default="${2:-}"
+
+ if [ ! -f "$conffile" ]; then
+ printf '%s\n' "$default"
+ return 1
+ fi
+ sed -En "/^\s*${name}\b/{ # find line starting with the name
+ s/^\s*${name}\s*=?\s*([^#]+).*/\1/; # capture the value
+ s/\s*$//; # trim trailing whitespaces
+ s/^['\"](.*)['\"]$/\1/; # remove delimiting quotes
+ p
+ }" "$conffile" \
+ | grep . || printf '%s\n' "$default"
+}
+
+check_deprecated_var() {
+ local old_name="$1"
+ local new_name="$2"
+
+ if [ -n "$(getval "$old_name")" ]; then
+ ewarn "Variable '$old_name' has been removed, please use '$new_name' instead."
+ fi
+}
+
+getval() {
+ eval "printf '%s\n' \"\$$1\""
+}