#!/bin/sh
#
# collectd - start and stop the statistics collection daemon
# http://collectd.org/
#
# Copyright (C) 2005-2006 Florian Forster <octo@verplant.org>
# Copyright (C) 2006-2009 Sebastian Harl <tokkee@debian.org>
#

### BEGIN INIT INFO
# Provides:          collectd
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $network $named $syslog $time cpufrequtils
# Should-Stop:       $network $named $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: manage the statistics collection daemon
# Description:       collectd is the statistics collection daemon.
#                    It is a small daemon which collects system information
#                    periodically and provides mechanisms to monitor and store
#                    the values in a variety of ways.
### END INIT INFO

. /etc/init.d/functions

export PATH=/sbin:/bin:/usr/sbin:/usr/bin

DISABLE=0

NAME=collectd
DAEMON=/usr/sbin/collectd

CONFIGFILE=/etc/collectd.conf
PIDFILE=/var/run/collectd.pid

USE_COLLECTDMON=1
COLLECTDMON_DAEMON=/usr/sbin/collectdmon
COLLECTDMON_PIDFILE=/var/run/collectdmon.pid

MAXWAIT=30

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

if [ -r /etc/default/$NAME ]; then
	. /etc/default/$NAME
fi

if test "$ENABLE_COREFILES" == 1; then
	ulimit -c unlimited
fi

if test "$USE_COLLECTDMON" == 1; then
	_PIDFILE="$COLLECTDMON_PIDFILE"
else
	_PIDFILE="$PIDFILE"
fi

# return:
#   0 if config is fine
#   1 if there is a syntax error
#   2 if there is no configuration
check_config() {
	if test ! -e "$CONFIGFILE"; then
		return 2
	fi
	if ! $DAEMON -t -C "$CONFIGFILE"; then
		return 1
	fi
	return 0
}

# return:
#   0 if the daemon has been started
#   1 if the daemon was already running
#   2 if the daemon could not be started
#   3 if the daemon was not supposed to be started
d_start() {
	if test "$DISABLE" != 0; then
		# we get here during restart
		echo "disabled by /etc/default/$NAME"
		return 3
	fi

	if test ! -e "$CONFIGFILE"; then
		# we get here during restart
		echo "disabled, no configuration ($CONFIGFILE) found"
		return 3
	fi

	check_config
	rc="$?"
	if test "$rc" -ne 0; then
		echo "not starting, configuration error"
		return 2
	fi

	if test "$USE_COLLECTDMON" == 1; then
		start-stop-daemon --start --quiet --oknodo --pidfile "$_PIDFILE" \
			--exec $COLLECTDMON_DAEMON -- -P "$_PIDFILE" -- -C "$CONFIGFILE" \
			|| return 2
	else
		start-stop-daemon --start --quiet --oknodo --pidfile "$_PIDFILE" \
			--exec $DAEMON -- -C "$CONFIGFILE" -P "$_PIDFILE" \
			|| return 2
	fi
	return 0
}

still_running_warning="
WARNING: $NAME might still be running.
In large setups it might take some time to write all pending data to
the disk. You can adjust the waiting time in /etc/default/collectd."

# return:
#   0 if the daemon has been stopped
#   1 if the daemon was already stopped
#   2 if daemon could not be stopped
d_stop() {
	PID=$( cat "$_PIDFILE" 2> /dev/null ) || true

	start-stop-daemon --stop --quiet --oknodo --pidfile "$_PIDFILE"
	rc="$?"

	if test "$rc" -eq 2; then
		return 2
	fi

	sleep 1
	if test -n "$PID" && kill -0 $PID 2> /dev/null; then
		i=0
		while kill -0 $PID 2> /dev/null; do
			i=$(( $i + 2 ))
			echo -n " ."

			if test $i -gt $MAXWAIT; then
				echo "$still_running_warning"
				return 2
			fi

			sleep 2
		done
		return "$rc"
	fi
	return "$rc"
}

# return:
#   0 if the daemon is running
#   3 if the daemon is stopped
d_status(){
	if test "$USE_COLLECTDMON" == 1; then
		status $COLLECTDMON_DAEMON
	else
		status $DAEMON
	fi
}

case "$1" in
	start)
		echo -n "Starting $NAME"
		d_start
		case "$?" in
			0|1) echo "." ;;
			*) exit 1 ;;
		esac
		;;
	stop)
		echo -n "Stopping $NAME"
		d_stop
		case "$?" in
			0|1) echo "." ;;
			*) exit 1 ;;
		esac
		;;
	status)
		d_status
		;;
	restart|force-reload)
		echo -n "Restarting $NAME"
		check_config
		rc="$?"
		if test "$rc" -eq 1; then
			echo "not restarting, configuration error"
			exit 1
		fi
		d_stop
		rc="$?"
		case "$rc" in
			0|1)
				sleep 1
				d_start
				rc2="$?"
				case "$rc2" in
					0|1) echo "." ;;
					*) exit 1 ;;
				esac
				;;
			*)
				exit 1
				;;
		esac
		;;
	*)
		echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
		exit 3
		;;
esac

# vim: syntax=sh noexpandtab sw=4 ts=4 :

