#!/bin/sh

# Copyright 2023-2025 Citrix Systems, Inc. All rights reserved.
# This software and documentation contain valuable trade
# secrets and proprietary property belonging to Citrix Systems, Inc.
# None o1f this software and documentation may be copied,
# duplicated or disclosed without the express
# written permission of Citrix Systems, Inc.

MONITRC=/etc/monitrc
MONITD_FOLDER=/etc/monit.d/
PID_DIR=/var/run

NGAPI_MONITRC_FILE=ngapi_daemons_monitrc
NGAPI_MONITRC=/var/nextgen/infra/scripts/${NGAPI_MONITRC_FILE}

EVENTPROCESSOR_EXEC_PATH=ngapi_eventprocessor.main
EVENTPROCESSOR_PID_FILE=${PID_DIR}/ngapi_eventprocessor.pid

PROXY_DAEMON_EXEC_PATH=ngapi_proxy_helper.main
PROXY_DAEMON_PID_FILE=${PID_DIR}/ngapi_proxy_helper.pid
PROXY_DAEMON_MONITRC_FILE=ngapi_proxydaemon_monitrc
PROXY_DAEMON_MONITRC=/var/nextgen/infra/scripts/${PROXY_DAEMON_MONITRC_FILE}

NS_HASTATUSD_MONITRC_FILE=ns_hastatusd_monitrc
NS_HASTATUSD_MONITRC=/var/nextgen/infra/scripts/${NS_HASTATUSD_MONITRC_FILE}

# HA DAEMON
CONFIGSUPPLIER_EXEC_PATH=ngapi_configsupplier.main
CONFIGSUPPLIER_PID_FILE=${PID_DIR}/ngapi_configsupplier.pid
CONFIGSUPPLIER_MONITRC_FILE=ngapi_configsupplier_monitrc
CONFIGSUPPLIER_MONITRC=/var/nextgen/infra/scripts/${CONFIGSUPPLIER_MONITRC_FILE}

NO_RELOAD_MONIT="NO_RELOAD_MONIT"

usage()
{
    echo "This script is used to start and stop nextgenapi daemons, and/or enable or disable"
    echo "its monitoring by monit. Following options are there:"
    echo "/bin/sh ngapi_daemons_ctl ncore_start - Start daemons and monitoring for NCORE deployment (EVENT MANAGER + CONFIGWORKER + CONFIGAPPLIER)" 
    echo "/bin/sh ngapi_daemons_ctl ha_daemons_start - Start daemons and monitoring for HA deployment (NCORE DAEMONS + CONFIGSUPPLIER)"
    echo "/bin/sh ngapi_daemons_ctl all_stop - Stops all daemons and monitoring in all deployment modes"

    echo "PROXY DAEMON:"
    echo "/bin/sh ngapi_daemons_ctl proxydaemon_start - Starts proxydaemon"
    echo "/bin/sh ngapi_daemons_ctl proxydaemon_stop - Stops proxydaemon"
    echo "/bin/sh ngapi_daemons_ctl proxydaemon_start_with_monit - Starts proxydaemon and its monitoring"
    echo "/bin/sh ngapi_daemons_ctl proxydaemon_stop_with_monit - Stops proxydaemon and its monitoring"

    echo "NCORE DAEMONS:"
    echo "/bin/sh ngapi_daemons_ctl eventprocessor_start - Starts eventprocessor daemon"
    echo "/bin/sh ngapi_daemons_ctl eventprocessor_stop - Stops eventprocessor daemon"

    # HA PROCS
    echo "HA DAEMONS:"
    echo "/bin/sh ngapi_daemons_ctl configsupplier_start - Starts configsupplier daemon"
    echo "/bin/sh ngapi_daemons_ctl configsupplier_stop - Stops configsupplier daemon"

    echo "/bin/sh ngapi_daemons_ctl ns_hastatusd_start - Starts nshastatusd daemon and its monitoring"
    echo "/bin/sh ngapi_daemons_ctl ns_hastatusd_stop - Stops nshastatusd daemon and its monitoring"

    echo "/bin/sh ngapi_daemons_ctl help - Usage help"
}

daemon_start()
{
    EXEC_PATH=$1
    PID_FILE=$2
    SLEEP=0
    if [ -n "$3" ]; then
        SLEEP=$3
    fi
    echo 'daemon_start : '${EXEC_PATH}''
    pid=`ps -axww | grep ${EXEC_PATH}| grep -v grep|awk '{print $1}'`
    echo "PID: ${pid}"
    if [ "$pid" == "" ]; then
        /var/python/bin/python -m ${EXEC_PATH} &
        echo -n $! > ${PID_FILE}
        echo "sleep for ${SLEEP} seconds"
        sleep ${SLEEP}
    fi
}

daemon_stop()
{
    EXEC_PATH=$1
    PID_FILE=$2
    echo 'daemon_stop : '${EXEC_PATH}''
    pid=`ps -axww | grep ${EXEC_PATH}| grep -v grep|awk '{print $1}'`
    echo "PID: ${pid}"
    if [ "$pid" != "" ]; then
        kill -s TERM ${pid}
    fi
    rm -f ${PID_FILE}
}

eventprocessor_start()
{
    daemon_start ${EVENTPROCESSOR_EXEC_PATH} ${EVENTPROCESSOR_PID_FILE} $1;
}

eventprocessor_stop()
{
    daemon_stop ${EVENTPROCESSOR_EXEC_PATH} ${EVENTPROCESSOR_PID_FILE};
}

proxydaemon_start()
{
    daemon_start ${PROXY_DAEMON_EXEC_PATH} ${PROXY_DAEMON_PID_FILE} $1;
}

proxydaemon_stop()
{
    daemon_stop ${PROXY_DAEMON_EXEC_PATH} ${PROXY_DAEMON_PID_FILE};
}

configsupplier_start()
{
    daemon_start ${CONFIGSUPPLIER_EXEC_PATH} ${CONFIGSUPPLIER_PID_FILE} $1;
}

configsupplier_stop()
{
    daemon_stop ${CONFIGSUPPLIER_EXEC_PATH} ${CONFIGSUPPLIER_PID_FILE};
}

configsupplier_sigusr1_or_start()
{
    pid=`ps -axww | grep ${CONFIGSUPPLIER_EXEC_PATH}| grep -v grep|awk '{print $1}'`
    echo "PID: ${pid}"
    if [ "$pid" == "" ]; then
        configsupplier_start
    else
       kill -SIGUSR1 $pid
    fi
}

ncore_daemons_sigusr1_or_start()
{
    pid=`ps -axww | grep ${EVENTPROCESSOR_EXEC_PATH}| grep -v grep|awk '{print $1}'`
    echo "PID: ${pid}"
    if [ "$pid" == "" ]; then
        eventprocessor_start 1;
    else
       kill -SIGUSR1 $pid
    fi
}

ncore_daemons_start()
{
    eventprocessor_start 1;
}

ncore_daemons_stop()
{
    eventprocessor_stop;
}

ns_hastatusd_start()
{
    echo "Starting ns_hastatusd via /etc/nshastatusd_ctl"
    /bin/sh /etc/nshastatusd_ctl start
}

ns_hastatusd_stop()
{
    echo "Stopping ns_hastatusd via /etc/nshastatusd_ctl"
    /bin/sh /etc/nshastatusd_ctl stop
}

proc_monit_start()
{
    MONITRC=$1
    IS_RELOAD_MONIT=$2
    cp ${MONITRC} ${MONITD_FOLDER}
    if [ "$IS_RELOAD_MONIT" = "NO_RELOAD_MONIT" ]; then
        echo "No need to reload monit";
    else
        killall -HUP monit
    fi
}

proc_monit_stop()
{
    MONITRC_FILE=$1
    IS_RELOAD_MONIT=$2
    # if monitrc file exists, remove it and reload monit
    if [ -f "${MONITD_FOLDER}/${MONITRC_FILE}" ]; then
        rm -f ${MONITD_FOLDER}/${MONITRC_FILE}
        if [ "$IS_RELOAD_MONIT" = "NO_RELOAD_MONIT" ]; then
            echo "No need to reload monit";
        else
            killall -HUP monit
        fi
    fi
}

reload_monit()
{
     killall -HUP monit
}

ncore_monit_start()
{
    proc_monit_start ${NGAPI_MONITRC} $1
}

ncore_monit_stop()
{
    proc_monit_stop ${NGAPI_MONITRC_FILE} $1
}

configsupplier_monit_start()
{
    proc_monit_start ${CONFIGSUPPLIER_MONITRC} $1
}

configsupplier_monit_stop()
{
    proc_monit_stop ${CONFIGSUPPLIER_MONITRC_FILE} $1
}

proxydaemon_monit_start()
{
    proc_monit_start ${PROXY_DAEMON_MONITRC} $1
}

proxydaemon_monit_stop()
{
    proc_monit_stop ${PROXY_DAEMON_MONITRC_FILE} $1
}

ns_hastatusd_monit_start()
{
   proc_monit_start ${NS_HASTATUSD_MONITRC} $1
}

ns_hastatusd_monit_stop()
{
   proc_monit_stop ${NS_HASTATUSD_MONITRC_FILE} $1
}

case $1 in
proxydaemon_start)
        proxydaemon_start;
        ;;
proxydaemon_stop)
        proxydaemon_stop;
        ;;
proxydaemon_start_with_monit)
        proxydaemon_start;
        proxydaemon_monit_start;
        ;;
proxydaemon_stop_with_monit)
        proxydaemon_monit_stop;
        sleep 2;
        proxydaemon_stop;
        ;;
eventprocessor_start)
        eventprocessor_start;
        ;;
eventprocessor_stop)
        eventprocessor_stop;
        ;;
configsupplier_start)
        configsupplier_start;
        ;;
configsupplier_stop)
        configsupplier_stop;
        ;;
ncore_start)
        # stop monitoring
        configsupplier_monit_stop;
        sleep 2;
        # stop daemons
        configsupplier_stop;
        # start daemons
        ncore_daemons_start;
        # start monitoring
        ncore_monit_start;
        ;;
ha_primary_start)
        # start daemons
        ncore_daemons_sigusr1_or_start;
        configsupplier_sigusr1_or_start;
        # start monitoring
        configsupplier_monit_start $NO_RELOAD_MONIT;
        ncore_monit_start $NO_RELOAD_MONIT;
        reload_monit;
        ;;
ha_secondary_start)
        # stop monitoring
        ncore_daemons_sigusr1_or_start;
        sleep 2;
        # stop daemons
        configsupplier_sigusr1_or_start;
        configsupplier_monit_start;
        ncore_monit_start $NO_RELOAD_MONIT;
        reload_monit;
        ;;
all_stop)
        # stop monitoring
        configsupplier_monit_stop $NO_RELOAD_MONIT;
        ncore_monit_stop $NO_RELOAD_MONIT;
        reload_monit;
        sleep 2;
        # stop daemons
        configsupplier_stop;
        ncore_daemons_stop;
        ;;
ns_hastatusd_start)
        ns_hastatusd_start;
        ns_hastatusd_monit_start;
        ;;
ns_hastatusd_stop)
        ns_hastatusd_monit_stop;
        ns_hastatusd_stop;
        ;;
help)
        usage;
        ;;
*)
        echo "ngapi_daemons_ctl: no argument";
;;
esac
