#!/bin/sh
#
# /etc/init.d/rrdcached
#   and its symbolic link
# /usr/sbin/rcrrdcached
#
### BEGIN INIT INFO
# Provides:          rrdcached
# Required-Start:    $local_fs $syslog $remote_fs
# Should-Start:      $time 
# Required-Stop:     $local_fs $syslog $remote_fs
# Should-Stop:       $null
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Start and stop rrdtool caching daemon
# Description:       rrdcached is a caching daemon to aggregate 
#	updates to rrd files
### END INIT INFO

RRDCACHED_BIN='/usr/bin/rrdcached'
test -x $RRDCACHED_BIN || { echo "$RRDCACHED_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

# Check for existence of needed config file and read it
RRDCACHED_CONFIG='/etc/sysconfig/rrdcached'
test -r $RRDCACHED_CONFIG || { echo "$RRDCACHED_CONFIG not existing";
	if [ "$1" = "stop" ]; then exit 0;
	else exit 6; fi; }

RRDCACHED_PID='/var/run/rrdcached/rrdcached.pid'

# Read config	
. $RRDCACHED_CONFIG

# Source LSB init functions
. /etc/rc.status

# Reset status of this service
rc_reset

function check_and_create_dir(){
	local DIR=$1
	test -d "$DIR" || mkdir -p "$DIR"
}

case "$1" in
    start)
	echo -n "Starting rrdcached "
	check_and_create_dir "$(dirname $RRDCACHED_PID)"	
	chown $RRDCACHED_USER:$RRDCACHED_GROUP "$(dirname $RRDCACHED_PID)"
	case "$RRDCACHED_ADDRESS" in
		^unix:) 
			SOCKETDIR=$(dirname ${RRDCACHED_ADDRESS/unix:/})
			check_and_create_dir "$SOCKETDIR"
			chgrp $RRDCACHED_GROUP "$SOCKETDIR"
		;;
	esac
	case "$RRDCACHED_CHROOT_DIR" in 
		/tmp)
			echo "Warning: starting with chroot dir $RRDCACHED_CHROOT_DIR" >&2
		;;
		*)
			check_and_create_dir "$RRDCACHED_CHROOT_DIR"
			chown $RRDCACHED_USER:$RRDCACHED_GROUP "$RRDCACHED_CHROOT_DIR"
		;;
	esac
	/sbin/startproc -u $RRDCACHED_USER $RRDCACHED_BIN 	\
								-s $RRDCACHED_GROUP \
								-b "$RRDCACHED_CHROOT_DIR" \
								-p "$RRDCACHED_PID" \
								-l $RRDCACHED_ADDRESS \
								-m $RRDCACHED_SOCKET_MASK \
								-w $RRDCACHED_DISKWRITE \
								-z $RRDCACHED_DELAY \
								-t $RRDCACHED_WRITE_THREADS \
								$RRDCACHED_OPTIONS
    # workaround for wrong socket ownership and permission after stArt
    case "$RRDCACHED_ADDRESS" in
        ^unix:)
            SOCKET=${RRDCACHED_ADDRESS/unix:/}
            chown $RRDCACHED_USER:$RRDCACHED_GROUP "$SOCKET"
            chmod $RRDCACHED_SOCKET_MASK "$SOCKET"
        ;;
    esac

	rc_status -v
	;;
    stop)
	echo -n "Shutting down rrdcached "
	/sbin/killproc -p $RRDCACHED_PID -t 10 $RRDCACHED_BIN
	rc_status -v
	;;
    try-restart|condrestart)
	if test "$1" = "condrestart"; then
		echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
	fi
	$0 status
	if test $? = 0; then
		$0 restart
	else
		rc_reset	# Not running is not a failure.
	fi
	rc_status
	;;
    restart)
	$0 stop
	$0 start
	rc_status
	;;
    force-reload)
	echo -n "Reload service rrdcached "
	/sbin/killproc -p $RRDCACHED_PID -HUP $RRDCACHED_BIN
	rc_status -v
	;;
    reload)
	echo -n "Reload service rrdcached "
	/sbin/killproc -p $RRDCACHED_PID -HUP $RRDCACHED_BIN
	rc_status -v
	;;
    status)
	echo -n "Checking for service rrdcached "
	/sbin/checkproc $RRDCACHED_BIN
	rc_status -v
	;;
    probe)
	test $RRDCACHED_CONFIG -nt $RRDCACHED_PID && echo reload
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
	exit 1
	;;
esac
rc_exit
