#!/bin/sh
# Tripwire Axon Agent
#
# chkconfig: 2345 90 1
# description: Agent software for the Tripwire family of compliance and security products.
# processname: twagent
# pidfile: /var/lock/tripwire/twagent.pid

### BEGIN INIT INFO
# Provides: tripwire-axon-agent
# Required-Start:
# Should-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Tripwire Axon Agent
# Description: Agent software for the Tripwire family of compliance and security products.
### END INIT INFO

SERVICE_NAME=$(basename "$0")
SERVICE="Tripwire Axon Agent"

# the three following values are edited by the postinstall script if the install is relocated
OPT_DIR="/opt/tripwire"
VAR_DIR="/var"
ETC_DIR="/etc/tripwire"

AGENT_DIR="${OPT_DIR}/agent"
PLUGINS_DIR="${AGENT_DIR}/plugins"
TOOLS_DIR="${AGENT_DIR}/tools"
DAEMON_NAME=twagent
DAEMON="${AGENT_DIR}/${DAEMON_NAME}"
PID_FILE="${VAR_DIR}/lock/tripwire/twagent.pid"
RETVAL=0

set_SUSE_locale_environment()
{

    # /etc/sysconfig/language contains all locale settings on SUSE
    # all locale variables in the "language" have format "RC_..."
    # source the file and update the locale settings
    . /etc/sysconfig/language
    # Restore system language environment
    if [ "X$ROOT_USES_LANG" != "Xno" ] ; then
        locale_vars="     \
        LANG              \
        LC_CTYPE          \
        LC_NUMERIC        \
        LC_TIME           \
        LC_COLLATE        \
        LC_MONETARY       \
        LC_MESSAGES       \
        LC_PAPER          \
        LC_NAME           \
        LC_ADDRESS        \
        LC_TELEPHONE      \
        LC_MEASUREMENT    \
        LC_IDENTIFICATION \
        LC_ALL"


        unset LC_ALL
        for lc in $locale_vars
        do
            eval val="\$RC_$lc"
            if test -n "$val"; then
                eval $lc="\$RC_$lc"
                export $lc
            fi
        done
        unset lc val
         
        # LC_CTYPE needs to be set to if ROOT_USES_LANG = ctype
        if [ "X$ROOT_USES_LANG" = "Xctype" -a -n "{$LANG}" ] ; then
            LC_CTYPE=${LANG}
            export LC_CTYPE
        fi
    fi

    # Make sure LC_CTYPE is set
    # LC_CTYPE needs a value, so mblrlen() etc. will work properly
    # under multibyte character encodings.
    if [ -z "${LC_CTYPE}" -a -n "${LANG}" ]; then
        LC_CTYPE="${LANG}"
        export LC_CTYPE
    fi

}

set_RHEL_locale_environment()
{
    # /etc/sysconfig/i18n contains all locale settings on REDHAT (in particular LANG variable)
    if [ -s "/etc/sysconfig/i18n" ]; then
        . /etc/sysconfig/i18n
    fi
}

#  a hacked version of status() from /etc/rc.d/init.d/functions
#
status_service_name() {
        local base pid lock_file= pid_file=

        # Test syntax.
        base=${1##*/}

        if [ "$_use_systemctl" = "1" ]; then
                systemctl status ${0##*/}.service
                ret=$?
                # LSB daemons that dies abnormally in systemd looks alive in systemd's eyes due to RemainAfterExit=yes
                # lets adjust the reality a little bit
                if systemctl show -p ActiveState ${0##*/}.service | grep -q '=active$' && \
                systemctl show -p SubState ${0##*/}.service | grep -q '=exited$' ; then
                        ret=3
                fi
                return $ret
        fi

        # First try "pidof"
        __pids_var_run "$1" "$pid_file"
        RC=$?
        if [ -z "$pid_file" -a -z "$pid" ]; then
                pid="$(__pids_pidof "$1")"
        fi
        if [ -n "$pid" ]; then
                echo $"${SERVICE} (pid $pid) is running..."
                return 0
        fi

        case "$RC" in
                0)
                        echo $"${SERVICE} (pid $pid) is running..."
                        return 0
                        ;;
                1)
                        echo $"${SERVICE} dead but pid file exists"
                        return 1
                        ;;
                4)
                        echo $"${SERVICE} status unknown due to insufficient privileges."
                        return 4
                        ;;
        esac
        if [ -z "${lock_file}" ]; then
                lock_file=${base}
        fi
        # See if /var/lock/subsys/${lock_file} exists
        if [ -f /var/lock/subsys/${lock_file} ]; then
                echo $"${SERVICE} dead but subsys locked"
                return 2
        fi
        echo $"${SERVICE} is stopped"
        return 3
}

if [ -f /lib/lsb/init-functions ]; then


    . /lib/lsb/init-functions
    if grep -Rqs "SUSE" /etc/*release; then
        set_SUSE_locale_environment
    elif grep -Rqs "Red Hat" /etc/*release || grep -Rqs "CentOS" /etc/*release; then 
        set_RHEL_locale_environment
    fi

    alias START_DAEMON=start_daemon
    alias STATUS=pidofproc_status
    alias LOG_SUCCESS=log_success_msg
    alias LOG_FAILURE=log_failure_msg
    alias LOG_WARNING=log_warning_msg
elif [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions

    if grep -Rqs "Red Hat" /etc/*release || grep -Rqs "CentOS" /etc/*release; then
        set_RHEL_locale_environment
    fi

    alias START_DAEMON=daemon
    alias STATUS=status_service_name
    alias LOG_SUCCESS=success
    alias LOG_FAILURE=failure
    alias LOG_WARNING=passed
else
    echo "Error: Your platform is not supported by $0" > /dev/stderr
    exit 1
fi

pidofproc_status()
{
    pidofproc -p "${PID_FILE}" "${DAEMON_NAME}" 2>&1 > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        LOG_SUCCESS "${SERVICE} is running"
    else
        LOG_SUCCESS "${SERVICE} is not running"
    fi
    return $RETVAL
}

# if /var has been moved, we need to pass options to twagent
set_var_dir_options()
{
    VAR_DIR_OPTS=""
    if [[ "${VAR_DIR}" != "/var" ]]; then
        VAR_DIR_OPTS="--data.dir=\"${VAR_DIR}/cache/tripwire\" --lock.dir=\"${VAR_DIR}/lock/tripwire\" --log.dir=\"${VAR_DIR}/log/tripwire\" --spool.dir=\"${VAR_DIR}/spool/tripwire\""
    fi
}

# if /etc/tripwire has been moved, we need to pass options to twagent
set_etc_tripwire_dir_options()
{
    ETC_TRIPWIRE_DIR_OPTS=""
    if [[ "${ETC_DIR}" != "/etc/tripwire" ]]; then
        ETC_TRIPWIRE_DIR_OPTS="--config.dir=\"${ETC_DIR}\""
    fi
}

if [ ! -x "${DAEMON}" ]; then
    LOG_FAILURE "Error: ${DAEMON} is not executable"
    exit 1
fi

case "$1" in
    start)
        echo -n "Starting $SERVICE ..."
        set_var_dir_options
        set_etc_tripwire_dir_options
        START_DAEMON "${DAEMON}" --service.mode=true --service.type="SysV" --agent.dir="\"${AGENT_DIR}\"" --plugins.dir="\"${PLUGINS_DIR}\"" --tools.dir="\"${TOOLS_DIR}\"" $VAR_DIR_OPTS $ETC_TRIPWIRE_DIR_OPTS
        RETVAL=$?
        echo
        ;;
    stop)
        echo -n "Stopping $SERVICE daemon: "
        killproc -p "${PID_FILE}" "${DAEMON_NAME}"
        RETVAL=$?
        rm -f "${PID_FILE}"
        echo
        ;;
    status)
        STATUS "${DAEMON_NAME}"
        RETVAL=$?
        ;;
    restart)
        "$0" stop
        "$0" start
        RETVAL=$?
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|force-reload}"
        exit 1
        ;;
esac

exit ${RETVAL}

