#!/bin/bash
# --
# otrs-scheduler-linux - provides Scheduler init control on linux
# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU AFFERO General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
# or see http://www.gnu.org/licenses/agpl.txt.
# --
# This file is based on
# Linux Additions Guest Additions service daemon init script.
# From Oracle Virtual Box
# --

# chkconfig: - 80 10
# description: OTRS scheduler.
### BEGIN INIT INFO
# Provides:       otrs-scheduler-linux
# Default-Start:  3 5
# Default-Stop:   0 1 6
# Required-Start: $ALL
# Required-Stop:
# Short-Description: Start/stop OTRS Scheduler.
### END INIT INFO
#-----------------------------------------------------------------------
# User defined variables
OTRS_HOME=/opt/otrs
User=otrs
Group=otrs
# User and Group needs to be the same as the apache user and group
# set on apache configuration
#----------------------------------------------------------------------

PATH=$PATH:/bin:/sbin:/usr/sbin
prog=otrs-scheduler
# set Scheduler script
Scheduler=$OTRS_HOME/bin/otrs.Scheduler.pl

# Regular expressions
RegExDigit="[0-9]+"

#Check user and group
TestUID=$(id -u $User)

if [[ ! $TestUID =~ $RegExDigit ]]; then
    echo "The user ${User} does not exist in this system."
    exit 1
fi

test `getent group | awk -F : '{print $1}' |grep "^${Group}$"` || {
    echo "The group ${Group} does not exist in this system."
    exit 1
}

CanRun() {

    # check if scheduler can be run
    test -x "$Scheduler" || {
        echo "Cannot run $Scheduler"
        exit 1
    }
}

# check if scheduler can be run
CanRun

# set Scheduler PID
STATUS=$("$Scheduler" -a status)

# remove any non numeric character like in "Running 123"
PID=${STATUS//[^0-9]/}

# set OS
system=unknown
if [ -f /etc/redhat-release ]; then
    system=redhat
elif [ -f /etc/SuSE-release ]; then
    system=suse
elif [ -f /etc/debian_version ]; then
    system=debian
elif [ -f /etc/gentoo-release ]; then
    echo "Gentoo is detected, this script does not run correctly on gentoo."
    echo "Please run otrs-scheduler-gentoo instead!"
    exit 1
else
    system=other
fi

# define special routines for each OS
if [ "$system" = "redhat" ]; then
    . /etc/init.d/functions
    fail_msg() {
        echo_failure
        echo
    }

    succ_msg() {
        echo_success
        echo
    }

    begin() {
        echo -n "$1"
    }
fi

if [ "$system" = "suse" ]; then
    . /etc/rc.status
    daemon() {

        # in openSUSE 11.3 this value returns 7, and should return 0
        # in openSUSE 11.4 this is fixed and returns 0
        startproc -u $User $Scheduler -a start
    }

    # this is part of openSUSE 11.3 workaround since it can't find the process
    # it can't stop it, so a forced killed is needed in a redefined killproc()
    # when openSUSE 11.3 will reach end of support killproc() can be deleted
    killproc(){

        # send kill signal to scheduler to proper stop
        if [[  $PID =~ $RegExDigit ]]; then
            kill -2 $PID > /dev/null
        fi
    }

    fail_msg() {
        rc_failed 1
        rc_status -v
    }

    succ_msg() {
        rc_reset
        rc_status -v
    }

    begin() {
        echo -n "$1"
    }
fi

if [ "$system" = "debian" ]; then
    daemon() {
        start-stop-daemon --start --chuid $User:$Group --exec $Scheduler -- -a start
    }

    killproc() {
        start-stop-daemon --stop --name otrs.Scheduler. --signal 2
    }

    fail_msg() {
        echo " ...fail!"
    }

    succ_msg() {
        echo " ...done."
    }

    begin() {
        echo -n "$1"
    }
fi

if [ "$system" = "other" ]; then
    fail_msg() {
        echo " ...fail!"
    }

    succ_msg() {
        echo " ...done."
    }

    begin() {
        echo -n "$1"
    }
fi

start() {

    # check scheduler is not running
    if [[ ! $PID =~ $RegExDigit ]]; then
        begin "Starting OTRS Scheduler";

        # start Scheduler
        daemon  --user $User "${Scheduler} -a start" > /dev/null
        RETVAL=$?

        # check if Scheduler start successfully and display success message
        if [ $RETVAL -eq 0 ]; then
            succ_msg

        # otherwise display fail message
        else

            # workaround OpenSUSE 11.3 returns 7 because it can't find the process
            if [ "$system" = "suse" -a $RETVAL -eq 7 ]; then
               RETVAL=0
               succ_msg
            else
               fail_msg
            fi
        fi

    # otherwise can't run it again
    else
       begin "OTRS Scheduler is already running ${PID}"
       fail_msg
       return 1
    fi

    # create lock file so redhat can stop service at reboot or halt
    if [ "$system" = "redhat" ]; then
        touch /var/lock/subsys/otrs-scheduler-linux
    fi
    return $RETVAL
}

stop() {

    # check if Scheduler is running
    if [[ $PID =~ $RegExDigit ]]; then
        begin "Stopping OTRS Scheduler";

        # stop Scheduler
        killproc $Scheduler -2
        RETVAL=$?

        # query Scheduler PID again to check id is stopped
        STATUS=$("$Scheduler" -a status)

        # remove any non numeric character like in "Running 123"
        PID=${STATUS//[^0-9]/}

        # check if still running
        if [[  $PID =~ $RegExDigit ]]; then
            fail_msg

        # otherwise is stopped
        else
            succ_msg
        fi
    else
        begin "Scheduler is already stopped"
        succ_msg
    fi

    # remove lock file for redhat
    if [ "$system" = "redhat" ]; then
        rm -f /var/lock/subsys/otrs-scheduler-linux
    fi
    return $RETVAL
}

restart() {
    stop && start
}

status() {
    echo -n "Checking for OTRS Scheduler"

    # check if scheduler returns a numeric PID
    if [[ $PID =~ $RegExDigit ]]; then
        echo " ...running ${PID}"

    #otherwise is not running
    else
        echo " ...not running"
    fi
}

# call the right function
case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status
    ;;
setup)
    ;;
cleanup)
    ;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
esac

exit $RETVAL
