#!/bin/sh
#
VERSION='$Id: sm_os_startup,v 1.36 2004/10/22 11:30:04 sesam Exp $'
VERBOSE=$1
MYSELF=$0
#
trap '' 1 2 3 4 5 6 15

#
# READ INI
read_ini()
{
  SM_INI=`grep -i '^sm_ini=' /etc/sesam2000.ini|cut -d"=" -f2`
  echo `grep -i "$1=" "$SM_INI"|cut -d"=" -f2`
}
#
#
# VERBOSE
my_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
    my_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()
{
  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
    my_echo "MODE=$SWTICH"
  else
    usage
  fi 
      
  my_echo "VERSION=$VERSION"
  GV_RO_BIN=`read_ini gv_ro_bin`
  GV_RO_SMS=`read_ini gv_ro_sms`
  GV_RO_DB=`read_ini gv_ro_db`
  GV_RW_GLBV=`read_ini gv_rw_glbv`
  GV_RW_DB=`read_ini gv_rw_db`
  GV_RW_LGC=`read_ini gv_rw_lgc`
  GV_RW_WORK=`read_ini gv_rw_work`
  GV_RW_SMS=`read_ini gv_rw_sms`
  GV_RW_STPD=`read_ini gv_rw_stpd`
  GV_RW_INI=`read_ini gv_rw_ini`
  GV_RO=`read_ini gv_ro`
  GV_RW=`read_ini gv_rw`

  GV_DB_TYPE=`read_ini gv_db_type`
  GV_DB_PORT=`read_ini gv_port_db`
  OPENRDA_INI=${GV_RW_INI}/openrda.ini
  export OPENRDA_INI
  export GV_RW
  export GV_RW
  if [ "$GV_DB_TYPE" != "postgres" ]
  then
     sql_cmd="${GV_RO_DB}/damisql -d sesam_db -q "
  else
     sql_cmd="psql -d sesam_db -p ${GV_DB_PORT} -c "
  fi
}
#
#
### GET PID ###

get_pid()
{
# PID CALL
  if [ "`uname`" = "FreeBSD" ]
  then
    MYPS="ps axo pid,$2"
  else
    MYPS="ps -e -o pid,$2"
  fi

  # LOG THE PID'S 
  #my_echo "Checkdate +"%Y%m%d %H:%M:%S" >> ${GV_RW_LGC}/${LOGFILE}
  
  # GET ALL PID'S BUT NO sm_setup AND sm_os_startup
  
  $MYPS | awk ''$1' && !/awk|sm_os_startup|sm_setup|sm_shutdown/ {print }' >>${GV_RW_LGC}/${LOGFILE}
  $MYPS | awk ''$1' && !/awk|sm_os_startup|sm_setup|sm_shutdown/ {print }' >&2
  $MYPS | awk ''$1' && !/awk|sm_os_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}
  
  my_echo "Terminate processes ${sm_process}"
  pids=`get_pid "/${sm_process}/" $sm_psout`
  my_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_sesam_processes()
{
# First stop all sm_stpd,sbc and sm_ctrlc processes. 
  my_echo "Stopping remaining Sesam jobs"

  stop_process 'sm_stpd$' -2 10
  stop_process 'sm_ctrlc$' -1 10
  stop_process 'sbc$' -1 1

  $sql_cmd "update results set state='c',msg='Abbruch durch sm_shutdown' where state='a';"
  $sql_cmd "update restore_results set state='c',msg='Abbruch durch sm_shutdown' where state='a';"
  
# in case of stop, execute sm_main stop, then terminate all hanging sesam processes
  if [ "$SWITCH" = "stop" ]
  then
    if [  -z "$KILL" ]
    then
      my_echo "Stopping sm_main"
      ${GV_RO_BIN}/sm_main stop >/dev/null 2>&1
    fi
    stop_process "sm_" -2 2
    stop_process "java.*sm_rmigui.jar" -2 5 args
    if [ "$GV_DB_TYPE" = "postgres" ]
    then
      stop_process "postmaster.*${GV_DB_PORT}" -2 5 args
    fi  
  fi


}

# START MAIN
sub_main()
{
  my_echo "Try to $SWITCH sm_main"
  ${GV_RO_BIN}/sm_main $SWITCH >/dev/null 2>&1
}
#
#
# SUB RETRY
sub_retry()
{
  my_echo "Retry start of sm_main"
  stop_sesam_processes
  ${GV_RO_BIN}/sm_main start >/dev/null 2>&1
  ${GV_RO_BIN}/sm_main status

  STATUS=$?
  if [ "$STATUS" = "0" ]
  then
    echo "Restart successful"
  else
    echo "Restart failed"
  fi

  exit $STATUS
}
#
#
# SUB_SET_MODE
# Change permission of some files
set_mode()
{
chown -R root:sesam $GV_RO/bin >/dev/null 2>&1 
chmod -R 755        $GV_RO/bin 
 
chown -R sesam:sesam $GV_RW_DB >/dev/null 2>&1       
chmod -R 700         $GV_RW_DB
ls $GV_RW_DB/*.conf >/dev/null 2>&1  &&  chmod  644  $GV_RW_DB/*.conf
 
[ -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
[ -d $GV_RW_GLBV ] || mkdir $GV_RW_GLBV

chmod -R 775 $GV_RW_GLBV
 
# change sbc_gen.sh to apropriate shell
if [ `uname` = "OSF1" ]
then
   if [ `head -1 $GV_RO_BIN/sbc_gen.sh` != "#!/bin/ksh" ]
   then
      echo "#!/bin/ksh" > $GV_RO_BIN/sbc_gen.tmp$$
      cat $GV_RO_BIN/sbc_gen.sh >> $GV_RO_BIN/sbc_gen.tmp$$
      cp -p $GV_RO_BIN/sbc_gen.tmp$$ $GV_RO_BIN/sbc_gen.sh
      rm -r $GV_RO_BIN/sbc_gen.tmp$$
      echo "Shell for $GV_RO_BIN/sbc_gen.sh modified to #!/bin/ksh"
   fi
fi
chmod 755 $GV_RO_BIN/sbc_gen.sh
chmod 755 $GV_RO_BIN/sbc
}
#
#
# MAIN_PROC
main_proc()
{
my_echo "$MYSELF $SWITCH sesam Server"

set_mode

if [ "$VERBOSE" = "-v" ]
then
  ${GV_RO_BIN}/sm_main status
else
  ${GV_RO_BIN}/sm_main status > /dev/null 2>&1
fi

STATUS=$?
echo STATUS: $STATUS
if [ "$SWITCH" = "start" ]
then
  if [ "$STATUS" = "0" ]
  then
    echo "Sesam already running"
    exit 0
  fi  

  if [ "$STATUS" = "1" ]
  then
    ${GV_RO_BIN}/sm_main status 
    STATUS=$?
  fi

  if [ "$STATUS" = "1" -o "$STATUS" = "3" ]
  then
    ${GV_RO_BIN}/sm_main status
    echo "WARNING PARTS ALREADY RUNNING. WILL RESTART AGAIN."
    sub_retry
    exit $STATUS 
  fi
fi

# DAEMON
if [ "$SWITCH" = "start" ]
then
  my_echo "Try to start sm_main"
  ${GV_RO_BIN}/sm_main $SWITCH >/dev/null 2>&1
fi

if [ "$VERBOSE" = "-v" ]
then
  ${GV_RO_BIN}/sm_main status
else
  ${GV_RO_BIN}/sm_main status > /dev/null 2>&1
fi

STATUS=$?
echo Status:    $STATUS
if [ "$SWITCH" = "start" ]
then
  if [ "$STATUS" = "0" ]
  then
    echo "STARTING SUCCESSFULLY"
  fi
  
  if [ "$STATUS" = "1" -o "$STATUS" = "2" -o "$STATUS" = "3" ]
  then
    ${GV_RO_BIN}/sm_main status
    echo "WARNING MISSING SUB DAEMONS. WILL RETRY AGAIN."
    sub_retry    
  fi 
else
  if [ "$STATUS" = "0" ]
  then
    echo "STOPPING WITH WARNING"
    ${GV_RO_BIN}/sm_main status
  fi

  if [ "$STATUS" = "3" ]
  then
    echo "STOPPING SUCCESSFULLY"   
  fi
fi

# kill hanging sm_ctrlc,stpd and sbcs in case of start
stop_sesam_processes   

my_echo "$MYSELF $SWITCH sesam Server done"
echo "$SWITCH sesam Server done"
}  # end of main_proc()


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

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


exit $STATUS

