diff options
author | Pavel Raiskup <praiskup@redhat.com> | 2015-03-17 11:34:21 +0100 |
---|---|---|
committer | Pavel Raiskup <praiskup@redhat.com> | 2015-03-17 13:52:47 +0100 |
commit | 81e523c0957a9bee557bf2cca25607989209ac2c (patch) | |
tree | 5789b6030b105b18b8820f07dae5b3947f7a7844 /postgresql.init.in | |
parent | f7a46224bd60e177871a46ffd99f0492cb6e8b6f (diff) | |
download | postgresql-setup-81e523c0957a9bee557bf2cca25607989209ac2c.tar.gz postgresql-setup-81e523c0957a9bee557bf2cca25607989209ac2c.tar.xz postgresql-setup-81e523c0957a9bee557bf2cca25607989209ac2c.zip |
sysvinit: transform for SCL & RHEL6 usage
This is mostly about simplification of intiscript and postgresql-setup
script reuse. Still WIP, however (some options are not applicable for
sysvinit system).
* share/postgresql-setup/library.sh.in (parse_upgrade_setup): Parse new
variable "pghost_override".
(run_cmd_as_dbadmin): New wrapper function to run something under
"postgres" user. Cut from postgresql-setup.
* postgresql-setup.in: Optionally source software collections. Call new
check_daemon_reload instead of in-place checking.
(upgrade): Use new library function run_cmd_as_dbadmin. Add new hack
for $PGHOST overriding via $pghost_override. Add more verbose output to
make clear what tool failed.
(check_daemon_reload): New function to make the systemd daemon reload
conditionally on one dedicated place.
(handle_envfile): New function to abstract environment file parsing,
works both for systemd & sysvinit env-files.
(handle_service_envfiles): Use handle_envfile instead of in-place
parsing.
(service_configuration): For sysvinit supported configuration, we
support only one env file per service - take this into account and don't
try to detect many from systemctl output.
* postgresql.init.in: Switch to bash script. Parametrize metadata by
configure results. Source software collections when needed. Source
project library. Don't set PGDATA if admin uses non-default service
naem. Do not define PGPORT as PGPORT should be defined in
postgresql.conf. Allow passing parameters into initdb/upgrade targets.
($PREVMAJORVERSION, $PREVPGENGINE): Remove unused variables.
($PGENGINE): This is @bindir@ equivalent.
($PGLOG): Spell it so it will not clash with system default PostgreSQL
installation.
($pidfile): Use $NAME instead of $PID to distinguish multiple postmaster
scenarios (mainly because we do not know the PGPORT yet).
(start): Drop the checking logic and use postgresql-check-db-dir
instead. Reuse run_cmd_as_dbadmin instead of $SU_POSTGRES.
(stop): Use run_cmd_as_dbadmin instead of $SU_POSTGRES.
(reload): Just coding style fix.
(perform_initdb): Drop unused function, done in postgresql-setup.
(__single_comand): Mostly postgresql-setup wrapper with success/failure
sugar around the call itself.
(initdb): Substitute the function body with postgresql-setup call.
(upgrade): Likewise.
* postgresql-check-db-dir.in: Fix the hint for admin about where the
service should be initialized. Do not warn about systemd-only
unsupported configuration. Add @bindir@ into "you need --initdb" hint.
Re-style the warning a bit.
* etc/postgresql-setup/upgrade/postgresql.conf: Mention new
configuration option pghost_override.
* configure.ac (initscriptsconfdir): New configuration directory.
(PGMAJORVERSION): Use sed and regexp for MAJOR version mining. It
failed for micro versions of length >= 2.
(SCL_SOURCE): Define to be empty by default.
* README: Document what's needed to bootstrap from git source. WIP.
* Makefile.am (initscripts_DATA): Use noinst_DATA. Firstly, having
initscripts_DATA installs only non-executable files. So we needed
something with _SCRIPTS primary. But initscripts_SCRIPTS would face the
automake's limitation that it must be "static" list of files. So make
the installation of initscript (of dynamically generated name) via
automake's install/uninstall.
($(initscript)): Use $(INSTANTIATE_SCRIPT) instead of $(INSTANTIATE).
(install-data-hook): Call 'systemctl daemon-reload' only for
non-sysvinit systems.
* .gitignore: Ignore 'initscript' filename.
Diffstat (limited to 'postgresql.init.in')
-rw-r--r-- | postgresql.init.in | 260 |
1 files changed, 83 insertions, 177 deletions
diff --git a/postgresql.init.in b/postgresql.init.in index f75f4e5..b3bd560 100644 --- a/postgresql.init.in +++ b/postgresql.init.in @@ -1,7 +1,8 @@ -#!/bin/sh +#!/bin/bash # -# postgresql This is the init script for starting up the PostgreSQL -# server. +# @NAME_SERVICE@ +# +# This is the init script for starting up the PostgreSQL server. # # This script is slightly unusual in that the name of the daemon (postmaster) # is not the same as the name of the subsystem (postgresql) @@ -10,25 +11,22 @@ # description: PostgreSQL database server. # processname: postmaster # pidfile: /var/run/postmaster.PORT.pid + ### BEGIN INIT INFO -# Provides: postgresql +# Provides: @NAME_SERVICE@ # Required-Start: $local_fs $remote_fs $network $named $syslog $time # Required-Stop: $local_fs $remote_fs $network $named $syslog $time -# Short-Description: start and stop PostgreSQL server +# Short-Description: start and stop PostgreSQL @PGVERSION@ server # Description: PostgreSQL database server ### END INIT INFO # PGVERSION is the full package version, e.g., 9.0.2 # Note: the specfile inserts the correct value during package build PGVERSION=@PGVERSION@ + # PGMAJORVERSION is major version, e.g., 9.0 (this should match PG_VERSION) PGMAJORVERSION=@PGMAJORVERSION@ -# PREVMAJORVERSION is the previous major version, e.g., 8.4, for upgrades -# Note: the specfile inserts the correct value during package build -PREVMAJORVERSION=@PREVMAJORVERSION@ -# PREVPGENGINE is the directory containing the previous postmaster executable -# Note: the specfile inserts the correct value during package build -PREVPGENGINE=@PREVPGENGINE@ + # PGDOCDIR is the directory containing the package's documentation # Note: the specfile inserts the correct value during package build @@ -41,6 +39,11 @@ README_DIST=@README_DIST@ # Get network config. . /etc/sysconfig/network +# postgresql-setup library +. "@rawpkgdatadir@/library.sh" + +@SCL_SOURCE@ + # Find the name of the script NAME=`basename $0` if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ] @@ -51,10 +54,19 @@ fi SU_POSTGRES="@SU_POSTGRES@" # Set defaults for configuration variables -PGENGINE=/usr/bin -PGPORT=5432 -PGDATA=/var/lib/pgsql/data -PGLOG=/var/lib/pgsql/pgstartup.log +PGENGINE=@bindir@ + +# Only default system service has default PGDATA set. This allows us to catch +# admin's mistake of not creating /etc/sysconfig/psql/$NAME configuration file +# and just hard/symlinking default init script. That way we can avoid (inside +# postgresql-check-db-dir) runnnig "secondary" server against "default" data +# directory. +if test "@NAME_SERVICE@" = "$NAME"; then + PGDATA=@PGDATADIR@ +fi + +PGLOG=@POSTGRES_HOMEDIR@/pgstartup-@NAME_SERVICE@.log + # Value to set as postmaster process's oom_adj PG_OOM_ADJ=-17 @@ -65,11 +77,16 @@ export PGDATA export PGPORT lockfile="/var/lock/subsys/${NAME}" -pidfile="/var/run/postmaster.${PGPORT}.pid" + +# Ideally, we should use $PGDATA/postmaster.pid. It apparently works, but to +# be honest I'm not sure about consequences. Most probably 'service status' +# would not work for non-root/non-postgres users. TODO? +pidfile="/var/run/${NAME}.pid" script_result=0 -start(){ +start() +{ [ -x "$PGENGINE/postmaster" ] || exit 5 PSQL_START=$"Starting ${NAME} service: " @@ -83,40 +100,27 @@ start(){ [ -x /sbin/restorecon ] && /sbin/restorecon "$PGLOG" fi - # Check for the PGDATA structure - if [ -f "$PGDATA/PG_VERSION" ] && [ -d "$PGDATA/base" ] - then - # Check version of existing PGDATA - if [ x`cat "$PGDATA/PG_VERSION"` = x"$PGMAJORVERSION" ] - then - : A-OK - elif [ x`cat "$PGDATA/PG_VERSION"` = x"$PREVMAJORVERSION" ] - then - echo - echo $"An old version of the database format was found." - echo $"Use \"service postgresql upgrade\" to upgrade to version $PGMAJORVERSION." - echo $"See $README_DIST for more information." - exit 1 - else - echo - echo $"An old version of the database format was found." - echo $"You need to dump and reload before using PostgreSQL $PGMAJORVERSION." - echo $"See $README_DIST for more information." - exit 1 - fi - else - # No existing PGDATA! Warn the user to initdb it. - echo - echo $"$PGDATA is missing. Use \"service postgresql initdb\" to initialize the cluster first." - echo_failure - echo - exit 1 - fi + @libexecdir@/postgresql-check-db-dir "$NAME" || { + echo_failure + echo + exit 1 + } echo -n "$PSQL_START" test x"$PG_OOM_ADJ" != x && echo "$PG_OOM_ADJ" > /proc/self/oom_adj - $SU_POSTGRES -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null + + # Note that this does not fail/exit the 'service start' if the postmaster + # is already running. We should probably 'status' first and start only if + # postmaster is down. This just unnecessarily wastes time and generates + # too much (false) rush in $PGLOG. + run_cmd_as_dbadmin \ + "$PGENGINE/postmaster ${PGPORT+-o "-p $PGPORT"} \ + -D '$PGDATA' ${PGOPTS} &" \ + "$PGLOG" "$PGLOG" + + # TODO: parametrize sleep 2 + pid=`head -n 1 "$PGDATA/postmaster.pid" 2>/dev/null` if [ "x$pid" != x ] then @@ -131,12 +135,15 @@ start(){ fi } -stop(){ +stop() +{ echo -n $"Stopping ${NAME} service: " if [ -e "$lockfile" ] then - $SU_POSTGRES -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" > /dev/null 2>&1 < /dev/null - ret=$? + run_cmd_as_dbadmin \ + "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" \ + /dev/null /dev/null + ret=$? if [ $ret -eq 0 ] then echo_success @@ -162,138 +169,35 @@ condrestart(){ [ -e "$lockfile" ] && restart || : } -reload(){ - $SU_POSTGRES -c "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" > /dev/null 2>&1 < /dev/null -} - -# code shared between initdb and upgrade actions -perform_initdb(){ - if [ ! -e "$PGDATA" -a ! -h "$PGDATA" ] - then - mkdir -p "$PGDATA" || return 1 - chown postgres:postgres "$PGDATA" - chmod go-rwx "$PGDATA" - fi - # Clean up SELinux tagging for PGDATA - [ -x /sbin/restorecon ] && /sbin/restorecon "$PGDATA" - - # Make sure the startup-time log file is OK, too - if [ ! -e "$PGLOG" -a ! -h "$PGLOG" ] - then - touch "$PGLOG" || return 1 - chown postgres:postgres "$PGLOG" - chmod go-rwx "$PGLOG" - [ -x /sbin/restorecon ] && /sbin/restorecon "$PGLOG" - fi - - # Initialize the database - $SU_POSTGRES -c "$PGENGINE/initdb --pgdata='$PGDATA' --auth='ident'" >> "$PGLOG" 2>&1 < /dev/null - - # Create directory for postmaster log - mkdir "$PGDATA/pg_log" - chown postgres:postgres "$PGDATA/pg_log" - chmod go-rwx "$PGDATA/pg_log" - - if [ -f "$PGDATA/PG_VERSION" ] - then - return 0 - fi - return 1 +reload() +{ + $SU_POSTGRES -c "@SCL_SOURCE@ $PGENGINE/pg_ctl reload -D '$PGDATA' -s" > /dev/null 2>&1 < /dev/null } -initdb(){ - if [ -f "$PGDATA/PG_VERSION" ] - then - echo -n $"Data directory is not empty!" - echo_failure - echo - script_result=1 - else - echo -n $"Initializing database: " - if perform_initdb - then - echo_success - else - echo_failure - script_result=1 - fi - echo - fi +__single_comand() +{ + local msg="$1" + shift + echo $"$msg ($@)" + "$@" && success || failure || script_result=1 + echo } -upgrade(){ - # must see previous version in PG_VERSION - if [ ! -f "$PGDATA/PG_VERSION" -o \ - x`cat "$PGDATA/PG_VERSION"` != x"$PREVMAJORVERSION" ] - then - echo - echo $"Cannot upgrade because database is not of version $PREVMAJORVERSION." - echo_failure - echo - exit 1 - fi - if [ ! -x "$PGENGINE/pg_upgrade" ] - then - echo - echo $"Please install the postgresql-upgrade RPM." - echo_failure - echo - exit 5 - fi - # Make sure service is stopped - stop - echo -n $"Upgrading database: " - - # Set up log file for pg_upgrade - PGUPLOG=/var/lib/pgsql/pgupgrade.log - rm -f "$PGUPLOG" - touch "$PGUPLOG" || exit 1 - chown postgres:postgres "$PGUPLOG" - chmod go-rwx "$PGUPLOG" - [ -x /sbin/restorecon ] && /sbin/restorecon "$PGUPLOG" - - # Move old DB to PGDATAOLD - PGDATAOLD="${PGDATA}-old" - rm -rf "$PGDATAOLD" - mv "$PGDATA" "$PGDATAOLD" || exit 1 - - # Create empty new-format database - if perform_initdb - then - # Do the upgrade - $SU_POSTGRES -c "$PGENGINE/pg_upgrade \ - '--old-bindir=$PREVPGENGINE' \ - '--new-bindir=$PGENGINE' \ - '--old-datadir=$PGDATAOLD' \ - '--new-datadir=$PGDATA' \ - --link \ - '--old-port=$PGPORT' '--new-port=$PGPORT' \ - --user=postgres" >> "$PGUPLOG" 2>&1 < /dev/null - if [ $? -ne 0 ] - then - # pg_upgrade failed - script_result=1 - fi - else - # initdb failed - script_result=1 - fi +initdb() +{ + __single_comand $"Initializing database" \ + @NAME_BINARYBASE@-setup --initdb "$NAME" "$@" +} - if [ $script_result -eq 0 ] - then - echo_success - else - # Clean up after failure - rm -rf "$PGDATA" - mv "$PGDATAOLD" "$PGDATA" - echo_failure - fi - echo - echo $"See $PGUPLOG for details." +upgrade() +{ + __single_comand $"Upgrading database" \ + @NAME_BINARYBASE@-setup --upgrade "$NAME" "$@" } + # See how we were called. case "$1" in start) @@ -319,11 +223,13 @@ case "$1" in restart ;; initdb) - initdb - ;; + shift + initdb "$@" + ;; upgrade) - upgrade - ;; + shift + upgrade "$@" + ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|initdb|upgrade}" exit 2 |