#!/bin/bash
#
# vim:set ts=3 sw=3:
######################################################################
#
# Copyright (C) 2002-2013 Dialogic 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.
#####################################################################
#####################################################################
#	chkconfig: 35 90 90
#	description: Master Startup for Dialogic Software
####################################################################
### BEGIN INIT INFO
# Provides: ct_intel
# Required-Start: $network $syslog $remote_fs
# Required-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 4 6
# Short-Description: Master start/stop script for Dialogic software
# Description: This script starts or stops all programs associated with
#	Firmware is downloaded to the boards, and any supporting services are
#	started.  Once this script has successfully completed, applications
#	which utilize the software may be run.
### END INIT INFO

# 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

####################################################################
# GC TS7 (SIGTRAN) Defines
####################################################################
DLGCS7D_PID=/var/run/dlgcs7d.pid; export DLGCS7D_PID
GCTLOAD_PATH=/usr/dialogic/hybridss7; export GCTLOAD_PATH
GCTLOAD_PID=/var/run/gctload.pid; export GCTLOAD_PID
GCTLOAD_OPTS=-m2000; export GCTLOAD_OPTS



######################################################################
######################################################################
### GENERAL PURPOSE FUNCTIONS
######################################################################
######################################################################

######################################################################
# Check that the system date is later than the build date
######################################################################
check_date()
{
        # get the system date
        SYSTEM_MONTH=`date +%m`
        SYSTEM_DAY=`date +%d`
        SYSTEM_YEAR=`date +%Y`
        SYSTEM_DATE=${SYSTEM_MONTH}/${SYSTEM_DAY}/${SYSTEM_YEAR}

        # get the build date
        BUILD_DATE=`awk  '/System Release Build Date/ {print $6}' ${INTEL_DIALOGIC_CFG}/buildinfo`
        BUILD_MONTH=${BUILD_DATE%%\/*}
        BUILD_DAY_TMP=${BUILD_DATE##$BUILD_MONTH\/}
        BUILD_DAY=${BUILD_DAY_TMP%%\/*}
        BUILD_YEAR=${BUILD_DAY_TMP##$BUILD_DAY\/}

        # Verify that the system date is later than the build date
        if [ ${SYSTEM_YEAR} -lt ${BUILD_YEAR} ] ||
           [ ${SYSTEM_YEAR} -eq ${BUILD_YEAR} -a ${SYSTEM_MONTH} -lt ${BUILD_MONTH} ] ||
           [ ${SYSTEM_YEAR} -eq ${BUILD_YEAR} -a ${SYSTEM_MONTH} -eq ${BUILD_MONTH} -a ${SYSTEM_DAY} -lt ${BUILD_DAY} ]
        then
                echo
                echo "The system date (${SYSTEM_DATE}) is older"
                echo "than the build creation date (${BUILD_DATE})."
                echo "Please update the system date and rerun dlstart."
                echo
                exit 1
        fi

        return 0
}

######################################################################
# Log entries to syslog
######################################################################
log()
{
        logger -t `basename $0` "$1"
}

######################################################################
# Load module
######################################################################
modload()
{
	# See if loaded already
	/sbin/lsmod | grep ${1} 2>&1 >/dev/null
	RC=$?
	if [ $RC -ne 0 ]
	then
		if [ -f ${2} ]
		then
			log "Loading $1"
			log "Calling /sbin/insmod ${2}"
			/sbin/insmod ${2} &> /dev/null
			RC=$?
			if [ $RC -eq 0 ]
			then
				${dl_log_success_msg} "Starting ${1}"
				return
			else
				log "Starting ${1} failed ($RC)."
				${dl_log_failure_msg} "Starting ${1}"
				return
			fi
		else
			echo "${2} is not installed on disk"
			return
		fi
	else
		echo "${1} already loaded"
	fi
}

######################################################################
# Unload module
######################################################################
modunload()
{
	# See if loaded already
	lsmod | grep ${1} 2>&1 >/dev/null
	RC=$?
	if [ $RC -eq 0 ]
	then
		log "Removing $1"
		log "Calling /sbin/rmmod ${2}"
		/sbin/rmmod ${2} &> /dev/null
		RC=$?
		if [ $RC -eq 0 ]
		then
			${dl_log_success_msg} "Shutting Down ${1}"
			return
		else
			log "Shutting Down ${1} failed ($RC)."
			${dl_log_failure_msg} "Shutting Down ${1}"
			return
		fi
	else
#		echo "${1} is not loaded"
		return
	fi
}

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

delete_file "$TEMP_FILE"

# Kill all processes started before
stop_log # Stops teelogger

}

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

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

}

####################################################################
# strip comments from a line
####################################################################
strip_comment () {

IS_COMMENT=$2
TEMP_LINE="$1"

# Remove c style comments that start and end in the same line
TEMP_LINE=`echo "$TEMP_LINE" | sed "s%\/\*.*\*\/%%"`

TEMP_VAR=`echo "$TEMP_LINE" | grep "\/\*.*"`
if [ -n "$TEMP_VAR" ] # beginning of a comment
then
   TEMP_LINE=`echo "$TEMP_LINE" | sed "s%\/\*.*%%"`
   echo "$TEMP_LINE"
   exit 1 # Indicates beginning of a comment
else
   TEMP_VAR=`echo "$TEMP_LINE" | grep "\*\/.*"`
   if [ -n "$TEMP_VAR" ] # end of a comment
   then
      TEMP_LINE=`echo "$TEMP_LINE" | sed "s%.*\*\/%%"`
      echo "$TEMP_LINE"
      exit 0 # Indicates end of a comment
   else # uncommented line
      if [ "$IS_COMMENT" -eq 0 ] # not part of a comment
      then 
# Remove other types of comments here
         TEMP_LINE=`echo "$TEMP_LINE" | sed "s%#.*%%" | sed "s%\/\/.*%%" | sed "s%;.*%%"`
         echo "$TEMP_LINE"
         exit 0
      else # part of a comment started earlier
         echo ""
         exit 1
      fi
   fi
fi
}

####################################################################
# check if argument is a number
####################################################################
isdigit () {
[ $# -eq 1 ] || return $FAILURE
case $1 in
   *[!0-9]*|"") return $FAILURE;;
   *) return $SUCCESS;;
esac
}

####################################################################
# 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
}

####################################################################
# settings for Debian Linux Interface
####################################################################
set_debian_lsb_interface()
{
	. /lib/lsb/init-functions
	dl_start_daemon="start_daemon"
	dl_stop_daemon="killproc"
	dl_pidofproc="pidofproc"
	dl_status=pid_status
	dl_log_success_msg=log_success_msg
	dl_log_failure_msg=log_failure_msg
	dl_log_warning_msg=log_warning_msg
}
####################################################################
# settings for Turbolinux Interface
####################################################################
set_turbo_lsb_interface()
{
	dl_start_daemon="/etc/turbo-lsb/lsb_start_daemon"
	dl_stop_daemon="/etc/turbo-lsb/lsb_killproc"
	dl_pidofproc="/etc/turbo-lsb/lsb_pidofproc"
	dl_log_success_msg="/etc/turbo-lsb/lsb_log_message success"
	dl_log_failure_msg="/etc/turbo-lsb/lsb_log_message failure"
	dl_log_warning_msg="/etc/turbo-lsb/lsb_log_message warning"
	. /etc/rc.d/init.d/functions &> /dev/null
	dl_status="status"
}
####################################################################
# functions for Debian Linux
####################################################################
pid_status()
{
  . /lib/lsb/init-functions
  BASENAME=${1##*/}
  VARRUN=0
  VARLOCK=0
  PID=`pidof $BASENAME 2>/dev/null`
  RETC=$?
  if [ -f "/var/run/$BASENAME.pid" ]; then
    VARRUN=1
  fi
  if [ -f "/var/lock/subsys/$BASENAME" ]; then
    VARLOCK=1
  fi
  if [ -n "$PID" ]; then
    echo "$1 (pid $PID) is running..."
    return 0
  fi
  if [ $VARRUN = 1 ]; then
    echo "$1 is dead but /var/run/$BASENAME.pid exists"
    return 1
  fi
  if [ $VARLOCK = 1 ]; then
    echo "$1 is dead but /var/lock/subsys/$BASENAME exists"
    return 2
  fi
  echo "$1 is stopped"
  return 3
}

####################################################################
# log messages functions for Mandrake Linux, since Mandrake's
# log functions only log success or failure, no user data is 
# logged.
####################################################################
dl_success_msg() {
	echo -n $*
	log_success_msg 
	echo
}

dl_failure_msg() {
	echo 
	echo -n $*
log_failure_msg
	echo
}

dl_warning_msg() {
	echo -n $*
	log_warning_msg
	echo
}

####################################################################
# settings for Mandrake Linux Interface
####################################################################
set_mandrake_lsb_interface()
{
	. /lib/lsb/init-functions
	dl_start_daemon=start_daemon
	dl_stop_daemon=killproc
	dl_pidofproc=pidofproc
	dl_status=status
	dl_log_success_msg=dl_success_msg
	dl_log_failure_msg=dl_failure_msg
	dl_log_warning_msg=dl_warning_msg
}

####################################################################
# set the proper lsb interface
# Add Different Versions of Linux Here
####################################################################
set_lsb_interface()
{
	if [ "${DIST}" = "SuSE" ]
	then
		set_suse_lsb_interface	
	elif [ "${DIST}" = "RedHat" ]
	then
		set_redhat_lsb_interface
	elif [ "${DIST}" = "Debian" ]
	then
		set_debian_lsb_interface
	elif [ "${DIST}" = "Turbolinux" ]
	then
		set_turbo_lsb_interface			
	else
		echo "Error Unrecognized Linux OS Release"
		exit 1
	fi
}

####################################################################
# set the rmem_max setting in the /proc filesystem
####################################################################

set_rmem_max()
{
	RMEMSIZE_TO_SET=1024000
	RMEMSIZE=`cat /proc/sys/net/core/rmem_max 2>/dev/null`

	[ ${RMEMSIZE_TO_SET} -gt ${RMEMSIZE} ] &&
		echo ${RMEMSIZE_TO_SET} > /proc/sys/net/core/rmem_max
}

####################################################################
# set the shmmax setting in the /proc filesystem
####################################################################

set_shmem_max()
{
	SHMEMSIZE_TO_SET=100663296
	SHMEMSIZE=`cat /proc/sys/kernel/shmmax 2>/dev/null`

	[ ${SHMEMSIZE_TO_SET} -gt ${SHMEMSIZE} ] &&
		echo ${SHMEMSIZE_TO_SET} > /proc/sys/kernel/shmmax
}

################################################################
# 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
		RET=$?
		log "$MSG"
		if [ ${RET} != 0 ]
		then
			log "Calling su -s /bin/bash - -c ${PROG} ${ARGS}"
			su -s /bin/bash - -c "${PROG} ${ARGS} &>/dev/null &"
		else
			log "Calling /sbin/runuser -s /bin/bash - -c ${PROG} ${ARGS}"
			/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' )
					log "${3} failed ($RC)."
					${dl_log_failure_msg} "${MSG}"
					RC=$PROG_DEADPID
					;;

			'2' )
					log "${3} failed ($RC)."
					${dl_log_failure_msg} "${MSG}"
					RC=$PROG_DEADLOC
					;;

			'3' )
					log "${3} failed ($RC)."
					${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 the Web Server 
################################################################
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
		RET=$?

		log "$MSG"

		if [ ${RET} != 0 ]
		then
			log "Calling su -s /bin/bash - -c ${PROG} ${ARGS}"
			su -s /bin/bash - -c "cd ${INTEL_DIALOGIC_WEBAGENT}; ./${PROGNAME} ${ARGS} &>/dev/null &"
		else
			log "Calling /sbin/runuser -s /bin/bash - -c ${PROG} ${ARGS}"
			/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' )
					log "${3} failed ($RC)."
					${dl_log_failure_msg} "${MSG}"
					RC=$PROG_DEADPID
					;;

			'2' )
					log "${3} failed ($RC)."
					${dl_log_failure_msg} "${MSG}"
					RC=$PROG_DEADLOC
					;;

			'3' )
					log "${3} failed ($RC)."
					${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, singal handler will not work to delete the pid file. 
			log "$MSG"
			log "killall -e  ${PROG}"
			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' )
					log "${2} failed ($RC)."
					${dl_log_failure_msg} "${MSG}"
					RC=$PROG_DEADLOC
					;;

			'1' )
					log "${2} failed ($RC)."
					${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
}


################################################################
# This is to stop the board watch. Board watch will not shutdown with 
# one kill. two kill are needed. Once this issue is found out and fixed,
# this should be removed.
# Caution : if any change in dlg_server_stop(), corresponding change
# needed to be done here.
################################################################
dlg_server_stop_bw() {

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

      if [ $RC -eq 0 ]
      then
			log "$MSG"
			log "killall -9 ${PROG}"
         killall -9 ${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' )
					log "${2} failed ($RC)."
               ${dl_log_failure_msg} "${MSG}"
               RC=$PROG_DEADLOC
               ;;

         '1' )
					log "${2} failed ($RC)."
               ${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
################################################################
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}"
   #dlg_daemon_start "${PROG}" "${ARGS}" "${MSG}" "--create-pid-file"
   RC=$?
   return ${RC}
}

################################################################
#Start NGMIT SNMP Agent 
################################################################
ngmit_snmpagent_start() 
{
	SNMP_TRAP_LISTENER=162
	SNMP_LISTENER=161
   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
}

################################################################
#Start NGMIT CLI Agent 
################################################################
ngmit_cliagent_start() 
{
	CLI_LISTENER=23
   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
}

################################################################
#Start NGMIT Web Agent 
################################################################
ngmit_webagent_start() 
{
	WEB_LISTENER=1900
   ARGS=" ${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 Board Manager
################################################################
ngmit_bmserver_stop()
{
   PROG="${INTEL_DIALOGIC_BIN}/bmserver"
   MSG="Shutting Down Board Manager Service"
   REQ="1"

   # dlg_deamon_stop() give an error if it is already stopped. 
   # dlg_server_stop() does not, so use this instead.
   dlg_server_stop "${PROG}" "${MSG}"
   RC=$?

   return ${RC}
}

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

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

   return ${RC}
}

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

   dlg_server_stop "${PROG}" "${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}
}

######################################################################
# OAMEventService Start
######################################################################
oameventservice_start()
{
   ARGS=""
   PROG=${INTEL_DIALOGIC_BIN}/OAMEventService
   MSG="Starting OAM Event Service"
		 
   [ ! -x ${PROG} ] && return ${SUCCESS}
   dlg_server_start "${PROG}" "${ARGS}" "${MSG}"
   RC=$?
				  
   return ${RC}
}
######################################################################
#  OAMEventService Stop
######################################################################
oameventservice_stop()
{
   PROG=${INTEL_DIALOGIC_BIN}/OAMEventService
   MSG="Shutting Down OAM Event Service"
										  
   [ ! -x ${PROG} ] && return ${SUCCESS}
											   
   dlg_server_stop "${PROG}" "${MSG}"
   RC=$?
														 
   return ${RC}
}

####################################################################
# generic function to start a program which is a daemon
#
# Arguments:
#
# $1 = full path to the daemon surrounded by double quotes
# $2 = arguments to pass to the daemon surrounded by double quotes
# $3 = message to be displayed surrounded by double quotes
# $4 = --create-pid-file [optional]
# $5 = --wait=<time in seconds> [optional]
#
# Returns: LSB-compliant 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

####################################################################
dlg_daemon_start()
{
	# handle calling errors
	if [ $# -lt 3 -o $# -gt 5 ]
	then
		echo "ERROR: dlg_daemon_start():"
		echo "ERROR: Usage: dlg_daemon_start <path_to_daemon> \"<daemon_args>\" \"<message>\" [--create-pid-file] --wait=<time>"
		return ${ERROR_ARGUMEN}
	fi

	# assume a well behaved program until proven otherwise
	CREATE_PID=0

	# assume no wait until proven otherwise
	WAIT=0

	# get arguments passed from caller
	PROG=$1
	PROGNAME=${1##*/}
	ARGS=$2
	MSG="$3 ${MSG_SEP}"
	[ $# -ge 4 -a "$4" = "--create-pid-file" ] && CREATE_PID=1

	if [ $# -eq 5 ]
	then
		# wait time specified so extract it
		echo $5 | grep "\-\-wait=" && WAIT=${5##*=}
	fi

	# Check for the daemon file
	if [ -x ${PROG} ]
	then
		# daemon file was found
			#echo ${PROG}
			# start the daemon using LSB method
			log "$MSG"
			log "Calling ${dl_start_daemon} ${PROG} ${ARGS}"
			${dl_start_daemon} ${PROG} ${ARGS} &> /dev/null
			RC=$?

			[ -n ${WAIT} ] && sleep ${WAIT}
			# check return value
			if [ ${RC} -eq ${SUCCESS} ]
			then
				# program successfully started
				[ ${CREATE_PID} -eq 1 ] && pidof ${PROGNAME} > /var/run/${PROGNAME}.pid 2> /dev/null
				${dl_log_success_msg} "${MSG}"
				RC=${SUCCESS}
         else
            # May not have failed... so, let's make sure
            if [ ${DIST} = "RedHat" ] || [ ${DIST} = "Turbolinux" ]
            then
               PROG_PID=`pidof ${PROGNAME}`
               if [ -n "$PROG_PID" ]; then
                  [ ${CREATE_PID} -eq 1 ] && pidof ${PROGNAME} > /var/run/${PROGNAME}.pid 2> /dev/null
                  ${dl_log_success_msg} "${MSG}"
                  RC=${SUCCESS}
                  return ${RC}
               fi
            fi
            # some failure occurred
				log "${3} failed ($RC)."
            ${dl_log_failure_msg} ${MSG}
            RC=${ERROR_GENERIC}
         fi
	else
		${dl_log_warning_msg} "	${PROG} not found${MS_SEP}"
		${dl_log_failure_msg} ${MSG}
		RC=${ERROR_NOTINST}
	fi
	return ${RC}
}


####################################################################
# generic function to stop a program which is a daemon
#
# Arguments:
#
# $1 = full path to the daemon
# $2 = message to be displayed surrounded by double quotes
# $3 = signal to pass to killproc
#
# Returns: LSB-compliant 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
#
####################################################################
dlg_daemon_stop()
{
	# handle calling errors
	if [ $# -lt 2 -o $# -gt 3 ]
	then
		echo "ERROR: dlg_daemon_stop():"
		echo "ERROR: Usage: dlg_daemon_stop <path_to_daemon> \"<message>\" [<signal>]"
		return ${ERROR_ARGUMEN}
	fi

	# get arguments passed from caller
	PROG=$1
	PROGNAME=${1##*/}
	MSG="$2 ${MSG_SEP}"
	
	SIG=
	[ $# -eq 3 ] && SIG=$3

	if [ -x ${PROG} ]
	then
		log "$MSG"
		if [ "${DIST}" = "Debian"  ]
		then
			log "Calling ${dl_stop_daemon} ${PROGNAME} HUP"
			${dl_stop_daemon} ${PROGNAME} "HUP"
		else
			log "Calling ${dl_stop_daemon} ${PROGNAME}"
			${dl_stop_daemon} ${PROGNAME} "${SIG}"
		fi
		RC=$?
		sleep 2
		if [ ${RC} -eq ${SUCCESS} ]
		then
			# program was successfully stopped
			${dl_log_success_msg} "${MSG}"
			# shouldn't need to do this if program is well behaved
			rm -f /var/run/${PROGNAME}.pid
			return ${SUCCESS}
		else
			# program was not running
			log "${2} failed ($RC)."
			${dl_log_failure_msg} ${MSG}
			# delete any stale pid files
			rm -f /var/run/${PROGNAME}.pid
			RC=${ERROR_NOTRUNNING}
		fi
	else
		${dl_log_warning_msg} "	${PROG} not found${MSG_SEP}"
		${dl_log_failure_msg} ${MSG}
		RC=${ERROR_NOTINST}
	fi
	return ${RC}
}
################################################################
# Timeslot broker
################################################################
tsbroker_start()
{
	ARGS="-OAport 12005"
	MSG="Starting Timeslot Doler"
	PROG="${INTEL_DIALOGIC_BIN}/dlgtimeslotdolerserver"
	PROGNAME=${PROG##*/}
	TBPROG="${INTEL_DIALOGIC_BIN}/tbparms"

	# can't just call dlg_daemon_start because it doesn't
	# run tbparms.  so if the daemon isn't running, call
	# tbparms first, then start the daemon.

	# Check for the timeslot server 
	if [ -x ${PROG} ]
	then
		# check if already running
		# start the timeslot server
		# FIXME dlgtimeslotdolerserver should create the pid file
		dlg_daemon_start "${PROG}" "${ARGS}" "${MSG}" "--create-pid-file"
		RC=$?
	else
		# LSB states that success should be returned
		# even if the program is already running
		${dl_log_error_msg} ${MSG}
		RC=${PROG_UNKNOWN}
	fi
	return ${RC}
}

################################################################
# Stopping  Timeslot broker
################################################################
tsbroker_stop()
{
	PROG="${INTEL_DIALOGIC_BIN}/dlgtimeslotdolerserver"
	MSG="Shutting Down Timeslot Doler"
	REQ="1"

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

	return ${RC}
}

######################################################################
# DeviceMapper
######################################################################
devmap_start()
{
	ARGS="-OAport 12003"
	MSG="Starting Device Mapper"
	PROG=${INTEL_DIALOGIC_BIN}/devmapserver
   sleep 2    
	# FIXME: devmapserver should create the pid file, not the script
	dlg_daemon_start "${PROG}" "${ARGS}" "${MSG}" "--create-pid-file"
	RC=$?
	return ${RC}
}

################################################################
# Stopping DeviceMapper 
################################################################
devmap_stop()
{
	PROG=${INTEL_DIALOGIC_BIN}/devmapserver
	MSG="Shutting Down Device Mapper"

	dlg_daemon_stop "${PROG}" "${MSG}"
	RC=$?
	return ${RC}
}

################################################################
# Starting Clocking Server
################################################################
dlgsysclockserver_start() {
	PROG="${INTEL_DIALOGIC_BIN}/dlgsysclockserver"
	MSG="Starting Clocking Server"
	ARGS="-OAport 12006"
	REQ="1"
	dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}" "--create-pid-file"
	RC=$?
	return ${RC}
}

################################################################
# Stopping Clocking Server
################################################################
dlgsysclockserver_stop() {
	PROG="${INTEL_DIALOGIC_BIN}/dlgsysclockserver"
	MSG="Stopping ClockingServer"
	REQ="1"

	dlg_server_stop "${PROG}" "${MSG}" "${REQ}"
	RC=$?
	return ${RC}
}
################################################################
# Starting Monitor Server
################################################################
dlgsysmonitorserver_start() {
	PROG=${INTEL_DIALOGIC_BIN}/dlgsysmonitorserver
	MSG="Starting Telephony System Monitor"
	ARGS="-OAport 12004"
	REQ="1"
   sleep 1	
	dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}" "--create-pid-file"

	RC=$?
	
	return ${RC}
}

################################################################
# Stopping Monitor Server
################################################################
dlgsysmonitorserver_stop()
{
	PROG=${INTEL_DIALOGIC_BIN}/dlgsysmonitorserver
	MSG="Stopping Telephony System Monitor"
	REQ="1"
	dlg_server_stop "${PROG}" "${MSG}" "${REQ}"
	RC=$?

	return ${RC}
}

######################################################################
#  BW specific start part (SNMP)
######################################################################
bw_start() {
	PROG="${INTEL_DIALOGIC_BIN}/boardserver"
	MSG="Starting Board Watch"
  	ARGS=""
	REQ="0"
	dlg_server_start "${PROG}" "${ARGS}" "${MSG}" "${REQ}" "--create-pid-file"
	RC=$?
	return ${RC}
}

######################################################################
#Board Watch Stop
#####################################################################

bw_stop()
{
	PROG="${INTEL_DIALOGIC_BIN}/boardserver"
	MSG="Shutting Down The Board Server"
	REQ="0"

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

	return ${RC}
}

######################################################################
#  Clock Daemon specific 
######################################################################
clockdaemon_start()
{
	PROG="${INTEL_DIALOGIC_BIN}/dlgclockdaemon"
	ARGS="ok "
	MSG="Starting Clocking Daemon"
	# get clocking mode from dlgsys.cfg
	CLK_MODE=`${INTEL_DIALOGIC_BIN}/scdget -t TDM --key ClockDaemonMode`

		case "${CLK_MODE}" in 
			DISABLED)
			
				MSG="Starting Clocking Daemon"
				${log_success_msg} "Clocking Daemon Disabled"
				return ${SUCCESS}
				;;
			PASSIVE) 
				ARGS=-p
				MSG="Starting Clocking Daemon in PASSIVE mode"
				;;
			*) 
				MSG="Starting Clocking Daemon"
				;;
		esac

	# FIXME: dlgclockdaemon should create the pid file not the script
	dlg_daemon_start "${PROG}" "${ARGS}" "${MSG}" "--create-pid-file"
	RC=$?
	sleep 1
	return ${RC}
}


clockdaemon_stop()
{
	MSG="Shutting Down Clocking Daemon"
	PROG=${INTEL_DIALOGIC_BIN}/dlgclockdaemon

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

	return ${RC}
}

######################################################################
#  GC/SS7 specific start & stop functions
#  Start GCSS7 daemon (phase 1 - run): the real start of the daemon
######################################################################
ss7_run() {
	RC=0
	GCSS7_STARTED="NO"
	#check if the gcss7.cfg and GCSS7 daemon files are present (installed)
	if [ -f ${INTEL_DIALOGIC_CFG}/gcss7.cfg ] && [ -x ${INTEL_DIALOGIC_BIN}/dlgcs7d ]; then
		#check if GCSS7 was configured to operate
		SS7_CONFIG=`awk -F '=' '/^System\.Configuration/ {print $2}' ${INTEL_DIALOGIC_CFG}/gcss7.cfg | sed -e 's/ *"\(.*\)"/\1/'`
		if [ ! "${SS7_CONFIG}" = "" ] && [ ! "${SS7_CONFIG}" = "None" ]; then
			PROG="${INTEL_DIALOGIC_BIN}/dlgcs7d"
			MSG="Starting GCSS7 Server"
			ARGS="run silent"
			dlg_daemon_start "${PROG}" "${ARGS}" "${MSG}"
			RC=$?
			if [ $RC -eq 0 ]; then
				GCSS7_STARTED="YES"
			fi
		fi
	fi
	return $RC
}
##########################################################################
# Start GCSS7 daemon (phase 2 - continue): sending a signal to the daemon
##########################################################################
ss7_continue() {
	RC=0
	if [ ${GCSS7_STARTED} = "YES" ]; then
		${INTEL_DIALOGIC_BIN}/dlgcs7d continue
		RC=$?
	fi
	return $RC
}
##########################################################################
# Stop GCSS7 daemon: ${INTEL_DIALOGIC_BIN}/dlgcs7d stop
# GCSS7 requires SIGINT (2) to stop gracefully
# LSB does not accept symbolic signal names
##########################################################################
ss7_stop() {
	RC=0
	if [ -f ${INTEL_DIALOGIC_CFG}/gcss7.cfg ] && [ -x ${INTEL_DIALOGIC_BIN}/dlgcs7d ]; then
		#check if GCSS7 was configured to operate
		SS7_CONFIG=`awk -F '=' '/^System\.Configuration/ {print $2}' ${INTEL_DIALOGIC_CFG}/gcss7.cfg | sed -e 's/ *"\(.*\)"/\1/'`
		if [ ! "${SS7_CONFIG}" = "" ] && [ ! "${SS7_CONFIG}" = "None" ]; then
			PROG="${INTEL_DIALOGIC_BIN}/dlgcs7d"
			${dl_status} "${PROG}" &> /dev/null
			RCSTAT=$?
			if [ $RCSTAT -eq 0 ]; then
				MSG="Stopping GCSS7 Daemon"
				SGN="-2"
				dlg_daemon_stop "${PROG}" "${MSG}" "${SGN}"
				RC=$?
			fi
		fi
	fi
	return $RC
}


#############################################################################
#  GC TS7 (SIGTRAN) specific start & stop functionsi.
#	This is different from the normal GC SS7 startup. This is specific to the
# 	SIGTRAN Hybrid stack. 
#############################################################################
#
## Start the  GCT IPC
#
gctload_start() {
   # check if gctload is present (installed)
   if [ -f ${GCTLOAD_PATH}/gctload ]; then
      # Is it already running?
      PID=`cat $GCTLOAD_PID 2>/dev/null`
      /bin/ps -p $PID >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
         ${dl_log_success_msg} "GCTLOAD already running (PID $PID) ${MSG_SEP}"
      else
         MSG="Starting GCTLOAD ${MSG_SEP}"
         rm -f ${GCTLOAD_PID}
         pushd ${GCTLOAD_PATH} >/dev/null
         ./gctload ${GCTLOAD_OPTS} > /dev/null 2>&1 &
         popd >/dev/null
         PID=`ps -eaf | grep gctload | grep -v grep | cut -c 10-15`
         if [ ! "$PID" = "" ]; then
            echo $PID > ${GCTLOAD_PID}
            sleep 1
            ${dl_log_success_msg} ${MSG}
         else
            ${dl_log_failure_msg} ${MSG}
         fi
      fi
   fi
}


#
## Stop the  GCT IPC
#
gctload_stop() {
   # check if gctload is present (installed)
   if [ -x ${GCTLOAD_PATH}/gctload ]; then
      MSG="Shutting down GCTLOAD ${MSG_SEP}"
      # Stop gctload if configured
      PID=`cat $GCTLOAD_PID 2>/dev/null`
      kill -TERM $PID >/dev/null 2>&1
      if [ $? -eq 0 ]; then
         ${dl_log_success_msg} ${MSG}
      else
         killall -e TERM gctload >/dev/null 2>&1
         sleep 4
         CNT=`ps -eaf | grep -v grep | grep -c gctload`
         if [ $CNT -eq 0 ]; then
            ${dl_log_success_msg} ${MSG}
         else
            ${dl_log_failure_msg} ${MSG}
         fi
      fi
   fi
}

#
## Start the  GCSS7 SIGTRAN daemon. 
#
gcts7_start() {
   if [ -f ${INTEL_DIALOGIC_CFG}/ss7.cfg ] && [ -x ${INTEL_DIALOGIC_BIN}/dlgcs7d ]; then
      SS7_CONFIG=`awk -F '=' '/^System\.Configuration/ {print $2}' ${INTEL_DIALOGIC_CFG}/ss7.cfg | sed -e 's/ *"\(.*\)"/\1/'`
      if [ ! "${SS7_CONFIG}" = "" ] && [ ! "${SS7_CONFIG}" = "None" ]; then
         # Start gctload first if configured
         gctload_start

         # Start GC/SS7 Service
         PID=`cat ${DLGCS7D_PID} 2>/dev/null`
         /bin/ps -p $PID >/dev/null 2>&1
         if [ $? -eq 0 ] ; then
            ${dl_log_success_msg} "GC/SS7 Service already running (PID $PID) ${MSG_SEP}"
         else
            pushd ${INTEL_DIALOGIC_DIR}/bin >/dev/null
            ./dlgcs7d start
            popd >/dev/null
         fi
      fi
   fi
   return $SUCCESS
}

gcts7_stop() {
   if [ -f ${INTEL_DIALOGIC_CFG}/ss7.cfg ] && [ -x ${INTEL_DIALOGIC_BIN}/dlgcs7d ]; then
      SS7_CONFIG=`awk -F '=' '/^System\.Configuration/ {print $2}' ${INTEL_DIALOGIC_CFG}/ss7.cfg | sed -e 's/ *"\(.*\)"/\1/'`
      if [ ! "${SS7_CONFIG}" = "" ] && [ ! "${SS7_CONFIG}" = "None" ]; then
         if [ -f ${DLGCS7D_PID} ]; then
            ${INTEL_DIALOGIC_BIN}/dlgcs7d stop
            if [ $? -ne 0 ]; then
               echo "Timeout. Killing daemon!";
            fi
         fi
         # Killing anyway, in case some old process would still be around
         killall -e -9 dlgcs7d > /dev/null 2>&1
         killall -e -9 dlgcs7srv > /dev/null 2>&1
         rm -f ${DLGCS7D_PID}

         # Stop GCTLOAD
         gctload_stop
      fi
   fi
   return $SUCCESS
}

######################################################################
#  Start Logging 
######################################################################
start_log() {
	# Redirect IO to log file
	cat /dev/null > $TAILNAME
	${INTEL_DIALOGIC_BIN}/teelogger -s -f $TAILNAME &
	sleep 1
	TAILPID=$!
	exec 2>&1
	exec >> $TAILNAME

	# Delete log file on Control C
	trap "stop_log;exit 1" 2

	return $SUCCESS
}


######################################################################
#  Stop Logging 
######################################################################
stop_log() {
	# Stop Logging
	sleep 3 
	kill -1 $TAILPID
	return $SUCCESS
}
 
######################################################################
#  Start RTF Logging 
######################################################################
rtf_logging_start()
{
	log "Starting RTF Logging Server${MSG_SEP}"
	log "Calling ${INTEL_DIALOGIC_BIN}/RtfServer start"
   ${INTEL_DIALOGIC_BIN}/RtfServer start 2> /dev/null
   RC=$?
   if [ $RC = 0 ]; then
      $dl_log_success_msg "Starting RTF Logging Server${MSG_SEP}"
   else
		log "Failed to start RTF Logging Server ($RC)."
      $dl_log_failure_msg "Starting RTF Logging Server${MSG_SEP}"
   fi
	return $SUCCESS
}

######################################################################
#  Stop RTF Logging 
######################################################################
rtf_logging_stop()
{
	log "Shutting Down RTF Logging Server${MSG_SEP}"
	log "Calling ${INTEL_DIALOGIC_BIN}/RtfServer stop"
   ${INTEL_DIALOGIC_BIN}/RtfServer stop 2> /dev/null
   RC=$?
   if [ $RC = 0 ]; then
      $dl_log_success_msg "Shutting Down RTF Logging Server${MSG_SEP}"
   else
		log "Failed to shut down RTF Logging Server ($RC)."
      $dl_log_failure_msg "Shutting Down RTF Logging Server${MSG_SEP}"
   fi
	return $SUCCESS
}

######################################################################
#  Start Dialogic Services 
######################################################################
ct_intel_start() {

	RETCODE=$SUCCESS

	echo
	echo "STARTING DIALOGIC SERVICES..."
	echo

	if [ ${DIALOGIC_PLATFORM} = TVL2 ] || [ ${DIALOGIC_PLATFORM} = OVL ]
	then
      # Start ipmi
      if [ -x /etc/init.d/ipmi ]
      then
          /etc/init.d/ipmi start
      else
           echo "ERROR: Could not start ipmi.Exiting start-up..."
           log  "ERROR: Could not start ipmi.Exiting start-up..."
           exit 1
      fi

		# load the following modules
		modload ipmi_msghandler /lib/modules/`uname -r`/kernel/drivers/char/ipmi/ipmi_msghandler.ko
		modload ipmi_si /lib/modules/`uname -r`/kernel/drivers/char/ipmi/ipmi_si.ko
		modload ipmi_devintf /lib/modules/`uname -r`/kernel/drivers/char/ipmi/ipmi_devintf.ko
		modload ipmi_watchdog /lib/modules/`uname -r`/kernel/drivers/char/ipmi/ipmi_watchdog.ko
		modload ipmi_poweroff /lib/modules/`uname -r`/kernel/drivers/char/ipmi/ipmi_poweroff.ko
		modload tvl2_sysctl ${INTEL_DIALOGIC_DIR}/drivers/tvl2_sysctl.ko
		modload csme ${INTEL_DIALOGIC_DIR}/drivers/csme.ko

		${INTEL_DIALOGIC_DIR}/drivers/tvl2drv_load &> /dev/null
		RC=$?
		if [ ${RC} -eq 0  ]
		then
			${dl_log_success_msg} "Starting tvl2drv_load"
		else
			${dl_log_failure_msg} "Starting tvl2drv_load"
		fi
		${dl_status} tvl2_hotswap &> /dev/null
		RC=$?

		if [ $RC -ne 0 ]
		then      
			if [ -x ${INTEL_DIALOGIC_BIN}/tvl2_hotswap ]
			then
				log "Calling ${INTEL_DIALOGIC_BIN}/tvl2_hotswap &"
				${INTEL_DIALOGIC_BIN}/tvl2_hotswap &
				echo "tvl2_hotswap started" 
			fi

		fi
	fi
#	if [ ${DIALOGIC_PLATFORM} = TVL2 ] || [ ${DIALOGIC_PLATFORM} = OVL ] || [ ${DIALOGIC_PLATFORM} = ZVL ] 
	if [ ${DIALOGIC_PLATFORM} = ZVL ]
	then
		# load the following modules
		if [ -f /lib/modules/`uname -r`/misc/tvl2_sysctl.ko ]
		then
			modload tvl2_sysctl /lib/modules/`uname -r`/misc/tvl2_sysctl.ko
		fi
		
		if [ -f /lib/modules/`uname -r`/misc/csme.ko ]
		then
			modload csme /lib/modules/`uname -r`/misc/csme.ko
		fi
		if [ -x ${INTEL_DIALOGIC_DIR}/drivers/tvl2drv_load ]
		then
			log "Calling ${INTEL_DIALOGIC_DIR}/drivers/tvl2drv_load"
			${INTEL_DIALOGIC_DIR}/drivers/tvl2drv_load &> /dev/null
			RC=$?
			if [ ${RC} -eq 0  ]
			then
				${dl_log_success_msg} "Starting tvl2drv_load"
			else
				log "Starting tvl2drv_load failed ($RC)."
				${dl_log_failure_msg} "Starting tvl2drv_load"
			fi
		fi
	fi


   if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 4.1 ] 
        then
      # check if the Gemini AMC installed
      if [ -x /sbin/lspci ]
      then
         /sbin/lspci | grep Dialogic | grep 5013 &> /dev/null
         RC=$?
         # if Gemini AMC is in the system, start ipmi service
         if [ $RC -eq 0 ]
         then
            # Start ipmi
                                echo "Gemini AMC, start ipmi service"
                if [ -x /etc/init.d/ipmi ]
                then
                        /etc/init.d/ipmi start
                else
                        echo "ERROR: Could not start ipmi.Exiting start-up..."
                        log  "ERROR: Could not start ipmi.Exiting start-up..."
                fi
        fi
        fi
      fi 


	rtf_logging_start
	RC=$?

	# Start event service
	oameventservice_start
	RC=$?

	devmap_start
	RC=$?

	tsbroker_start
	RC=$?

        if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ]
        then
	    ss7_run
	    RC=$?
        fi

	if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 1.5 ]
	then
		set_shmem_max

		# Start each CT Platform
		for cmd in ${INTEL_DIALOGIC_DIR}/init.d/ctplatform/order/*
		do
			$cmd startall
			log "Calling $cmd startall"
		done

		# Post-detect services
		dlgsysmonitorserver_start
		RC=$?
		
		dlgsysclockserver_start
		RC=$?
		
		clockdaemon_start
		RC=$?
		
		dlgsysmonitorcmdline --fault --start 
		RC=$?
		
		bw_start
		RC=$?

		if [ ${INTEL_DIALOGIC_MEDIA_SERVER_STATUS} -eq 1 ]
		then
			log "Calling ${INTEL_DIALOGIC_DIR}/bin/mediaserver start"
			${INTEL_DIALOGIC_DIR}/bin/mediaserver start
		fi
	elif [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
	     [ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] || 
	     [ ${DIALOGIC_PLATFORM} = TVL2 ] || 
	     [ ${DIALOGIC_PLATFORM} = OVL ] ||
	     [ ${DIALOGIC_PLATFORM} = ZVL ]
	then
		if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
	         [ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] ||
		   [ ${DIALOGIC_PLATFORM} = OVL ] ||
		   [ ${DIALOGIC_PLATFORM} = ZVL ]
		then
			if [ -x "${INTEL_DIALOGIC_BIN}/drvload" ]
			then
				log "Calling ${INTEL_DIALOGIC_BIN}/drvload"
				"${INTEL_DIALOGIC_BIN}/drvload" &> /dev/null
				RC=$?
			fi			
		fi
		if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
               [ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] ||
		   [ ${DIALOGIC_PLATFORM} = ZVL ]
		then
			if [ -x "${INTEL_DIALOGIC_BIN}/kmbc_load" ]
			then
				log "Calling ${INTEL_DIALOGIC_BIN}/kmbc_load"
				"${INTEL_DIALOGIC_BIN}/kmbc_load" &> /dev/null
				RC=$?
			fi		
			# Post-detect services
			dlgsysmonitorserver_start
			RC=$?
      
			if [ -x "${INTEL_DIALOGIC_BIN}/hmpd" ]
			then
				log "${INTEL_DIALOGIC_BIN}/hmpd start"
				"${INTEL_DIALOGIC_BIN}/hmpd" start
				RC=$?
				sleep 10
			fi
			#dlgsysclockserver_start
			#RC=$?
		fi

		# Start new NGMIT OAM ATCA Services
		ngmit_bmserver_start
		RC=$?

		ngmit_snmpagent_start
		RC=$?

		ngmit_cliagent_start
		RC=$?

# remove until prototype becomes real IPY44224
        if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 4.1 ] && [ -x "${INTEL_DIALOGIC_BIN}/RemoteAPIServer" ]
        then
            ngmit_webagent_start
            RC=$?
        fi

		echo
		echo "STARTING DIALOGIC MEDIA"
		echo

		if [ -x ${INTEL_DIALOGIC_BIN}/ssck ]
		then
          log "${INTEL_DIALOGIC_BIN}/ssck 3"
		    ${INTEL_DIALOGIC_BIN}/ssck 3
		fi
	fi

#	gcts7_start/stop is currently called only for HMP 3.1
#       HMP 4.1 DM3 script calls gcts7_start/stop
	if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] 
 	then
  	    ss7_continue
		gcts7_start
		RC=$?
	fi

  	set_rmem_max
	touch /var/lock/subsys/${SUBSYS#S??}

	echo
	echo "STARTING DIALOGIC SERVICES COMPLETE."
	echo

	return $RETCODE
}

######################################################################
#  Stop Dialogic Services 
######################################################################
ct_intel_stop()
{
	RETCODE=${SUCCESS}

	echo
	echo "STOPPING DIALOGIC SERVICES..."
	echo


	if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 1.5 ]
	then
            # stop_log
				log "Calling ${INTEL_DIALOGIC_DIR}/bin/mediaserver stop"       
            ${INTEL_DIALOGIC_DIR}/bin/mediaserver stop
            RC=$?
		
            bw_stop
            RC=$?
		
            clockdaemon_stop
            RC=$?
		
            dlgsysclockserver_stop
            RC=$?
		
            dlgsysmonitorserver_stop
            RC=$?
	fi

	if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
         [ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] ||
	   [ ${DIALOGIC_PLATFORM} = TVL2 ] ||
	   [ ${DIALOGIC_PLATFORM} = OVL ] ||
	   [ ${DIALOGIC_PLATFORM} = ZVL ]
	then	
            ngmit_snmpagent_stop
            RC=$?

            ngmit_cliagent_stop
            RC=$?

            # check if the media_server is still running
            ps -a | grep media_server &> /dev/null
            MSRET=$?
	
            # if media_serveris still running, then kill it
            if [ ${MSRET} -eq 0 ]
            then
                log "Calling ${INTEL_DIALOGIC_DIR}/bin/mediaserver stop"       
                ${INTEL_DIALOGIC_DIR}/bin/mediaserver stop
                RC=$?
            fi
			
# remove until prototype becomes real IPY44224
            if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 4.1 ] && [ -x ${INTEL_DIALOGIC_DIR}/bin/RemoteAPIServer ]
            then
                ngmit_webagent_stop
                RC=$?
            fi

            #Stop NGMIT Framework if ATCA Framework
            ngmit_bmserver_stop
            RC=$?

            if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
            	[ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] ||
	   	[ ${DIALOGIC_PLATFORM} = ZVL ]
            then
            	# check if the clockdaemon is still running
            	${dl_status} ${INTEL_DIALOGIC_BIN}/dlgclockdaemon &> /dev/null
            	RET=$?
	
     		# if clockdaemon is still running, then kill it
     		if [ ${RET} -eq 0 ]
     		then
     			clockdaemon_stop
     			RC=$?
     		fi
			
            	# check if the clockserver is still running
            	${dl_status} ${INTEL_DIALOGIC_BIN}/dlgsysclockserver &> /dev/null
            	RET=$?
 
            	# if it is still running, then kill it
            	if [ ${RET} -eq 0 ]
            	then
            		dlgsysclockserver_stop
            		RC=$?
            	fi

            	# Post-detect services
            	#dlgsysmonitorserver_stop
            	#RC=$?
            fi
	fi

	if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] 
 	then
	    ss7_stop
	    RC=$?
		gcts7_stop
		RC=$?
	fi

	# Stop each CT Platform
	for cmd in ${INTEL_DIALOGIC_DIR}/init.d/ctplatform/order/*
	do
		$cmd stopall
		log "Calling $cmd stopall"
		RC=$?
		if [ $RC != 0 ]
		then
			echo "$cmd stop failed"
		fi
	done
	# Post-detect services
	dlgsysmonitorserver_stop
	RC=$?
	
	tsbroker_stop
	RC=$?
	
	devmap_stop
	RC=$?
	
	hmp_stop
	RC=$?
	rtf_logging_stop
	rm -f /var/lock/subsys/${SUBSYS#K??}
    rm -f ${INTEL_DIALOGIC_DIR}/temp/DLG_DM_shm.dat

   if [ ${DIALOGIC_PLATFORM} = TVL2 ] || [ ${DIALOGIC_PLATFORM} = OVL ] || [ ${DIALOGIC_PLATFORM} = ZVL ]
	then
		modunload tvl2_sysctl ${INTEL_DIALOGIC_DIR}/drivers/tvl2_sysctl.ko
		modunload csme ${INTEL_DIALOGIC_DIR}/drivers/csme.ko
		modunload tvl2pcidrv ${INTEL_DIALOGIC_DIR}/drivers/tvl2pcidrv.ko

	fi
	oameventservice_stop
	RC=$?

	echo
	echo "STOPPING DIALOGIC SERVICES COMPLETE."
	echo

	return $RETCODE
}

######################################################################
#  Stop HMP daemon 
######################################################################
hmp_stop() {

	RETCODE=$SUCCESS
	
	if [ -x "${INTEL_DIALOGIC_BIN}/hmpd" ]
	then
		"${INTEL_DIALOGIC_BIN}/hmpd" stop
	fi
	return $RETCODE
}

######################################################################
# Check for correct version of RTC
######################################################################
check_rtc()
{
   MODPATH=/lib/modules/`uname -r`/kernel/drivers/char
   MODGENRTC=`lsmod|grep -c genrtc`
   MODRTC=`lsmod|egrep -c "^rtc"`
   FILERTC=`ls $MODPATH 2>/dev/null|egrep -c "^rtc\.ko$"`
   if [ $MODGENRTC -eq 1 ];then
     if [ $FILERTC -eq 1 ];then
       echo "Found GENRTC. Changing to RTC."
       if ! rmmod genrtc 2>/dev/null;then
         echo "Could not remove genrtc kernel module. Exiting..."
         exit
       fi
       if ! insmod $MODPATH/rtc.ko 2>/dev/null;then
         echo "Could not install $MODPATH/rtc.ko. Exiting..."
         exit
       fi
     else
       echo "ERROR: Could not find the kernel module rtc.ko. Exiting..."
		exit
     fi
   else
     if [ $MODRTC -eq 0 ];then
        if insmod $MODPATH/rtc.ko 2>/dev/null;then
          echo "The RTC kernel module has been installed."
        else
          echo "Could not install $MODPATH/rtc.ko. Exiting..."
			exit
        fi
     fi
   fi
}

######################################################################
# 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`
                elif [ -f /etc/debian_version ] ; then
                        DIST="Debian"
                        PSUEDONAME=`cat /etc/debian_version`
				elif [ -f /etc/turbolinux-release  ] ; then
					DIST="Turbolinux"
					PSUEDONAME=`cat /etc/turbolinux-release`
                fi
        else
                #Unsupported OS
                DIST="UNKNOWN"
                PSUEDONAME="UNKNOWN"
        fi
}

######################################################################
# Display the status of a process
######################################################################
dl_status_ex()
{
	# Suse handles displaying status a bit differently,
	# so we have to handle it accordingly.  Unfortunately,
	# for some reason "checkproc" & then "rc_status -v" keeps
	# displaying "done"/"failed" instead of "running"/"stopped",
	# so we'll make the output be the same as RedHat instead.
	if [ ${DIST} = "SuSE" ]
	then
		PROCESS_NAME=${1##*/}
		PID=`${dl_pidofproc} $1`
		
		${dl_status} $1
		RC=$?
		
		if [ ${RC} -eq 0 ]
		then
			echo "${PROCESS_NAME} (pid ${PID}) is running..."
		else
			echo "${PROCESS_NAME} is stopped"
		fi
	else
		${dl_status} $1
	fi
}

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

	USAGE="Usage: `basename $0` {start|stop|restart|status}"
	RETVAL=$SUCCESS
#   check Root privilege
	if [ $UID -ne 0 ]
	then
       echo "Error: Root privileges are required to run HMP"
	   exit $NOTINST_ERROR
	fi

	SAVEPATH=$PATH
	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 your distribution's LSB package is installed."
		echo "$0: FATAL ERROR: Execution aborted due to invalid OS software installation."
		exit $NOTINST_ERROR
	fi
	get_release_info
	set_lsb_interface

	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 by running install.sh."
		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, Turbilinux is the same as the Red Hat
	MSG_SEP=
	[ -f /etc/redhat-release ] && MSG_SEP=":"
	[ -f /etc/turbolinux-release ] && MSG_SEP=":"

	case $1 in 
	start)
		# Validate the system date against the build creation date
		check_date
		
		# workaround to resolve a crash in video app
		rm -f /tmp/DLG_VO_MTKBitmap_*.*

		# Check for running services.
		if [ -f /var/lock/subsys/${SUBSYS#S??} ]
		then
			if [ "$HMPATCA" = 0 ]; then
				echo
				echo "ERROR:"
				echo "ERROR: Can not run while Dialogic services are running."
				echo "ERROR: Please stop the services using 'dlstop' and then rerun the script."
				echo "ERROR:"
				echo
			elif [ "$HMPATCA" = 1 ]; then
				echo
				echo "ERROR:"
				echo "ERROR: Can not run while Dialogic IP Media services are running."
				echo "ERROR: Please stop the services using 'dlstop' and then rerun the script."
				echo "ERROR:"
				echo
			fi
		else
			# Start Dialogic Services
			if [ "${DIST}" = "Debian" ]
			then
				check_rtc
			fi
			
			start_log &> /dev/null
			ct_intel_start	
			RETVAL=$?
			stop_log &> /dev/null
		fi
			;;
	stop)
		# Stop Dialogic Services
		start_log &> /dev/null
		ct_intel_stop	
		RETVAL=$?
		stop_log &> /dev/null
		;;

	restart)
		# Check for running service.
		if [ -f /var/lock/subsys/${SUBSYS#S??} ]
		then
			# Stop Dialogic Services
			start_log &> /dev/null
			ct_intel_stop 
			RETVAL=$?
			stop_log &> /dev/null
		fi

		# Start Dialogic Services
		start_log &> /dev/null
		ct_intel_start 
		RETVAL=$?
		stop_log &> /dev/null
		;;

	status)
		# Check for running service.
		if [ -f /var/lock/subsys/${SUBSYS#S??} ]
		then
			if [ "$HMPATCA" = 0 ]; then
				echo "Dialogic Services are running..."
				echo
			elif [ "$HMPATCA" = 1 ]; then
				echo "Dialogic IP Media Services are running..."
				echo
			fi
			RETVAL=$PROG_RUNNING
		else
			if [ "$HMPATCA" = 0 ]; then
				echo "Dialogic Services are stopped..."
				echo
			elif [ "$HMPATCA" = 1 ]; then
				echo "Dialogic IP Media Services are stopped..."
				echo
			fi
			RETVAL=$PROG_STOPPED
		fi

		if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 1.5 ]
		then
			dl_status_ex devmapserver
			dl_status_ex dlgtimeslotdolerserver
			dl_status_ex dlgsysmonitorserver
			dl_status_ex dlgsysclockserver
			dl_status_ex dlgclockdaemon
			[ -x ${INTEL_DIALOGIC_BIN}/boardserver ] && ${dl_status} boardserver
		elif [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] ||
                  [ ${DIALOGIC_RELNUM} = 4.1 ] && [ ${DIALOGIC_PLATFORM} = HMP ] ||
		     [ ${DIALOGIC_PLATFORM} = TVL2 ] ||
		     [ ${DIALOGIC_PLATFORM} = OVL ] ||
		     [ ${DIALOGIC_PLATFORM} = ZVL ]
		then
			dl_status_ex ${INTEL_DIALOGIC_BIN}/devmapserver
			dl_status_ex ${INTEL_DIALOGIC_BIN}/dlgtimeslotdolerserver
			dl_status_ex ${INTEL_DIALOGIC_BIN}/dlgsysmonitorserver
			dl_status_ex ${INTEL_DIALOGIC_BIN}/dlgsysclockserver
			dl_status_ex ${INTEL_DIALOGIC_BIN}/dlgclockdaemon
			dl_status_ex ${INTEL_DIALOGIC_BIN}/bmserver
			dl_status_ex ${INTEL_DIALOGIC_BIN}/snmpagent
			dl_status_ex ${INTEL_DIALOGIC_BIN}/cliagent

# remove until prototype becomes real IPY44224
 			if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 4.1 ] && [ -x ${INTEL_DIALOGIC_BIN}/RemoteAPIServer ]
 			then
				dl_status_ex ${INTEL_DIALOGIC_DIR}/web/html/oamwebguiagent
			fi
		fi
		;;
    
	gcts7start)
		if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] 
 		then
			gcts7_start
		fi
		;;

	gcts7stop)
		if [ ${DIALOGIC_PLATFORM} = HMP ] && [ ${DIALOGIC_RELNUM} = 3.1 ] 
 		then
			gcts7_stop
		fi
		;;

	*)
		echo ${USAGE}
		echo "ARGS: $*"
		RETVAL=$ARGUMEN_ERROR
		;;
	esac

	exit $RETVAL 

