#!/bin/sh

# the following is the LSB init header see
# http://www.linux-foundation.org/spec//booksets/LSB-Core-generic/LSB-Core-generic.html#INITSCRCOMCONV
#
### BEGIN INIT INFO
# Provides:          risocontrollerd
# Required-Start:
# Should-Start:
# Default-Start:     3 5
# Required-Stop:
# Should-Stop:
# Default-Stop:      0 1 2 4 6
# Short-Description: RISO controller daemon
# Description:
### END INIT INFO


SCRIPT_BIN=/usr/bin/risocontrollerd
SCRIPT_PID=/var/run/risocontrollerd.pid
PYTHON=/usr/bin/python3

#make sure logdirs exist in anycase otherwise riso controller does not start
[ -e /var/log/recoveryISO ] || {
    mkdir /var/log/recoveryISO 1>/dev/null 2>/dev/null
}
[ -e /var/pgsql/recoveryISO ] || {
    mkdir /var/pgsql/recoveryISO 1>/dev/null 2>/dev/null
}
[ -e /var/log/recoveryISO/riso_central_appliance.log ] || {
    touch /var/log/recoveryISO/riso_central_appliance.log 1>/dev/null 2>/dev/null
}

test -e $SCRIPT_BIN || { echo "$SCRIPT_BIN not installed";
         if [ "$1" = "stop" ]; then exit 0;
	 else exit 5; fi; }

# A simple and (hopefully) POSIX-compatible startproc wrapper.
# TODO: handle options, since not all are compatible with checkproc -> these have to be filtered out
# TODO: use an optional flock to avoid a possible race condition between checkproc and removing a stale PID file

WAIT_SEC=60

startproc_wait(){
  # Search for a PID file parameter (-p <PID file>)
  unset PIDFILE
  for p in "$@"; do
    if [ -n "${PIDFILE+x}" ]; then
      PIDFILE="$p"
      break
    fi
    if [ "$p" = "-p" ]; then
      PIDFILE=""
    fi
  done

  if [ -n "$PIDFILE" ]; then
    if [ -e "$PIDFILE" ]; then
      checkproc -k "$@" >/dev/null 2>&1
      rc=$?
      if [ $rc -ne 0 ]; then
        # Either stale PID file or other error.
        # The best we can do is to try to delete the PID file in any case.
        rm "$PIDFILE" >/dev/null 2>&1
      fi
    fi
  fi

  startproc "$@"
  rc=$?

  if [ $rc -eq 0 ]; then
    if [ -n "$PIDFILE" ]; then
      WAIT=0
      FOUND=false
      while [ $WAIT -lt $WAIT_SEC ]; do
        if [ -e "$PIDFILE" ]; then
          FOUND=true
          break
        fi
        sleep 1
        WAIT=`expr $WAIT + 1`
      done
      # rc can be changed here using FOUND
      # if ! $FOUND; then ...; fi
      # echo "Waited $WAIT second(s) for $PIDFILE."
    fi

    # startproc returns success more often than needed -> additional check
    checkproc -k "$@" >/dev/null 2>&1
    rc=$?
  fi

  return $rc
}

#OSFOURK-24126 PRB000065612: API ROOT error in Appliance Management
if [ -e /etc/sg2d.emulate.rc.functions ] ; then
. /etc/sg2d.emulate.rc.functions
else
. /etc/rc.status
fi

rc_reset

#OSFOURK-24698 PRB000068758:RISO sqlite3.DatabaseError > RISO resource not starting
function check_for_db_errors() {
  #in case daemon is NOT running do not do anything
  checkproc -p $SCRIPT_PID $PYTHON $SCRIPT_BIN || return 0
  #check for errors
  if [ -e /var/log/recoveryISO/riso_central.log ] && tail -n 100 /var/log/recoveryISO/riso_central.log | grep "malformed database schema" ; then
    logger $0 "found malformed database schema errors in riso_central.log => delete DB and restart riso ..."
    echo "found malformed database schema errors in riso_central.log => delete DB and restart riso ..."
    [ -e /opt/dscxl/share/recoveryISO/riso.db ] && {
      rm -f /opt/dscxl/share/recoveryISO/*.csv /opt/dscxl/share/recoveryISO/riso.db
      cat > /tmp/riso.db.bz2.uuenc << '_EOF_RISO_DB_'
begin 600 -
M0EIH.3%!629363#(9C4`!"M_^?_^+HOLYEPB?^5_P+_O_[`*TT0`$```$!``
M(2A0`[ES4O&E`!B*-$TT--#0&C0#(``!H&@`````,<#3330:&AH9&@&0!H:`
MTT9```PF(#02:DBI^E#Q0>H>H`]0T`T``````T:`#0#:D4TT@:9/)#1IH!H`
M``-`&@&@&@`;4"I)"!J9$;(-4\H>0C1H&F@!H``#30/4:>IIM1DAK5"V6J_W
M%T>NTF#-+5J9(),N,'L8X<"XK9N'>PL!)B9RJHU&$FN33QU)II)B<6:EF*J"
M3.TC2`211B`(%ED"_;TG<#D1AT`CG/$?^/A$C`D.68&1Q].F+73$03&'4XU2
MC4'Q"YF50P889"B)`IH4]&F,23[=\((%?LD($^@)`J@"%[,@"L)%>M53BPRN
MW.4NJB[?4=^35J^*J**>TO+BTJ,^@WOXOJPK#E+8>^!\$H@>P3!S)9RC5E11
MH`X4`3P9:R_LOHV]U,II@*06`T)0J(I$JJC`6512M6T80)]P&UAFDWR9)/1)
M"'1.<*0J#,S6BJ[V_FJ6HFHLPS3@$*:%<,,.H!1="??"4;]`;\D1UW0<KZ$I
M?"5C"4=F3PR1%CP_G":&C-">"3[N/<6\38G^M,Z'N<9A.OQ21'1$%I/-D_>$
ML0<[([E4J^2$-A,YK;L^2BQ$3^YX0#92<'!Y]*MBK4JNFK5<\SMZS=DNAWI@
MSH[P<A^M2N7!PM+0:C2AR^.+Y,LRY?`3\9J#IG=RS`EAU>C;4<@,P&OETAL9
MF,VIH!&3-,J[:EW6]J4W):JEU;.`UPRJLEIUIQ18:6GB]23%A72&AI8X7+EU
MVN-28+KURUTP67F9*DFV^-9W+)6U=FW#G6E9F@+>*2Z.T38>G)5U3<"GD.>Y
M%S03DCFF/](;#;*%7JJF\&#;MPC?;N9KI5%5*JDR+Y"^E.IJ:1D"IU.QO#5U
MIQ4JM/=D<9IET1NM*'53/)Y.;(=I@UP^6;'8XFXQ#8.`+N*JK/."I@SQ.SAD
MJMG-DQ8,*5B>NSQDK1+^9>&DP6+Z8T6IDBI%REEUV-^0P3%A*F+'@#1):Y?*
M6S(S!=+JRL[!@RK(6ODX8J&<\;JY-[6R2.'=-F,7P7R;6F7R;SK<#DF2=N9X
I\LEIM-AJ63<)ZC3R1;"G&!W[J[K/B^4B&*2`<)#?XNY(IPH2!AD,QJ``
`
end
_EOF_RISO_DB_
      cat /tmp/riso.db.bz2.uuenc | uudecode | bzip2 -dc > /opt/dscxl/share/recoveryISO/riso.db
      chmod 755 /opt/dscxl/share/recoveryISO/riso.db
    }
    #move the log away so that errors are not found on the next runs
    mv /var/log/recoveryISO/riso_central.log /var/log/recoveryISO/riso_central.log.db.errors.$(date +%s)
    #kill the daemon ... HA will restart it
    killproc -t 5 -p $SCRIPT_PID $PYTHON $SCRIPT_BIN
  fi
  return 0
}


case "$1" in
    start)
        echo -n "Starting risocontrollerd "
        
        #OSFOURK-26112
        /opt/recoveryISO/recoveryISO.sh install_cron_ensure_riso_controller_is_working
        
        # renice if startproc was successful, but ignore the exit codes
        startproc_wait -q -p $SCRIPT_PID $PYTHON $SCRIPT_BIN &&
          { renice -n 4 -p `cat $SCRIPT_PID` || true; } > /dev/null
        rc_status -v
        #register feature notification for RISO restore progress
        /opt/inventory/inventory register_notification_callback RISORESTORE /opt/recoveryISO/recoveryISO_restore_progress_callback.sh
	#temp fix - remove csv files in case of start failure => next start called by HA should go well
	checkproc -p $SCRIPT_PID $PYTHON $SCRIPT_BIN || rm -f /opt/dscxl/share/recoveryISO/*.csv /opt/dscxl/share/recoveryISO/riso.db
        ;;
    stop)
        echo -n "Shutting down risocontrollerd "
        # send SIGTERM, and wait up to 30 secs, send SIGKILL if SIGTERM is unsuccessful
        killproc -t 30 -p $SCRIPT_PID $PYTHON $SCRIPT_BIN > /dev/null 2>&1
        rc_status -v
        ;;
    try-restart)
        $0 status >/dev/null &&  $0 restart
        rc_status
        ;;
    restart)
        $0 stop
        $0 start
        rc_status
        ;;
    reload)
        #killproc -HUP $SCRIPT_BIN
        # It does not support reload (yet)
        rc_failed 3
        rc_status -v
        ;;
    status)
        #OSFOURK-24698 PRB000068758:RISO sqlite3.DatabaseError > RISO resource not starting
        (
          check_for_db_errors
        )
        echo -n "Checking status of risocontrollerd "
        checkproc -p $SCRIPT_PID $PYTHON $SCRIPT_BIN
        rc_status -v
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|try-restart|reload|status}"
	rc_failed 2
	rc_exit
        ;;
esac
rc_exit
