#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

extra_started_commands="reload"

CONFIGFILE="/etc/pgpool2/pgpool.conf"
LOGFILE="/var/log/pgpool2.log"

depend() {
    use net
    use postgresql
    after logger
}

get_config() {
    [ -f ${CONFIGFILE} ] || return 1

    eval echo $(sed -e 's:#.*::' ${CONFIGFILE} | \
        awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }')
}

PIDFILE="$(get_config pid_file_name)"
: ${PIDFILE:='/run/pgpool/pgpool.pid'}

prep() {
    # $logdir contains status file(s), not log files.
    local logdir=$(get_config logdir)
    local socket_dir=$(get_config socket_dir)
    local pcp_socket_dir=$(get_config pcp_socket_dir)

    checkpath -o pgpool:postgres -m 0770 -d $(dirname ${PIDFILE}) || return 1
    checkpath -o pgpool:postgres -m 0770 -d ${logdir:-'/run/pgpool'} || return 1
    checkpath -o pgpool:postgres -m 0660 -f ${LOGFILE} || return 1
    checkpath -o postgres:postgres -m 0770 \
        -d ${socket_dir:-'/run/postgresql'} || return 1
    checkpath -o postgres:postgres -m 0770 \
        -d ${pcp_socket_dir:-'/run/postgresql'} || return 1
}

start() {
    prep || return 1

    ebegin "Starting pgpool2"

    start-stop-daemon --start \
        --user pgpool:postgres \
        --pidfile ${PIDFILE} \
        --exec /usr/bin/pgpool

    eend
}

stop() {
    local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} ))
    ebegin "Stopping pgpool (this can take up to ${seconds} seconds)"

    local retval
    local retries=SIGTERM/${NICE_TIMEOUT}

    if [ "${RUDE_QUIT}" != "NO" ] ; then
        einfo "RUDE_QUIT enabled."
        retries="${retries}/SIGINT/${RUDE_TIMEOUT}"
    fi
    if [ "${FORCE_QUIT}" = "YES" ] ; then
        einfo "FORCE_QUIT enabled."
        ewarn "A recover-run might be executed on next startup."
        retries="${retries}/SIGQUIT/${FORCE_TIMEOUT}"
    fi

    # Loops through nice, rude, and force quit in one go.
    start-stop-daemon --stop \
        --pidfile ${PIDFILE} \
        --retry ${retries}

    eend
}

reload() {
    start-stop-daemon --signal HUP \
        --pidfile ${PIDFILE}
}
