blob: eab27b5db2ed0ec7fdeace8ddae5aca7682b9c66 [file] [log] [blame]
#! /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%
ERL_OS_MON_OPTIONS="-os_mon \
start_memsup false \
start_cpu_sup false \
disk_space_check_interval 1 \
disk_almost_full_threshold 1"
ERL_START_OPTIONS="$ERL_OS_MON_OPTIONS -sasl errlog_type error +K true +A 4"
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 is called with:
$ERL_START_OPTIONS
Erlang inherits the environment of this command.
You can override these options using the environment:
ERL_AFLAGS, ERL_FLAGS, ERL_ZFLAGS
See erl(1) for more information about the environment variables.
The exit status is 0 for success or 1 for failure.
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 -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 "$1"/*.ini; do
if [ -r "$file" ]; then
_add_config_file "$file"
fi
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="%ERL% $interactive_option $ERL_START_OPTIONS \
-env ERL_LIBS %localerlanglibdir% -couch_ini $start_arguments -s couch"
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 $@