#!/bin/bash
#
######################################################################
#
# Copyright (C) 2002-2006 Intel Corporation.  All Rights Reserved.
# All names, products, and services mentioned herein are the
# trademarks or registered trademarks of their respective
# organizations and are the sole property of their respective
# owners.
#####################################################################
#	description: Startup for Intel Dialogic IP Media CLI
####################################################################
# Short-Description: Master start/stop script for Intel Dialogic IP
# Description: This script starts or stops all programs associated with
#	Intel IP Media CLI. 

# Global Return Codes
PROG_RUNNING=0
PROG_DEADPID=1
PROG_DEADLOC=2
PROG_STOPPED=3
PROG_UNKNOWN=4

####################################################################
# Defines
####################################################################

MASTERCFG=${INTEL_DIALOGIC_CFG}/.mastercfg
TEMP_FILE="/tmp/.temp"
SUCCESS=$PROG_RUNNING
FAILURE=$PROG_STOPPED

CT_INTEL=/etc/init.d/ct_intel

####################################################################
# cleanup before exit
####################################################################
clean_up_before_exit() {

delete_file "$TEMP_FILE"

}

####################################################################
# delete temporary file
####################################################################
delete_file () {

if [ -e "$1" ] ; then
  rm -f "$1"
fi

}

####################################################################
# settings for RedHat Linux Interface
# used as Default Interface
####################################################################
set_redhat_lsb_interface()
{
	dl_start_daemon="/etc/redhat-lsb/lsb_start_daemon"
	dl_stop_daemon="/etc/redhat-lsb/lsb_killproc"
	dl_pidofproc="/etc/redhat-lsb/lsb_pidofproc"
	dl_log_success_msg="/etc/redhat-lsb/lsb_log_message success"
	dl_log_failure_msg="/etc/redhat-lsb/lsb_log_message failure"
	dl_log_warning_msg="/etc/redhat-lsb/lsb_log_message warning"
	. /etc/rc.d/init.d/functions &> /dev/null
	dl_status="status"
}

####################################################################
# settings for SuSe Linux Interface
####################################################################
set_suse_lsb_interface()
{
	. /lib/lsb/init-functions
	dl_start_daemon="/sbin/start_daemon"
	dl_stop_daemon="/sbin/killproc"
	dl_pidofproc="/sbin/pidofproc"
	dl_status="/sbin/checkproc"
	dl_log_success_msg=log_success_msg
	dl_log_failure_msg=log_failure_msg
	dl_log_warning_msg=log_warning_msg
}

####################################################################
# set the proper lsb interface
# Add Different Versions of Linux Here
####################################################################
set_lsb_interface()
{

	OS_RELEASE_NAME=${MACHTYPE#*-}
	OS_RELEASE_TYPE=${OS_RELEASE_NAME%%-*}

	if [ "${OS_RELEASE_TYPE}" = "suse" ] ; then
		set_suse_lsb_interface	
	elif [ "${OS_RELEASE_TYPE}" = "redhat" ] ; then
		set_redhat_lsb_interface
	else
		echo "Error Unrecognized Linux OS Release"
		exit 1
	fi
}

################################################################
# Generic Function to Start Server Pass in Program Name and Message
################################################################
dlg_server_start() {
   PROG="$1"
   PROGNAME=${1##*/}
   ARGS="$2"
   MSG="$3 ${MSG_SEP}"
   REQ="$4"
   CREATE_PID=0
   [ "$5" = "--create-pid-file" ] && CREATE_PID=1
   if [ -x ${PROG} ] ; then
      ulimit -S -c 0 >/dev/null 2>&1
      type -a runuser &> /dev/null
      if [ $? != 0 ] ; then
         su -s /bin/bash - -c "${PROG} ${ARGS} &>/dev/null &"
      else
         /sbin/runuser -s /bin/bash - -c "${PROG} ${ARGS} &>/dev/null &"
      fi
      sleep 1
      ${dl_status} ${PROG} &> /dev/null
      RC=$?
      case $RC in
         '0' )
            ${dl_log_success_msg} "${MSG}"
            RC=$PROG_RUNNING
            [ ${CREATE_PID} -eq 1 ] && pidof ${PROGNAME} \
                                      > /var/run/${PROGNAME}.pid 2> /dev/null
            ;;
         '1' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADPID
            ;;
         '2' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADLOC
            ;;
         '3' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_STOPPED
            ;;
      esac
   elif [ "${REQ}" = "1" ] ; then
      ${dl_log_failure_msg} ${MSG}
      RC=$PROG_UNKNOWN
   else
      RC=$SUCCESS
   fi

   return $RC
}

################################################################
# Function to Start Web Server Pass in Program Name and Message
################################################################
dlg_server_start_web() {
   PROG="$1"
   PROGNAME=${1##*/}
   ARGS="$2"
   MSG="$3 ${MSG_SEP}"
   REQ="$4"
   CREATE_PID=0
   [ "$5" = "--create-pid-file" ] && CREATE_PID=1
   if [ -x ${PROG} ] ; then
      ulimit -S -c 0 >/dev/null 2>&1
      type -a runuser &> /dev/null
      if [ $? != 0 ] ; then
         su -s /bin/bash - -c "cd ${INTEL_DIALOGIC_WEBAGENT}; ./${PROGNAME} ${ARGS} &>/dev/null &"
      else
         /sbin/runuser -s /bin/bash - -c "cd ${INTEL_DIALOGIC_WEBAGENT}; ./${PROGNAME} ${ARGS} &>/dev/null &"
      fi
      sleep 1
      ${dl_status} ${PROG} &> /dev/null
      RC=$?
      case $RC in
         '0' )
            ${dl_log_success_msg} "${MSG}"
            RC=$PROG_RUNNING
            [ ${CREATE_PID} -eq 1 ] && pidof ${PROGNAME} \
                                      > /var/run/${PROGNAME}.pid 2> /dev/null
            ;;
         '1' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADPID
            ;;
         '2' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADLOC
            ;;
         '3' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_STOPPED
            ;;
      esac
   elif [ "${REQ}" = "1" ] ; then
      ${dl_log_failure_msg} ${MSG}
      RC=$PROG_UNKNOWN
   else
      RC=$SUCCESS
   fi

   return $RC
}

################################################################
# Generic Function to Stop Server Pass in Program Name and Message 
# Caution: If any change in this function, dlg_stop_server_bw()
# must be changed as well.
################################################################
dlg_server_stop() {

   PROG="$1"
   PROGNAME=${1##*/}
   MSG="$2 ${MSG_SEP}"
   REQ="$3"
   if [ -x ${PROG} ] ; then
      sleep 1
      ${dl_status} ${PROG} &> /dev/null
      RC=$?

      if [ $RC -eq 0 ] ; then
         #if -9 used, signal handler will not work to delete the pid file. 
         killall -e  ${PROG} &> /dev/null
         rm -f /var/run/${PROGNAME}.pid
      fi

      ${dl_status} ${PROG} &> /dev/null
      RC=$?
      case $RC in
         '3' )
            ${dl_log_success_msg} "${MSG}"
            RC=$PROG_STOPPED
            ;;
         '2' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADLOC
            ;;
         '1' )
            ${dl_log_failure_msg} "${MSG}"
            RC=$PROG_DEADPID
            ;;
         '0' )
            RC=$PROG_RUNNING
            ;;
      esac 
   elif [ "${REQ}" = "1" ] ; then
      ${dl_log_failure_msg} ${MSG}
      RC=$PROG_UNKNOWN
   else
      RC=$SUCCESS
   fi

   return $RC
}

################################################################
#Start NGMIT Board Manager
################################################################
update_port_values()
{
   file=$1
   searchString=$2
   replaceString=$3
   mod=$4

   #echo "file[$file]"
   #echo "search[$searchString] and replace with[$replaceString]"
   #echo
   sed -e"s/$searchString.*/$replaceString/g" < $file > $file.new
   mv -f $file.new $file
   rm -f $file.new
   chmod $mod $file
   
}

################################################################
#Start NGMIT Board Manager
################################################################
ngmit_bmserver_start()
{
   ARGS="-OAhost 127.0.0.1 -OAport 14000"
   MSG="Starting Board Manager Service"
   PROG=${INTEL_DIALOGIC_BIN}/bmserver
   REQ="1"
   dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}"
   RC=$?
   return ${RC}
}

################################################################
# Stopping NGMIT Board Manager
################################################################
ngmit_bmserver_stop()
{
   PROG="${INTEL_DIALOGIC_BIN}/bmserver"
   MSG="Shutting Down Board Manager Service"
   REQ="1"

   # Bring down ctplatform processes (devmapper, etc...)
   for cmd in ${INTEL_DIALOGIC_DIR}/init.d/ctplatform/order/*
   do
      $cmd stopall
   done

   dlg_server_stop "${PROG}" "${MSG}"
   RC=$?

   return ${RC}
}

################################################################
#Start NGMIT SNMP Agent 
################################################################
ngmit_snmpagent_start() 
{
   ARGS=" -sp ${SNMP_LISTENER} -st ${SNMP_TRAP_LISTENER} -D 1 -d ${INTEL_DIALOGIC_DIR}/ -l log/snmpagent.log"
   PROG=${INTEL_DIALOGIC_BIN}/snmpagent
   MSG="Starting SNMP Agent Service"
   REQ="$1"
   dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}" 
   RC=$?
   return $RC
}

################################################################
# Stopping NGMIT SNMP Agent
################################################################
ngmit_snmpagent_stop()
{
   PROG="${INTEL_DIALOGIC_BIN}/snmpagent"
   MSG="Shutting SNMP Agent Service"
   REQ="1"

   dlg_server_stop "${PROG}" "${MSG}" "${REQ}"
   RC=$?

   return ${RC}
}

################################################################
#Start NGMIT CLI Agent 
################################################################
ngmit_cliagent_start() 
{
   ARGS=" -ct ${CLI_LISTENER} -D 1 -d ${INTEL_DIALOGIC_DIR}/ -l log/cliagent.log"
   PROG=${INTEL_DIALOGIC_BIN}/cliagent
   MSG="Starting CLI Agent Service"
   REQ="$1"
	dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}" 
   RC=$?
   return $RC
}

################################################################
# Stopping NGMIT CLI Agent
################################################################
ngmit_cliagent_stop()
{
   PROG="${INTEL_DIALOGIC_BIN}/cliagent"
   MSG="Shutting CLI Agent Service"
   REQ="1"

   dlg_server_stop "${PROG}" "${MSG}" "${REQ}"
   RC=$?

   return ${RC}
}

################################################################
# Update NGMIT CLI Agent listening port
################################################################
ngmit_cliagent_setport()
{
   PORT=$1

   # break search and replace strings apart so that when we update
   # this file, they don't get effected.
   presearch="CLI_LISTENER"
   search=$presearch=
   prereplace="CLI_LISTENER"
   replace="$presearch=${PORT}"

   update_port_values "${CT_INTEL}" "${search}" "${replace}" "700"
   
   echo "CLI agent listener port updated to ${PORT}."
   return ${SUCCESS}
}

################################################################
# Update NGMIT SNMP Agent listening port
################################################################
ngmit_snmpagent_setport()
{
   PORT=$1

   # break search and replace strings apart so that when we update
   # this file, they don't get effected.
   presearch="SNMP_LISTENER"
   search=$presearch=
   prereplace="SNMP_LISTENER"
   replace="$presearch=${PORT}"

   update_port_values "${CT_INTEL}" "${search}" "${replace}" "700"
   
   echo "SNMP agent listener port updated to ${PORT}."
   return ${SUCCESS}
}

################################################################
# Update NGMIT SNMP Agent trap listening port
################################################################
ngmit_snmpagent_settrap()
{
   PORT=$1

   # break search and replace strings apart so that when we update
   # this file, they don't get effected.
   presearch="SNMP_TRAP_LISTENER"
   search=$presearch=
   prereplace="SNMP_TRAP_LISTENER"
   replace="$presearch=${PORT}"

   update_port_values "${CT_INTEL}" "${search}" "${replace}" "700"
   
   echo "SNMP agent trap listener port updated to ${PORT}."
   return ${SUCCESS}
}

################################################################
#Start NGMIT Web Agent
################################################################
ngmit_webagent_start()
{
   ARGS=" -port ${WEB_LISTENER}"
   PROG=${INTEL_DIALOGIC_WEBAGENT}/oamwebguiagent
   MSG="Starting Web Agent Service"
   REQ="$1"
   dlg_server_start_web "${PROG}" "${ARGS}" "${MSG}" "${REQ}"
   RC=$?
   return $RC

}

################################################################
# Stopping NGMIT Web Agent
################################################################
ngmit_webagent_stop()
{
   PROG=${INTEL_DIALOGIC_DIR}/web/html/oamwebguiagent
   MSG="Shutting Down Web Agent Service"
   REQ="1"

   dlg_server_stop "${PROG}" "${MSG}" "${REQ}"
   RC=$?

   return ${RC}
}


################################################################
# Update NGMIT Web Agent listening port
################################################################
ngmit_webagent_setport()
{
   PORT=$1

   # break search and replace strings apart so that when we update
   # this file, they don't get effected.
   presearch="WEB_LISTENER"
   search=$presearch=
   prereplace="WEB_LISTENER"
   replace="$presearch=${PORT}"

   update_port_values "${CT_INTEL}" "${search}" "${replace}" "700"
   
   echo "Web agent listener port updated to ${PORT}."
   return ${SUCCESS}
}


######################################################################
# Validate the input value for port
######################################################################
validate_port ()
{
   if [ -z "$1" ]		# NULL
   then
     return ${FAILURE}
   fi

   case $1 in
      *[!0-9]*|"") 		# !isdigit
         RC=${FAILURE};;
      * ) 
         RC=${SUCCESS} ;;
   esac
   return ${RC}
}
######################################################################
# Get OS release information
######################################################################
get_release_info()
{
   OS=`uname -s`
 
   if [ "${OS}" = "Linux" ] ; then
      if [ -f /etc/redhat-release ] ; then
         DIST='RedHat'
         PSUEDONAME=`cat /etc/redhat-release`
      elif [ -f /etc/SuSE-release ] ; then
         DIST="SuSE"
         PSUEDONAME=`cat /etc/SuSE-release`
      fi
   else
      #Unsupported OS
      DIST="UNKNOWN"
      PSUEDONAME="UNKNOWN"
   fi
}

usage ()
{
   echo "Usage: `basename $0` [cli|snmp] [start|stop|port]"
   echo "                   cli  [start|stop]      -- start/stop service"
   echo "                   cli  port [n]          -- update listener"
   echo "                   snmp [start|stop]      -- start/stop service"
   echo "                   snmp port [n]          -- update listener"
   echo "                   snmp trapport [n]      -- update trap source port"

   return
}

######################################################################
# Beginning of script execution
######################################################################

RETVAL=$SUCCESS
SAVEPATH=$PATH
set_lsb_interface
LSB_INIT_FUNCTIONS=/lib/lsb/init-functions
if [ -f ${LSB_INIT_FUNCTIONS} ] ; then
   # Make sure we have the LSB init functions
   . ${LSB_INIT_FUNCTIONS}
else
   echo "$0: FATAL ERROR: Unable to find ${LSB_INIT_FUNCTIONS}."
   echo "$0: FATAL ERROR: This script requires an LSB compliant distribution."
   echo "$0: FATAL ERROR: Please check that the LSB package is installed."
   echo "$0: FATAL ERROR: Execution aborted."
   exit $NOTINST_ERROR
fi

PATH=$SAVEPATH:$PATH
export PATH

# Check for file containing our environment variables.
# If it is not found, abort the script execution.

OURVARS=/etc/profile.d/ct_intel.sh
if [ -x ${OURVARS} ]
then
   # if INTEL_DIALOGIC_DIR is not set, then get
   # the Intel Dialogic environment variables
   [ -z "${INTEL_DIALOGIC_DIR}" ] && . ${OURVARS}
else
   echo "$0: FATAL ERROR: Unable to find ${OURVARS}."
   echo "$0: FATAL ERROR: Execution aborted due to invalid installation."
   echo "$0: FATAL ERROR: Please reinstall the software."
   exit $NOTINST_ERROR
fi

# LSB return codes 
SUCCESS=0
ERROR_GENERIC=1 # Generic or unspecified error 
ERROR_ARGUMEN=2 # Invalid or excess arguments
ERROR_UNIMPLE=3 # Unimplemented feature
ERROR_NOPRIVI=4 # Insufficient privilege
ERROR_NOTINST=5 # Program not installed
ERROR_NOTCONF=6 # Program not configured
ERROR_NOTRUNN=7 # Program not running

# Remove any extraneous log files.
rm -f /tmp/ct_intel_tmplogfile.*

# New log file name
TAILNAME="/tmp/ct_intel_tmplogfile.$$"
TAILPID=0

# extract name of service to be used for Linux lock file
SUBSYS=`basename $0`

# Red Hat and SuSE use different message formats
MSG_SEP=
[ -f /etc/redhat-release ] && MSG_SEP=":"

get_release_info

# Get PORT settings from ct_intel
CLI_LISTENER=23			# default
SNMP_LISTENER=161		# default
WEB_LISTENER=80		    # default
SNMP_TRAP_LISTENER=162	# default
if [ -f ${CT_INTEL} ]
then

	CLI_LISTENER=`sed -ne 's/\s*CLI_LISTENER\s*=\s*\([0-9]*\)/\1/p' ${CT_INTEL}`
	SNMP_LISTENER=`sed -ne 's/\s*SNMP_LISTENER\s*=\s*\([0-9]*\)/\1/p' ${CT_INTEL}`
	WEB_LISTENER=`sed -ne 's/\s*WEB_LISTENER\s*=\s*\([0-9]*\)/\1/p' ${CT_INTEL}`
	SNMP_TRAP_LISTENER=`sed -ne 's/\s*SNMP_TRAP_LISTENER\s*=\s*\([0-9]*\)/\1/p' ${CT_INTEL}`
fi

# If they are starting the services, make sure infastructure is running
case $2 in 
   start)
      # Check for running services.
      if [ -f /var/lock/subsys/${SUBSYS#S??} ]
      then
         echo
         echo "ERROR:"
         echo "ERROR: Intel IP Media services are not running."
         echo "ERROR:"
         echo
         exit $ERROR_NOTRUNN 
      fi
      ;;
   * )
      ;;
esac

case $1 in
   cli)
      case $2 in
         start )
            ngmit_cliagent_start
            ;;
         stop )
            ngmit_cliagent_stop
            ;;
         port )
            validate_port "$3"
            RC=$?
            if [ $RC -eq ${SUCCESS} ] 
            then
               ngmit_cliagent_setport "$3"
            else
               echo "Invalid or missing port value."
               usage
               exit $ARGUMEN_ERROR
            fi
            ;;
         * )
            usage
            #echo "ARGS: $*"
            exit $ARGUMEN_ERROR
            ;;
      esac
      RETVAL=$?
      ;;
   snmp)
      case $2 in
         start )
            ngmit_snmpagent_start
            ;;
         stop )
            ngmit_snmpagent_stop
            ;;

         port )
            validate_port "$3"
            RC=$?
            if [ $RC -eq ${SUCCESS} ] 
            then
               ngmit_snmpagent_setport "$3"
            else
               echo "Invalid or missing port value."
               usage
               exit $ARGUMEN_ERROR
            fi
            ;;
         
         trapport )
            validate_port "$3"
            RC=$?
            if [ $RC -eq ${SUCCESS} ] 
            then
               ngmit_snmpagent_settrap "$3"
            else
               echo "Invalid or missing port value."
               usage
               exit $ARGUMEN_ERROR
            fi
            ;;
         * )
            usage
            exit $ARGUMEN_ERROR
            ;;
      esac
      RETVAL=$?
      ;;
   bmserver)
      case $2 in
         start )
            ngmit_bmserver_start
            ;;
         stop )
            ngmit_bmserver_stop
            ;;
         * )
            usage
            exit $ARGUMEN_ERROR
            ;;
      esac
      RETVAL=$?
      ;;
   *)
      usage
      exit $ARGUMEN_ERROR
      ;;
esac

exit $RETVAL 

