Commit 10d9cc80 authored by Jakub Jirutka's avatar Jakub Jirutka

main/postgresql: rewrite runscript

But keep it backward compatible with old confd.
parent d698c1e5
......@@ -3,7 +3,7 @@
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
pkgname=postgresql
pkgver=9.6.2
pkgrel=1
pkgrel=2
pkgdesc="A sophisticated object-relational DBMS"
url="http://www.postgresql.org/"
arch="all"
......@@ -33,15 +33,11 @@ builddir="$srcdir/$pkgname-$pkgver"
prepare() {
default_prepare || return 1
cd "$builddir"
# sanity check of conf.d
(
. "$srcdir"/postgresql.confd
_datadir=/var/lib/postgresql/${pkgver%.*}/data
if [ "$_datadir" != "$PGDATA" ]; then
die "PGDATA is $PGDATA while $_datadir is expected"
fi
) || return 1
local file; for file in $pkgname.initd $pkgname.confd; do
sed "s|@VERSION@|${pkgver%.*}|" "$srcdir"/$file > $file || return 1
done
cp -al "$builddir" "$builddir"~py3
}
......@@ -96,10 +92,11 @@ package() {
install -d -m755 -o postgres -g postgres \
"$pkgdir"/var/lib/postgresql || return 1
install -D -m755 "$srcdir"/postgresql.initd \
install -D -m755 postgresql.initd \
"$pkgdir"/etc/init.d/postgresql || return 1
install -D -m644 "$srcdir"/postgresql.confd \
"$pkgdir"/etc/conf.d/postgresql || return 1
install -D -m644 postgresql.confd \
"$pkgdir"/etc/conf.d/postgresql || return 1
install -D -m755 "$srcdir"/pg-restore.initd \
"$pkgdir"/etc/init.d/pg-restore || return 1
install -D -m644 "$srcdir"/pg-restore.confd \
......@@ -243,8 +240,8 @@ _submv() {
sha512sums="7c9d61a591408e29d7dc70d6b28ecdf06edf7f8fbf4e014e60a1e4f841fd5734c74a820094f6153e10ef633d48ea73f2a85194f6d2cd519a8f7087a261e9e02b postgresql-9.6.2.tar.bz2
0b88eee78380ed6cf543c851ac1cea5fc50bb6ef1bb51e03694003f43d2bf4e117ff06657f958d0e9c00ace3b8a6bab6ed0bd017d23f80cfd203dab33da81d46 initdb.patch
5f9d8bb4957194069d01af8ab3abc6d4d83a7e7f8bd7ebe1caae5361d621a3e58f91b14b952958138a794e0a80bc154fbb7e3e78d211e2a95b9b7901335de854 perl-rpath.patch
af37b100cc67769817e4c9e997abecf50475d7f0bf9b0f1d51bf8454d45abd6c87d5d315ed6cafd14e0dd059e96723a6203b756236070d12968816666e63e522 postgresql.initd
5b2fe18e38b5bef6fc289ff7701148dd5608d98002db046b183d715b718f96e22c01ba0adc5b590c386694c3eefae1a0a30425b985965ed2238e3858923b91ec postgresql.confd
73807f0d6ddc239c0fc2308164cf3e6ef361f98553ec24408afc4aeb1db9aea24746caf57e2cd1405eddaac4f26e9a55bf5aa1abcf08cd9ce3e9818754d4746a postgresql.initd
34912a2f9c5f660055cdf182f023981bf23f1995c2ba7b1172007dd90df9684952964ce574cfd86d6854bd6d057fd9dda67d6055dd765a65d03c1eaf5b33d22e postgresql.confd
f5a1cba051e7d846c2d16703514601cb25729ed96b677c9bd0c199d64552120a8b14b238af01917fdb87106681e12dee6fff7447558155ba273e4f96be5e2892 pg-restore.initd
c14a5684e914abb3b0ee71bbf15eed71a9264deacaa404a6e3af6bfc330d93e7598624d0ed11a94263106cc660f7f54c8ff57e759033cf606a795f69ff6c1c7c pg-restore.confd
5c9bfd9e295dcf678298bf0aa974347a7c311d6e7c2aa76a6920fcb751d01fd1ab77abbec11f3c672f927ad9deaa88e04e370c0b5cd1b60087554c474b748731 pltcl_create_tables.sql"
# Which port and socket to bind PostgreSQL
PGPORT="5432"
# How long to wait for server to start in seconds
START_TIMEOUT=10
# NICE_QUIT ignores new connections and wait for clients to disconnect from
# server before shutting down. NICE_TIMEOUT in seconds determines how long to
# wait for this to succeed.
NICE_TIMEOUT=60
# Forecfully disconnect clients from server and shut down. This is performed
# after NICE_QUIT. Terminated client connections have their open transactions
# rolled back.
# Set RUDE_QUIT to "NO" to disable. RUDE_TIMEOUT in seconds.
RUDE_QUIT="YES"
RUDE_TIMEOUT=30
# If the server still fails to shutdown, you can force it to quit by setting
# this to YES and a recover-run will execute on the next startup.
# Set FORCE_QUIT to "YES" to enable. FORCE_TIMEOUT in seconds.
FORCE_QUIT="NO"
FORCE_TIMEOUT=2
# Which port and socket to bind PostgreSQL.
# This may be overriden in postgresql.conf.
#port="5432"
# How long to wait for server to start in seconds.
#start_timeout=10
# Number of seconds to wait for clients to disconnect from the server before
# shutting down. Set to zero to disable this timeout.
#nice_timeout=60
# Timeout in seconds for rude quit - forecfully disconnect clients from server
# and shut down. This is performed after nice_timeout exceeded. Terminated
# client connections have their open transactions rolled back.
# Set "rude_quit=no" to disable.
#rude_quit="yes"
#rude_timeout=30
# Timeout in seconds for force quit - if the server still fails to shutdown,
# you can force it to quit and a recover-run will execute on the next startup.
# Set "force_quit=yes" to enable.
#force_quit="no"
#force_timeout="2"
# Extra options to run postmaster with, e.g.:
# -N is the maximal number of client connections
# -B is the number of shared buffers and has to be at least 2x the value for -N
# Please read the man-page to postmaster for more options. Many of these
# options can be set directly in the configuration file.
#PGOPTS="-N 512 -B 1024"
# -N is the maximal number of client connections
# -B is the number of shared buffers (has to be at least 2x the value for -N)
# Please read man postgres(1) for more options. Many of these options can be
# set directly in the configuration file.
#pg_opts="-N 512 -B 1024"
# Pass extra environment variables. If you have to export environment variables
# for the database process, this can be done here.
# Don't forget to escape quotes.
#PG_EXTRA_ENV="PGPASSFILE=\"/path/to/.pgpass\""
#env_vars="PGPASSFILE=\"/path/to/.pgpass\""
# Automatically set up a new database if missing on startup.
#auto_setup="yes"
##############################################################################
#
# The following values should not be arbitrarily changed.
# The following values should NOT be arbitrarily changed!
#
# The initscript uses these variables to inform PostgreSQL where to find
# its data directory and configuration files.
#
##############################################################################
# PostgreSQL's Database Directory
PGDATA="/var/lib/postgresql/9.6/data"
#PGDATA="/var/lib/postgresql/@VERSION@/data"
# Additional options to pass to initdb.
# See `man initdb' for available options.
#PG_INITDB_OPTS="--locale=en_US.UTF-8"
# Automatically set up a new database if missing on startup
AUTO_SETUP=yes
# See man initdb(1) for available options.
#initdb_opts="--locale=en_US.UTF-8"
#!/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\""
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment