#! /bin/sh
#
# /etc/init.d/postgresql
#
# postgresql	This is the init script for starting up the PostgreSQL
#		server
# chkconfig: - 85 15
# description: Starts and stops the PostgreSQL backend daemon that handles \
#	       all database requests.
# processname: postmaster
# pidfile: /var/run/postmaster.pid
#

# Do not load RH compatibility interface.
WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

RETVAL=0
LOCKFILE=/var/lock/subsys/postgresql
PG_CHROOT_DIR=/var/lib/pgsql-root
PGDATA=/var/lib/pgsql/data
PIDFILE="$PGDATA/postmaster.pid"


adjust()
{
	action "Adjusting environment for postgresql:" /etc/chroot.d/postgresql.all
	RETVAL=$?
	return $RETVAL
}

find_socket()
{
	local n f
	for n in "$@"; do
		for f in "$n"*; do
		    if [ -S "$f" ]; then
			echo "$f"
			return 0
		    fi
		done
	done
	return 1
}

wait_socket()
{
	local w_times="$1"
	shift
	local w_delay="$1"
	shift

	local i=0
	while [ $i -lt "$w_times" ]; do
		filelist=`find_socket $PG_CHROOT_DIR/tmp/.s.PGSQL.*`
		if [ -n "$filelist" ]; then
		    echo $filelist
		    return 0
		fi
		sleep "$w_delay"
		i=$[1+i]
	done
	return 1
}

start()
{
	if [ $PG_CHROOT_DIR ]; then
	    adjust || return 1
	fi
	
	export PGDATA

	# Check for the PGDATA structure
	if [ -f $PG_CHROOT_DIR$PGDATA/PG_VERSION ] && [ -d $PG_CHROOT_DIR$PGDATA/base ]
	then
	# Check version of existing PGDATA

		if [ `cat $PG_CHROOT_DIR$PGDATA/PG_VERSION` != '7.4' ];	then
		    msg_starting postgresql
		    failure "Old version. Need to Upgrade. See /usr/share/doc/postgresql-7.4/README.rpm-dist for more information."
		    echo
		    return 1
		fi

	# No existing PGDATA! Initdb it.
	else
                if [ ! -d $PG_CHROOT_DIR$PGDATA ]; then
		    mkdir -p $PG_CHROOT_DIR$PGDATA
		    chown postgres.postgres $PG_CHROOT_DIR$PGDATA
		fi
		# Is expanded this early to be used in the command su runs
		echo "export LANG LC_ALL LC_CTYPE LC_COLLATE LC_NUMERIC LC_CTYPE LC_TIME" >> $PG_CHROOT_DIR$PGDATA/../initdb.i18n
		
		action "Creating default database:" /bin/su -s /bin/sh -l postgres -c \'/usr/bin/initdb --pgdata=$PG_CHROOT_DIR$PGDATA\'
		RETVAL=$?
		[ "$RETVAL" -ne "0" ] && return $RETVAL;
	fi

	if [ $PG_CHROOT_DIR ]; then
	    locale_list=`/bin/su -l postgres -s /bin/sh -c '/usr/bin/locale'`
	    export `/bin/echo $locale_list | /usr/bin/tr ' ' "\n" | /bin/grep LANG`
	    start_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" -- /usr/bin/postmaster -D $PGDATA -S -r $PG_CHROOT_DIR
	else
	    start_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --user postgres -- /usr/bin/postmaster -D $PGDATA -S
	fi
	
	RETVAL=$?
	if [ $RETVAL = 0 ]; then
		touch "$LOCKFILE"
		if [ $PG_CHROOT_DIR ]; then
			rm -f /tmp/.s.PGSQL.* >/dev/null 2>&1
			echo -n "Link postgresql socket: "
    			socket=`wait_socket 30 1s`
        		if [ -n "$socket" ]; then
    		    		for f in $socket; do
        			    ln -s $f /tmp/${f##*/} >/dev/null 2>&1
	        		done
				echo_success
				echo
				return $RETVAL
			else
    				failure ""
				echo
				return 1
			fi
		fi
	fi
	
	return $RETVAL
}	

stop()
{
	stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" -SIGQUIT --announce --expect-user postgres -- postmaster
	RETVAL=$?
        if [ $RETVAL = 0 ]; then
	    if [ $PG_CHROOT_DIR ]; then
		rm -f $PG_CHROOT_DIR/tmp/.s.PGSQL.* >/dev/null 2>&1
	    fi
	    rm -f /tmp/.s.PGSQL.* >/dev/null 2>&1
	fi

	return $RETVAL
}

restart()
{
	stop
	start
}

reload()
{
	msg_reloading postgresql
	stop_daemon --pidfile "$PIDFILE" --expect-user postgres -HUP postmaster
	RETVAL=$?
	return $RETVAL
}

# See how we were called.
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	adjust)
		adjust
		;;
	reload)
		reload
		;;
	restart)
		restart
		;;
	condstop)
		if [ -e "$LOCKFILE" ]; then
			stop
		fi
		;;
	condrestart)
		if [ -e "$LOCKFILE" ]; then
			restart
		fi
		;;
	status)
		status --expect-user postgres postmaster
		RETVAL=$?
		;;
	*)
		echo "Usage: ${0##*/} {start|stop|adjust|reload|restart|condstop|condrestart|status}"
		RETVAL=1
esac

exit $RETVAL

