# This file contains common functionality for all postgresql server
# package init.d scripts. It is usually included by
# /etc/init.d/postgresql

. /lib/lsb/init-functions

# do pg_ctlcluster action $1 to all clusters of version $2 with command
# description $3; output according to Debian Policy for init scripts
do_ctl_all() {
    [ "$1" ] || { echo "Error: invalid command '$1'" >&2; exit 1; }
    [ "$2" ] || { echo "Error: invalid version '$2'" >&2; exit 1; }
    [ -d "/etc/postgresql/$2" ] || return 0
    [ "$(ls /etc/postgresql/$2)" ] || return 0
    [ -x "/usr/lib/postgresql/$2/bin/postmaster" ] || return 0

    status=0
    log_daemon_msg "$3"
    for c in /etc/postgresql/"$2"/*; do
	[ -e "$c/postgresql.conf" ] || continue
	name=$(basename "$c")

	# evaluate start.conf
	if [ -e "$c/start.conf" ]; then
	    start=$(sed 's/#.*$//; /^[[:space:]]*$/d; s/^\s*//; s/\s*$//' "$c/start.conf")
	else
	    start=auto
	fi
	[ "$start" = "auto" ] || continue

        log_progress_msg "$name"
	set +e
	if [ "$1" = "stop" ] || [ "$1" = "restart" ]; then
	    ERRMSG=$(pg_ctlcluster --force "$2" "$name" $1 2>&1)
	else
	    ERRMSG=$(pg_ctlcluster "$2" "$name" $1 2>&1)
	fi
	res=$?
	set -e
	# Do not fail on success or if cluster is already/not running
	[ $res -eq 0 ] || [ $res -eq 2 ] || status=$(($status || $res))
    done
    if [ $status -ne 0 -a -n "$ERRMSG" ]; then
	log_failure_msg "$ERRMSG"
    fi
    log_end_msg $status
    return $status
}

# start all clusters of version $1
# output according to Debian Policy for init scripts
start() {
    # create socket directory
    if [ -d /var/run/postgresql ]; then
	chmod 2775 /var/run/postgresql
    else
	install -d -m 2775 -o postgres -g postgres /var/run/postgresql
	[ -x /sbin/restorecon ] && restorecon -R /var/run/postgresql || true
    fi

    do_ctl_all start "$1" "Starting PostgreSQL $1 database server"
}

# stop all clusters of version $1
# output according to Debian Policy for init scripts
stop() {
    do_ctl_all stop "$1" "Stopping PostgreSQL $1 database server"
}

# restart all clusters of version $1
# output according to Debian Policy for init scripts
restart() {
    do_ctl_all restart "$1" "Restarting PostgreSQL $1 database server"
}

# reload all clusters of version $1
# output according to Debian Policy for init scripts
reload() {
    do_ctl_all reload "$1" "Reloading PostgreSQL $1 database server"
}

status() {
    CLUSTERS=`pg_lsclusters -h | grep "^$1[[:space:]]"`
    # no clusters -> unknown status
    [ -n "$CLUSTERS" ] || exit 4
    echo "$CLUSTERS" | awk 'BEGIN {rc=0; printf("Running clusters: ")} {if (match($4, "online")) printf ("%s/%s ", $1, $2); else rc=3} END { printf("\n"); exit rc }'
}

# return all installed versions which do not have their own init script
get_versions() {
    versions=''
    local v
    for v in `ls /usr/lib/postgresql/ 2>/dev/null`; do
	if [ -x /usr/lib/postgresql/$v/bin/pg_ctl ] && [ ! -x /etc/init.d/postgresql-$v ]; then
	    versions="$versions $v"
	fi
    done
}
