]> git.pld-linux.org Git - packages/postgresql.git/blobdiff - postgresql.init
rebuild with perl 5.34.0
[packages/postgresql.git] / postgresql.init
index ef0bb663487d8f1c77b85df4016f9c116800e6a5..647f2ec4328af6cab69cf80b305ae8a7c25863b1 100644 (file)
@@ -3,13 +3,14 @@
 # postgresql   This is the init script for starting up the PostgreSQL
 #              server
 #
-# chkconfig:   345 85 15
+# chkconfig:   345 84 25
 #
 # description: Starts and stops the PostgreSQL backend daemon that handles \
 #              all database requests.
 #
 # processname: postmaster
-# pidfile:     /var/run/postmaster.pid
+
+cd /
 
 # Source function library
 . /etc/rc.d/init.d/functions
 # Get network config
 . /etc/sysconfig/network
 
+PG_INIT_LOCALE=C
+
 # Get service config
-if [ -f /etc/sysconfig/postgresql ] ; then
-        . /etc/sysconfig/postgresql
+if [ -f /etc/sysconfig/postgresql ]; then
+       . /etc/sysconfig/postgresql
 else
-        ALLOW_TCP_CONNECTIONS=no
-       POSTGRES_DATA_DIR=/var/state/psql
+       nls "Error: %s not found" /etc/sysconfig/postgresql
+       nls " PostgreSQL can't be run."
+       exit 1
 fi
 
-# Check that networking is up.
-if [ "${NETWORKING}" = "no" ]; then
-       echo "WARNING: Networking is down. Postgresql service can't be runed."
+if [ ! "$PG_DB_CLUSTERS" ]; then
+       nls "Error: PG_DB_CLUSTERS not found or is empty"
+       nls " PostgreSQL can't be run."
        exit 1
 fi
 
-# See how we were called.
-case "$1" in
-  start)
-       # Check if the service is already running?
-       if [ ! -f /var/lock/subsys/postgresql ]; then
-
-               # Sanity check
-               [ -f /tmp/.s.PGSQL.5432 ] || rm -f /tmp/.s.PGSQL.5432
-               STARTTEXT="Starting postgresql"
-               
-               # Check for the PGDATA structure
-               if [ -f $POSTGRES_DATA_DIR/PG_VERSION ] && [ -d $POSTGRES_DATA_DIR/base/template1 ]; then
-                   # Check version of existing PGDATA
-                   if [ `cat $POSTGRES_DATA_DIR/PG_VERSION` != '6.5' ]; then
-                       STARTTEXT="$STARTTEXT [Old version. Need to Upgrade]"
-                       show "$STARTTEXT"; fail
-                       exit 1
-                   fi
+# Check that networking is up.
+if is_yes "${NETWORKING}"; then
+       if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
+               msg_network_down PostgreSQL
+               exit 1
+       fi
+else
+       exit 0
+fi
+
+action="$1"
+
+# any db cluster as command line argument?
+if [ $# -gt 1 ]; then
+       shift
+       # perform action for specified clusters only
+       DB_CLUSTERS="$@"
+else
+       DB_CLUSTERS="$PG_DB_CLUSTERS"
+fi
+
+#
+# Useful functions.
+#
+
+#
+# check for postgresql status
+#
+# arguments:
+# $1 - db cluster
+#
+# sets variables:
+# PG_STATUS = running | not running
+# PG_PID    = pid of postmaster process
+#
+pgstatus() {
+       PG_STATUS="unknown"
+       PG_PID="unknown"
+       output=$(LC_ALL=C TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $1 status")
+       status=$?
+
+       if [ $status -eq 3 ]; then
+               PG_STATUS="not running"
+       elif [ $status -eq 0 ]; then
+               PG_STATUS="running"
+       # or maybe grab it from postmaster.pid file?
+               PG_PID=$(echo "$output" | awk '/PID: / { match($0, "PID: [0-9]+"); print substr($0,RSTART+5,RLENGTH-5) }')
+       fi
+}
+
+#
+# start postgresql and display appropriate messages
+#
+# arguments:
+# $1 - db cluster
+#
+pgstart() {
+       is_no "$RC_LOGGING" && fork=--fork
+       msg_starting "PostgreSQL $1"
+       daemon $fork --user postgres /usr/bin/pg_ctl -s -w -D $1 start
+}
+
+#
+# check for running postgresql instances; if any instance is running then
+# create subsys lock file
+#
+pgsubsys() {
+       # check for every defined db cluster in sysconfig file
+       for pgdir in $PG_DB_CLUSTERS; do
+               pgstatus "$pgdir"
+               if [ "$PG_STATUS" = "running" ]; then
+                       touch /var/lock/subsys/postgresql
+                       return
+               fi
+       done
+       rm -f /var/lock/subsys/postgresql
+}
+
+#
+# End of useful functions.
+#
+
+start() {
+       for pgdir in $DB_CLUSTERS; do
+               pgstatus "$pgdir"
+               if [ "$PG_STATUS" = "running" ]; then
+                       # pg_ctl status can misinform us about postgresql status
+                       # so let's check if postmaster is really alive
+                       if ps -p "$PG_PID" >/dev/null; then
+                               msg_already_running "PostgreSQL $pgdir"
+                       else
+                               # pg_ctl has misinformed us about postgresql status;
+                               # remove pid file and run postgresql
+                               msg_not_running "PostgreSQL $pgdir"
+                               rm -f $pgdir/postmaster.pid
+                               pgstart "$pgdir"
+                       fi
                else
-                   # Create sample database
-                   if [ ! -d $POSTGRES_DATA_DIR ]; then
-                       mkdir -p $POSTGRES_DATA_DIR
-                       chown postgres.postgres $POSTGRES_DATA_DIR
-                   fi
-                   show Creating postgresql init database
-                   busy
-                   su postgres -c "LD_LIBRARY_PATH=/usr/lib \
-                       initdb --pgdata=$POSTGRES_DATA_DIR \
-                       --pglib=/usr/lib/pgsql &>/tmp/initdb.pgsql"
-                   deltext; ok
+                       pgstart "$pgdir"
                fi
-               
-               show "$STARTTEXT"
-               busy
-               su postgres -c "/usr/bin/postmaster \
-                       $([ "$ALLOW_TCP_CONNECTIONS" = yes ] && echo "-i") \
-                       $([ -n "$MAX_NUM_BACKENDS" ] && echo "-N $MAX_NUM_BACKENDS") \
-                       $([ -n "POSTGRES_$DATA_DIR" ] && echo "-D $POSTGRES_DATA_DIR") \
-                       -o \
-                       $([ "$POSTGRES_QUIET" = yes ] && echo "-Q") \
-                       $([ "$POSTGRES_DIABLE_FSYNC" = yes ] && echo "-F") &"
-               sleep 2
-               if ps ax | grep -v grep | grep -q postmaster; then
-                       deltext; ok
+       done
+       pgsubsys
+}
+
+stop() {
+       for pgdir in $DB_CLUSTERS; do
+               pgstatus "$pgdir"
+               if [ "$PG_STATUS" = "not running" ]; then
+                       msg_not_running "PostgreSQL $pgdir"
                else
-                       deltext; fail
+                       msg_stopping "PostgreSQL $pgdir"
+                       busy
+                       # is postgresql really alive?
+                       if ps -p "$PG_PID" >/dev/null; then
+                               TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -w -D $pgdir stop -m fast 2>&1 >/dev/null"
+                               pgstatus "$pgdir"
+                               if [ "$PG_STATUS" != "not running" ]; then
+                                       fail
+                               else
+                                       ok
+                               fi
+                       else
+                               # postgresql is not really alive; pg_ctl misinformed us
+                               # about the status
+                               died
+                       fi
+                       rm -f $pgdir/postmaster.pid
                fi
-       else
-               echo "Postgresql already is running"
-       fi
-       touch /var/lock/subsys/postgresql
+       done
+       pgsubsys
+}
+
+
+RETVAL=0
+# See how we were called.
+# Every action is performed for all given (all configured by default)
+# db clusters.
+case "$action" in
+  start)
+       start
        ;;
   stop)
-       show Stopping postgresql service
-       killproc postmaster
-       sleep 2
-       rm -f /var/run/postmaster.pid
-       rm -f /var/lock/subsys/postgresql
+       stop
        ;;
   status)
-       status postmaster
+       for pgdir in $DB_CLUSTERS; do
+               pgstatus "$pgdir"
+               if [ "$PG_STATUS" = "running" ]; then
+                       show "PostgreSQL cluster %s, PID %s" "$pgdir" "$PG_PID"
+                       progress "$PG_STATUS"
+               else
+                       show "PostgreSQL cluster %s" "$pgdir"
+                       progress "$PG_STATUS" "$CFAIL"
+               fi
+               echo
+       done
+       ;;
+  restart)
+       stop
+       start
+       ;;
+  reload|force-reload|try-restart)
+       if [ "$action" = "reload" ]; then
+               # "reload" must not restart service - so let it reload only what's possible
+               pgctlact="reload"
+       else
+               pgctlact="restart"
+       fi
+       for pgdir in $DB_CLUSTERS; do
+               pgstatus "$pgdir"
+               if [ "$PG_STATUS" = "not running" ]; then
+                       msg_not_running "PostgreSQL $pgdir"
+                       if [ "$action" != "try-restart" ]; then
+                               RETVAL=7
+                       fi
+               else
+                       msg_reloading "PostgreSQL $pgdir"
+                       busy
+                       # is postgresql really alive?
+                       if ps -p "$PG_PID" >/dev/null; then
+                               TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $pgdir $pgctlact 2>&1 >/dev/null"
+                                       pgstatus "$pgdir"
+                               if [ "$PG_STATUS" = "running" ]; then
+                                       ok
+                               else
+                                       fail
+                               fi
+                       elif [ "$action" != "try-restart" ]; then
+                               # postgresql died and pg_ctl has misinformed us about
+                               # the status - i.e. service is actually not running
+                               RETVAL=7
+                       else
+                               # postgresql died and pg_ctl has misinformed us about
+                               # the status; remove pid file and start it again
+                               deltext; died
+                               rm -f $pgdir/postmaster.pid
+                               pgstart "$pgdir"
+                       fi
+               fi
+       done
+       pgsubsys
        ;;
-  restart|reload)
-       $0 stop
-       $0 start
+  init)
+       nls "Note: this is only simple init action for convenience."
+       nls "If you want some non-standard options, consider using initdb(1)."
+       echo
+       for pgdir in $DB_CLUSTERS; do
+               if [ -f $pgdir/PG_VERSION ]; then
+                       echo $(nls "Skipping existing cluster %s" "$pgdir")
+               else
+                       echo $(nls "Initializing cluster %s" "$pgdir")
+                       mkdir -p $pgdir
+                       chmod 700 $pgdir
+                       chown postgres:postgres $pgdir
+                       LC_ALL=$PG_INIT_LOCALE TMPDIR=/tmp su postgres -s /bin/sh -c "initdb -E UNICODE --data-checksums -D $pgdir"
+               fi
+       done
+       echo $(nls "REMEMBER to setup password for user \"postgres\"")'!'
        ;;
   *)
-       echo "Usage: postgresql {start|stop|status|restart|reload}"
-       exit 1
+       msg_usage "$0 {start|stop|init|restart|reload|force-reload|status}"
+       exit 3
 esac
 
-exit 0
+exit $RETVAL
This page took 0.100355 seconds and 4 git commands to generate.