#!/bin/sh

### BEGIN INIT INFO
# Provides:          slony1
# Required-Start:    $network $time
# Required-Stop:     $network $time
# Should-Start:      $local_fs postgresql
# Should-Stop:       $local_fs postgresql
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: start Slony-I daemon
# Description: Slony-I is a replication system for PostgreSQL.
### END INIT INFO


PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/slon

test -x $DAEMON || exit 5

. /lib/lsb/init-functions


instances() {
	ls /etc/slony1/*/slon.conf 2>/dev/null | sed -n 's,^/etc/slony1/\(.*\)/slon.conf$,\1,p'
}

conffile() {
	echo "/etc/slony1/$1/slon.conf"
}

logfile() {
	echo "/var/log/slony1/slon-$1.log"
}

pidfile() {
	echo "/var/run/slony1/$1.pid"
}

prepare_start() {
	mkdir -p /var/run/slony1 \
	&& chown postgres:postgres /var/run/slony1/ \
	&& chmod 2775 /var/run/slony1/
}

d_start() {
	su -c ". /lib/lsb/init-functions ; start_daemon -p $(pidfile $1) $DAEMON -f $(conffile $1) -p $(pidfile $1) >>$(logfile $1) 2>&1 </dev/null &" - postgres
}

d_stop() {
	killproc -p $(pidfile $1) $DAEMON
}

is_running() {
	pidofproc -p $(pidfile $1) $DAEMON >/dev/null
}


case $1 in
    start)
	status=0
	log_daemon_msg "Starting Slony-I daemon"
	prepare_start
	for x in $(instances); do
		log_progress_msg $x
		d_start $x
		status=$(($status || $?))
	done
	log_end_msg $status
	;;
    stop)
	status=0
	log_daemon_msg "Stopping Slony-I daemon"
	for x in $(instances); do
		log_progress_msg $x
		d_stop $x
		status=$(($status || $?))
	done
	log_end_msg $status
	;;
    status)
	status=0
	for x in $(instances); do
		is_running $x
		instancestatus=$?
		if [ $instancestatus -eq 0 ]; then
			log_success_msg "Slony-I daemon $x is running."
		else
			log_failure_msg "Slony-I daemon $x is not running."
		fi
                status=$(($status || $instancestatus))
	done
	exit $((3 * $status))
	;;
    restart|force-reload)
	status=0
	log_daemon_msg "Restarting Slony-I daemon"
	for x in $(instances); do
		log_progress_msg $x
		d_stop $x && sleep 1 && d_start $x
		status=$(($status || $?))
	done
	log_end_msg $status
	;;
    try-restart)
	if $0 status >/dev/null; then
		$0 restart
	else
		exit 0
	fi
	;;
    reload)
	exit 3
	;;
    *)
	log_failure_msg "Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
	exit 2
	;;
esac
