#!/bin/sh
#
VERSION='$Id: sm_os_startup,v 1.41 2005/10/25 14:08:02 sesam Exp $'
VERBOSE=$1
MYSELF=$0

AWK=awk
#
trap '' 1 2 3 4 5 6 15

#export LANG=de_DE.ISO8859-1
#export LC_CTYPE=de_DE.ISO8859-1


#
# READ INI
read_sm_ini()
{
  . `grep -i '^sm_ini=' /etc/sesam2000.ini|cut -d"=" -f2` 2>/dev/null
}
#
# VERBOSE
sm_echo()
{
  if [ "$VERBOSE" = "-v" ] 
  then
    echo `date +"%Y%m%d %H:%M:%S"`: "$1" >&2
  fi
}

check_version()
{
   ${gv_ro_bin}/sm_check_version  >>${gv_rw_lgc}/sm_check_version.lgc 2>&1
}

#
#
# USAGE
usage()
{
echo "   $VERSION"
echo "   usage: $0 [-v] start|stop"
echo "   default mode start"
exit 1
}
#
#
# SUPER USER CHECK
sub_root_check()
{
if [ `id -u` != 0 ]
then
  sm_echo "Fatal: sesam startup requires superuser rights!"
  ${gv_ro_bin}/sm_prot "Fatal: sesam startup requires superuser rights!"
  exit 1
fi
}
#
#
# SET ENVIRONMENT  
sub_env()
{
read_sm_ini

if [ "`uname`" = "SunOS" ]
then
  PATH=/usr/xpg4/bin:$PATH
  export PATH
fi

if [ "$1" = "" -o "$1" = "start" -o "$1" = "START" -o "$2" = "start" -o "$2" = "START" ]
then
  SWITCH="start"
  LOGFILE="sm_startup.lgc"
fi

if [ "$1" = "stop" -o "$1" = "STOP" -o "$2" = "stop" -o "$2" = "STOP" ]
then
  SWITCH="stop"
  LOGFILE="sm_shutdown.lgc"	
fi

if [ "$SWITCH" = "start" -o "$SWITCH" = "stop" ]
then
  sm_echo "MODE=$SWTICH"
else
  usage
fi 
    
sm_echo "VERSION=$VERSION"

LD_LIBRARY_PATH=${gv_ro_bin}:$LD_LIBRARY_PATH
OPENRDA_INI=${gv_rw_ini}/openrda.ini
export OPENRDA_INI LD_IBRARY_PATH
}
#
#
### GET PID ###

get_pid()
{
# PID CALL
if [ "`uname`" = "FreeBSD" ]
then
  MYPS="ps axo pid,$2"
else
  MYPS="ps -e -o pid,$2"
fi
# GET ALL PID'S BUT NO sm_setup AND sm_os_startup

$MYPS | ${AWK} ''$1' && !/awk|sm_os_startup|sm_setup|sm_startup|sm_shutdown/ {print }' >>${gv_rw_lgc}/${LOGFILE}
$MYPS | ${AWK} ''$1' && !/awk|sm_os_startup|sm_setup|sm_startup|sm_shutdown/ {print }' >&2
$MYPS | ${AWK} ''$1' && !/awk|sm_os_startup|sm_startup|sm_setup|sm_shutdown/ {print $1}'
}

stop_process()
{
#set -x
sm_process=$1
sm_signal=${2:--2}
sm_sleep=${3:--10}
sm_psout=${4:-comm}
  
sm_echo "Terminate processes ${sm_process}"
pids=`get_pid "/${sm_process}/" $sm_psout`
sm_echo "Found PIDs: $pids"
if [ -n "$pids" ]
then
  echo $pids |xargs -t kill "${sm_signal}" 
  sleep ${sm_sleep}
  pids=`get_pid "/${sm_process}/" $sm_psout`
  if [ -n "$pids" ]
    then
      echo $pids |xargs -t kill -9  
      sleep 1
    fi 
fi
}



### STOP ALL SESAM PROCCESSES ###
stop_processes()
{
# First stop all sm_stpd,sbc and sm_ctrlc processes. 
sm_echo "Stopping remaining Sesam jobs"
if [ "$1" = "backup" ]
then
  stop_process 'sm_stpd$' -2 10
  stop_process 'sm_ctrlc$' -1 10
  stop_process 'sbc$' -1 1
fi
# in case of stop terminate all hanging sesam processes
if [ "$1" = "all" ]
then
  cd ${gv_ro_sms} 
  stop_process "`ls -A sm_* |tr '\n' '|'`XXX" -2 2
  cd ${gv_ro_bin} 
  stop_process "`ls -A sm_* sbc*|tr '\n' '|'`XXX" -2 2
  stop_process "java.*sm_rmigui.jar" -2 5 args
  if [ "$gv_db_type" = "postgres" ]; then
    stop_process "postmaster.*${gv_port_db}" -2 5 args
    rm -f /tmp/.s.PGSQL.${gv_port_db} ${gv_rw_db}/postmaster.pid
  fi
fi
}
#
# ===============================
# SUB_SET_MODE
# Change permission of some files
set_mode()
{
chown -R root:sesam $gv_ro/bin  >/dev/null 2>&1 # user/group sesam is not mandatory 
chmod -R 755        $gv_ro/bin  >/dev/null 2>&1 # set mode for all sm_... files

chown -R sesam:sesam $gv_rw_db  >/dev/null 2>&1
chmod -R 700         $gv_rw_db

[ -r /dev/cam ]  &&  chmod 755 /dev/cam

# chmod 666 shmem.txt to let all dataserver have access to file
[ -r $gv_rw_work/ctl/shmem.txt ]  &&  chmod 666 $gv_rw_work/ctl/shmem.txt

[ -r $gv_rw_ini/sbc_slox.ini ]    &&  chmod 600 $gv_rw_ini/sbc_slox.ini
ls $gv_rw_db/*.conf >/dev/null 2>&1  &&  chmod  644  $gv_rw_db/*.conf
[ -d $gv_rw_glbv ] || mkdir $gv_rw_glbv
chmod -R 775 $gv_rw_glbv
}
#
#
# MAIN_PROC

start_sesam()
{
if [ "$STATUS" = "0" ]
then
  echo "STATUS=SUCCESS MSG=All deamons online"
  exit 0
elif [ "$STATUS" = "4" ]
then
  stop_processes all 
elif [ "$STATUS" = "1" -o "$STATUS" = "3" ]
then
  echo "STATUS=WARNING MSG=Some deamons not running. Try to start them now"
  stop_processes backup 
fi 
${gv_ro_bin}/sm_main start 
STATUS=$?
exit $STATUS
}

stop_sesam()
{
if [ "$STATUS" = "4" ]
then
  echo "STATUS=SUCCESS MSG=All deamons already stopped."
  ret=0
else
  ${gv_ro_bin}/sm_main stop
  if [ "$STATUS" = "0" ]
  then
    echo "STATUS=SUCCESS MSG=All deamons stopped."
    ret=0
  else
    echo "STATUS=ERROR MSG=Some deamons still running."
    ret=3
  fi
fi
stop_processes all
}



main_proc()
{
sm_echo "$MYSELF $SWITCH sesam Server"
#-------
set_mode

${gv_ro_bin}/sm_main status 2>/dev/null 
STATUS=$?
echo STATUS: $STATUS

if [ "$SWITCH" = "start" ]
then
check_version
start_sesam
elif [ "$SWITCH" = "stop" ]
then
stop_sesam
fi 
sm_echo "$MYSELF $SWITCH sesam Server done"
echo "$SWITCH sesam Server done"
}  # end of main_proc()


###################  MAIN  ###########################

# RUN SUBROUTINES
sub_env $1 $2
main_proc 2>&1 </dev/null | tee -a ${gv_rw_lgc}/${LOGFILE} 

exit $STATUS

