#!/bin/sh
# @(#) sqlr40.suse - A.04.00
# SQL/R startup/shutdown script, SuSE Linux
#
# (C) Copyright Marxmeier Software AG, 2010-2022
#
# This file is installed as /etc/init.d/sqlr40

### BEGIN INIT INFO
# Provides: sqlr40
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $local_fs $syslog
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Short-Description: Start the SQL/R daemon
# Description: Start/stop the SQL/R daemon
### END INIT INFO

# save script name
script=${0##*/}

# define path, in case this is executed from user environment
PATH=/sbin:/bin:/usr/bin

# Source SuSE config
SYSTEMD_NO_WRAP=1
[ -s /etc/rc.status ] && . /etc/rc.status

# These are defined in /etc/rc.status with recent SuSE releases
if [ -z "$rc_done" ]; then
   if [ -t 1 -a "$TERM" != "raw" -a "$TERM" != "dumb" ]; then
      stat=$(echo -en "\033[71G")
      norm=$(echo -en "\033[m")
      extd=$(echo -en "\033[1m")
      warn=$(echo -en "\033[1;31m")
      done=$(echo -en "\033[1;32m")
      attn=$(echo -en "\033[1;33m")
      rc_done="${stat}${done}done${norm}"
      rc_running="${stat}${done}running${norm}"
      rc_failed="${stat}${warn}failed${norm}"
      rc_missed="${stat}${warn}missing${norm}"
      rc_skipped="${stat}${attn}skipped${norm}"
      rc_dead="${stat}${warn}dead${norm}"
      rc_unused="${stat}${extd}unused${norm}"
      rc_unknown="${stat}${attn}unknown${norm}"
   else
      rc_done="[done]"
      rc_running="[running]"
      rc_failed="[failed]"
      rc_missed="[missing]"
      rc_skipped="[skipped]"
      rc_dead="[dead]"
      rc_unused="[unused]"
      rc_unknown="[unknown]"
   fi
fi

# common SQL/R rc functions
SQLR=${SQLR:=/opt/sqlr/4.0}
if [ ! -s ${SQLR}/etc/rcfunctions ] ; then
   echo "ERROR: ${SQLR}/etc/rcfunctions file missing. $rc_skipped"
   exit 5
fi
. ${SQLR}/etc/rcfunctions

# script exit status
typeset -i rval=0

# source configuration file

if [ -s /etc/sysconfig/sqlr40 ]; then
   RCFILE=/etc/sysconfig/sqlr40
elif [ -s /etc/rc.config.d/sqlr40 ]; then
   RCFILE=/etc/rc.config.d/sqlr40
elif [ -s /etc/rc.config ]; then
   RCFILE=/etc/rc.config
else
   echo "ERROR: Configuration file /etc/sysconfig/sqlr40 does not exist. $rc_unused"
   exit 6
fi

. $RCFILE
if [ $? -ne 0 ]; then
   echo "Sytax error in $RCFILE configuration file. $rc_failed"
   exit 1
fi

# check if binaries are installed

if [ $START_SQLR -ne 0 -a ! -x $ODBCD ]; then
   echo "ERROR: $ODBCD is not executable or doesn't exist. $rc_skipped"
   exit 5
fi

### functions ###

sqlr_act_msg1=sqlr_act_msg1
sqlr_act_msg2=sqlr_act_msg2
sqlr_stat_msg1=sqlr_stat_msg1
sqlr_stat_msg2=sqlr_stat_msg2

function sqlr_warn_msg
{
   if [ -t 1 ]; then
      echo "$* $rc_failed"
   else
      echo "$*"
   fi
}

function sqlr_act_msg1
{
   if [ -t 1 ]; then
      printf "%-65s" "$*"
   else
      echo -n "$*"
   fi
}

function sqlr_act_msg2
{
   typeset -i _rc
   
   _rc=$1

# program is not running which is success if we stop/restart service
   if [ $sqlr_todo = stop -o "$sqlr_todo" = restart ]; then
      [ $_rc -eq $sqlr_rc_notrunning ] && _rc=0
   fi

   case $_rc in
   0) echo "$rc_done" ;;
   1) echo "$rc_failed" ;;
   7) echo "$rc_dead" ;;
   *) echo "$rc_failed ($_rc)" ;;
   esac
}

function sqlr_stat_msg1
{
   if [ -t 1 ]; then
      printf "%-65s" "$*"
   else
      echo -n "$*"
   fi
}

function sqlr_stat_msg2
{
   typeset -i _rc
   
   _rc=$1
   case $_rc in
   $sqlr_stat_ok)
      ;;
   $sqlr_stat_stopped) 
      [ $rval -eq $sqlr_stat_ok ] && rval=$sqlr_stat_stopped ;;
   $sqlr_stat_deadpid) 
      [ $rval -eq $sqlr_stat_ok ] && rval=$sqlr_stat_deadpid ;;
   *)
      rval=$sqlr_stat_unknown ;;
   esac

   if [ ! -t 1 ]; then
      echo
      return
   fi

   case $_rc in
   $sqlr_stat_ok) 
      echo "$rc_running" ;;
   $sqlr_stat_deadpid)
      echo "$rc_dead" ;;
   $sqlr_stat_stopped)
       echo "$rc_unused" ;;
   *)
       echo "$rc_unknown ($_rc)" ;;
   esac
}


### main ###

sqlr_todo="${1:-NOTSET}"
if [ $sqlr_todo != NOTSET ]; then
   shift
   sqlr_arg_list="$@"
fi

case "$sqlr_todo" in
start)
   [ $START_STOP_AS_ROOT != 0 ] && sqlr_is_not_root && {
      echo "ERROR: root privileges required. $rc_failed"
      exit 4
   }
   # START_SQLR is only used if no arguments are present
   [ -z "$sqlr_arg_list" ] && [ $START_SQLR = 0 ] && {
      echo "Note: SQL/R not configured for automatic startup. $rc_skipped"
      exit 0
   }
   sqlr_foreach sqlr_odbcd_start
   sqlr_check_args
   ;;

stop)
   [ $START_STOP_AS_ROOT != 0 ] && sqlr_is_not_root && {
      echo "ERROR: root privileges required. $rc_failed"
      exit 4
   }
   sqlr_foreach sqlr_odbcd_stop
   sqlr_verify_terminated
   sqlr_check_args
   ;;

restart|force-reload)
   [ $START_STOP_AS_ROOT != 0 ] && sqlr_is_not_root && {
      echo "ERROR: root privileges required. $rc_failed"
      exit 4
   }
   sqlr_foreach sqlr_odbcd_stop
   sqlr_verify_terminated   
   sqlr_foreach sqlr_odbcd_start
   sqlr_check_args
   ;;

status)
   sqlr_foreach sqlr_odbcd_status
   sqlr_check_args
   ;;

info) 
   if [ -z "$sqlr_arg_list" ]; then
      echo "Gobal configuration:"
      echo " START_SQLR = $START_SQLR"
      echo " START_STOP_AS_ROOT = $START_STOP_AS_ROOT"
      echo 

      echo "sqlrodbcd instances:"
      cnt=${#ODBCD_CFG[*]}
      echo " Number of instances: $cnt"
   fi
   sqlr_foreach sqlr_odbcd_info
   sqlr_check_args
   ;;

reload)
   echo "WARNING: reload not implemented. $rc_missed"
   exit 3
   ;;

*)
   echo "Usage: $script <action> [<instance> ...]"
   echo "action:={start|stop|status|restart|info}"
   echo "instance:={sqlrodbc|instance name ...}"
   exit 2
   ;;
esac

# echo debug output

if [ "$sqlr_todo" = status ]; then
   [ $rval -eq $sqlr_stat_ok -a $sqlr_rval != $sqlr_rc_ok ] && rval=$sqlr_stat_unknown
else
   [ $rval = 0 ] && rval=$sqlr_rval;
   if [ "$sqlr_todo" != info -a $rval = $sqlr_rc_failed ]; then
      echo -e "\n--- Log messages ---$sqlr_rmsg\nExit code: $rval"
      [ -d /var/${SQLR} -a $(id -u) = 0 ] &&
      echo -e "$script: $sqlr_todo\n--- Log messages ---$sqlr_rmsg\nExit code: $rval" > /var/${SQLR}/rc.log
   fi
fi

exit $rval
