#!/bin/bash
#
# carbon-cache - This script starts and stops the carbon-cache service.
#
# chkconfig:   - 85 15
# description: carbon-cache accepts graphite metrics and writes them to
#              disk using whisper
# processname: carbon-cache.py
# config:      /etc/sysconfig/carbon-cache

# Systemctl ? uh NO I mane
SYSTEMCTL_SKIP_REDIRECT=1

umask 0022

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

exec="/opt/graphite/bin/carbon-cache.py"
prog=$(basename "$exec")
CARBON_CONFIG_PATH="/opt/graphite/conf/carbon.conf"
CARBON_CACHE_ARGS=""
CARBON_CACHE_PIDFILE="/opt/graphite/storage/carbon-cache-a.pid"
IOSTATS_COLLECTOR_PIDFILE="/opt/graphite/storage/iostats_collector.pid"
GATHERER_PID_FILE="/var/run/shinken/gatherer.pid"
GRAPHITE_STORAGE_DIR="/opt/graphite/storage"

if [ -f /etc/sysconfig/carbon-cache ]; then
    . /etc/sysconfig/carbon-cache
fi

export GRAPHITE_STORAGE_DIR

SETCOLOR_NOTE="echo -en \\033[1;34m"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"

set_whisper_right() {
    find ${GRAPHITE_STORAGE_DIR}/whisper -maxdepth 1 -type d ! -perm 755 -exec chmod -R 755 {} \;

    carbon_user=$(grep "^USER =" ${CARBON_CONFIG_PATH} | awk -F ' = ' '{print $2}')
    if [[ -z ${carbon_user} ]]; then
        carbon_user=root
    fi
    find ${GRAPHITE_STORAGE_DIR}/whisper -maxdepth 1 -type d ! -user ${carbon_user} -exec chown -R ${carbon_user} {} \;
}

restart() {
    stop
    start
}

rh_status() {
    status -p "$CARBON_CACHE_PIDFILE" "$prog"
}

start() {
    # Important: as carbon-cache can be start BEFORE shinken, then check that the run dir does exists
    SHINKEN_RUN_DIR=/var/run/shinken
    [ ! -d $SHINKEN_RUN_DIR ] && mkdir -p $SHINKEN_RUN_DIR && chown shinken:shinken $SHINKEN_RUN_DIR

    # We need to save iostats when carbon-cache is running
    # so we are using the gatherer "daemon" for this
    # IMPORTANT: we DO NOT WANT any ld_preload here, as the collector will
    # load the vmware lib, and this one is... sensible to malloc/free/mprotect changes
    export LD_PRELOAD=''
    if [ ! -f $GATHERER_PID_FILE ];then
       $SETCOLOR_NOTE
       printf "IMPORTANT:"
       $SETCOLOR_NORMAL
       printf " The shinken-gatherer (computing statistics for other daemon in background) was not started.\n  => Have a look to /var/log/shinken/gatherer.log for troubleshoot.\n"
       echo  "Starting gatherer:"
       python /var/lib/shinken/libexec/tools/shinken-gatherer.py >/dev/null 2>/dev/null &
       printf "[   (id:0) gatherer                                  ] : "
       $SETCOLOR_SUCCESS
       printf "[Started: initialisation ongoing]"
       $SETCOLOR_NORMAL
       echo ""
       echo ""
    fi
    echo -n 'Starting carbon-cache...'
    set_whisper_right
    daemon --pidfile="$CARBON_CACHE_PIDFILE" "$exec" start $args --config="$CARBON_CONFIG_PATH" >/dev/null
    retval=$?
    echo
    return $retval
}

stop() {
    echo -n 'Stopping carbon-cache...'
    # kill old iostats_collector before but only if it exists
    if [[ -f "$IOSTATS_COLLECTOR_PIDFILE" ]];then
       kill $(cat "$IOSTATS_COLLECTOR_PIDFILE")
    fi
    killproc -p "$CARBON_CACHE_PIDFILE" "$prog"
    retval=$?
    echo
    return $retval
}

case $1 in
    condrestart|try-restart)
        rh_status 2>/dev/null && restart
        ;;
    reload|force-reload)
        restart
        ;;
    restart)
        restart
        ;;
    start)
        start
        ;;
    status)
        rh_status
        ;;
    status_q)
        rh_status >/dev/null 2>&1
        ;;
    stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
        ;;
esac

exit $?
