diff options
author | Jakub Jirutka <jakub@jirutka.cz> | 2017-04-15 21:11:13 +0200 |
---|---|---|
committer | Jakub Jirutka <jakub@jirutka.cz> | 2017-04-15 23:37:29 +0200 |
commit | 10d9cc8000c7da49bf13e516928f30fc80b1cf9f (patch) | |
tree | 120655923e3fb61f93bfa09fbc7a6f08fd38a1a3 /main/postgresql/postgresql.initd | |
parent | d698c1e58c607861670cd94c9b8cb22f97555a88 (diff) | |
download | aports-10d9cc8000c7da49bf13e516928f30fc80b1cf9f.tar.bz2 aports-10d9cc8000c7da49bf13e516928f30fc80b1cf9f.tar.xz |
main/postgresql: rewrite runscript
But keep it backward compatible with old confd.
Diffstat (limited to 'main/postgresql/postgresql.initd')
-rw-r--r-- | main/postgresql/postgresql.initd | 269 |
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\"" +} |