#! /bin/sh -e

# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

BACKGROUND=false
DEFAULT_CONFIG_DIR=%localconfdir%/default.d
DEFAULT_CONFIG_FILE=%localconfdir%/%defaultini%
HEART_BEAT_TIMEOUT=11
HEART_COMMAND="%bindir%/%couchdb_command_name% -k"
INTERACTIVE=false
KILL=false
LOCAL_CONFIG_DIR=%localconfdir%/local.d
LOCAL_CONFIG_FILE=%localconfdir%/%localini%
PID_FILE=%localstatedir%/run/couchdb/couchdb.pid
RECURSED=false
RESET_CONFIG=true
RESPAWN_TIMEOUT=0
SCRIPT_ERROR=1
SCRIPT_OK=0
SHUTDOWN=false
STDERR_FILE=couchdb.stderr
STDOUT_FILE=couchdb.stdout

print_arguments=""
start_arguments=""
background_start_arguments=""

basename=`basename $0`

display_version () {
    cat << EOF
$basename - %package_name% %version%

Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

EOF
}

display_help () {
    cat << EOF
Usage: $basename [OPTION]

The $basename command runs the %package_name% server.

Erlang inherits the environment of this command.

The exit status is 0 for success or 1 for failure.

The \`-s' option will exit 0 for running and 1 for not running.

Options:

  -h          display a short help message and exit
  -V          display version information and exit
  -a FILE     add configuration FILE to chain
  -A DIR      add configuration DIR to chain
  -n          reset configuration file chain (including system default)
  -c          print configuration file chain and exit
  -i          use the interactive Erlang shell
  -b          spawn as a background process
  -p FILE     set the background PID FILE (overrides system default)
  -r SECONDS  respawn background process after SECONDS (defaults to no respawn)
  -o FILE     redirect background stdout to FILE (defaults to $STDOUT_FILE)
  -e FILE     redirect background stderr to FILE (defaults to $STDERR_FILE)
  -s          display the status of the background process
  -k          kill the background process, will respawn if needed
  -d          shutdown the background process

Report bugs at <%bug_uri%>.
EOF
}

display_error () {
    if test -n "$1"; then
        echo $1 >&2
    fi
    echo >&2
    echo "Try \`"$basename" -h' for more information." >&2
    false
}

_get_pid () {
    if test -f $PID_FILE; then
        PID=`cat $PID_FILE`
    fi
    echo $PID
}

_add_config_file () {
    if test -n "$start_arguments"; then
        start_arguments="$start_arguments, ";
    fi
    if test -z "$print_arguments"; then
        print_arguments="$1"
    else
        print_arguments="`cat <<EOF
$print_arguments
$1
EOF
`"
    fi
    start_arguments="$start_arguments \\\"$1\\\""
    background_start_arguments="$background_start_arguments -a \\\"$1\\\""
}

_add_config_dir () {
    for file in `find "$1" -mindepth 1 -maxdepth 1 -type f`; do
        _add_config_file $file
    done
}

_load_config () {
    _add_config_file "$DEFAULT_CONFIG_FILE"
    _add_config_dir "$DEFAULT_CONFIG_DIR"
    _add_config_file "$LOCAL_CONFIG_FILE"
    _add_config_dir "$LOCAL_CONFIG_DIR"
}

_reset_config () {
    print_arguments=""
    start_arguments=""
    background_start_arguments="-n"
}

_print_config () {
    cat <<EOF
$print_arguments
EOF
}

check_status () {
    PID=`_get_pid`
    if test -n "$PID"; then
        if kill -0 $PID 2> /dev/null; then
            echo "Apache CouchDB is running as process $PID, time to relax."
            return $SCRIPT_OK
        else
            echo >&2 << EOF
Apache CouchDB is not running but a stale PID file exists: $PID_FILE"
EOF
        fi
    else
        echo "Apache CouchDB is not running." >&2
    fi
    return $SCRIPT_ERROR
}

check_environment () {
    if test "$BACKGROUND" != "true"; then
        return
    fi
    touch $PID_FILE 2> /dev/null || true
    touch $STDOUT_FILE 2> /dev/null || true
    touch $STDERR_FILE 2> /dev/null || true
    message_prefix="Apache CouchDB needs write permission on the"
    if test ! -w $PID_FILE; then
        echo "$message_prefix PID file: $PID_FILE" >&2
        false
    fi
    if test ! -w $STDOUT_FILE; then
        echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2
        false
    fi
    if test ! -w $STDERR_FILE; then
        echo "$message_prefix STDERR file: $STDERR_FILE" >&2
        false
    fi
    message_prefix="Apache CouchDB needs a regular"
    if test `echo 2> /dev/null >> $PID_FILE; echo $?` -gt 0; then
        echo "$message_prefix PID file: $PID_FILE" >&2
        false
    fi
    if test `echo 2> /dev/null >> $STDOUT_FILE; echo $?` -gt 0; then
        echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2
        false
    fi
    if test `echo 2> /dev/null >> $STDERR_FILE; echo $?` -gt 0; then
        echo "$message_prefix STDERR file: $STDERR_FILE" >&2
        false
    fi
}

start_couchdb () {
    if test ! "$RECURSED" = "true"; then
        if check_status 2> /dev/null; then
            exit
        fi
        check_environment
    fi
    interactive_option="+Bd -noinput"
    if test "$INTERACTIVE" = "true"; then
        interactive_option=""
    fi
    if test "$BACKGROUND" = "true"; then
        touch $PID_FILE
        interactive_option="+Bd -noinput"
    fi
    command="`%ICU_CONFIG% --invoke` \
        %ERL% $interactive_option -smp auto -sasl errlog_type error +K true \
        -pa %localerlanglibdir%/%couchdbebindir% \
            %localerlanglibdir%/%mochiwebebindir% \
            %localerlanglibdir%/%ibrowseebindir% \
            %localerlanglibdir%/%oauthebindir% \
        -eval \"application:load(ibrowse)\" \
        -eval \"application:load(oauth)\" \
        -eval \"application:load(crypto)\" \
        -eval \"application:load(couch)\" \
        -eval \"crypto:start()\" \
        -eval \"ssl:start()\" \
        -eval \"ibrowse:start()\" \
        -eval \"couch_server:start([$start_arguments]), receive done -> done end.\" "
    if test "$BACKGROUND" = "true" -a "$RECURSED" = "false"; then
        $0 $background_start_arguments -b -r $RESPAWN_TIMEOUT -p $PID_FILE \
            -o $STDOUT_FILE -e $STDERR_FILE -R &
        echo "Apache CouchDB has started, time to relax."
    else
        if test "$RECURSED" = "true"; then
            while true; do
                export HEART_COMMAND
                export HEART_BEAT_TIMEOUT
                `eval $command -pidfile $PID_FILE -heart \
                    >> $STDOUT_FILE 2>> $STDERR_FILE` || true
                PID=`_get_pid`
                if test -n "$PID"; then
                    if kill -0 $PID 2> /dev/null; then
                        return $SCRIPT_ERROR
                    fi
                else
                    return $SCRIPT_OK
                fi
                if test "$RESPAWN_TIMEOUT" = "0"; then
                    return $SCRIPT_OK
                fi
                if test "$RESPAWN_TIMEOUT" != "1"; then
                    plural_ending="s"
                fi
                cat << EOF
Apache CouchDB crashed, restarting in $RESPAWN_TIMEOUT second$plural_ending.
EOF
                sleep $RESPAWN_TIMEOUT
            done
        else
            eval exec $command
        fi
    fi
}

stop_couchdb () {
    PID=`_get_pid`
    if test -n "$PID"; then
        if test "$1" = "false"; then
            echo > $PID_FILE
        fi
        if kill -0 $PID 2> /dev/null; then
            if kill -1 $PID 2> /dev/null; then
                if test "$1" = "false"; then
                    echo "Apache CouchDB has been shutdown."
                else
                    echo "Apache CouchDB has been killed."
                fi
                return $SCRIPT_OK
            else
                echo "Apache CouchDB could not be killed." >&2
                return $SCRIPT_ERROR
            fi
            if test "$1" = "false"; then
                echo "Stale PID file exists but Apache CouchDB is not running."
            else
                echo "Stale PID file existed but Apache CouchDB is not running."
            fi
        fi
    else
        echo "Apache CouchDB is not running."
    fi
}

parse_script_option_list () {
    _load_config
    set +e
    options=`getopt hVa:A:ncibp:r:Ro:e:skd $@`
    if test ! $? -eq 0; then
        display_error
    fi
    set -e
    eval set -- $options
    while [ $# -gt 0 ]; do
        case "$1" in
            -h) shift; display_help; exit;;
            -V) shift; display_version; exit;;
            -a) shift; _add_config_file "$1"; shift;;
            -A) shift; _add_config_dir "$1"; shift;;
            -n) shift; _reset_config;;
            -c) shift; _print_config; exit;;
            -i) shift; INTERACTIVE=true;;
            -b) shift; BACKGROUND=true;;
            -r) shift; RESPAWN_TIMEOUT=$1; shift;;
            -R) shift; RECURSED=true;;
            -p) shift; PID_FILE=$1; shift;;
            -o) shift; STDOUT_FILE=$1; shift;;
            -e) shift; STDERR_FILE=$1; shift;;
            -s) shift; check_status; exit;;
            -k) shift; KILL=true;;
            -d) shift; SHUTDOWN=true;;
            --) shift; break;;
            *) display_error "Unknown option: $1" >&2;;
        esac
    done
    if test "$KILL" = "true" -o "$SHUTDOWN" = "true"; then
        stop_couchdb $KILL
    else
        start_couchdb
    fi
}

parse_script_option_list $@
