#!/bin/bash
# skip crab_syntax
### BEGIN INIT INFO
# Provides:		redis-server
# Required-Start:	$syslog $remote_fs
# Required-Stop:	$syslog $remote_fs
# Should-Start:		$local_fs
# Should-Stop:		$local_fs
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	redis-server - Persistent key-value db
# Description:		redis-server - Persistent key-value db
### END INIT INFO

# Родной скрипт не убивал процесс при стопе или рестарте,
# передал по аналогии со скриптами eva_app, все параметры запуска сохранены первоначальными.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/redis-server
DAEMON_ARGS=/etc/redis/redis.conf
NAME=redis-server
DESC=redis-server

RUNDIR=/var/run/redis
PIDFILE=$RUNDIR/redis-server.pid

DEBUG=TRUE
DEBUG_PID=$$
DEBUG_SCRIPT=$0
DEBUG_ARGS=$*
DEBUG_LOG=/var/log/redis/debug_init_d.log

test -x $DAEMON || exit 0

if [ -r /etc/default/$NAME ]
then
	. /etc/default/$NAME
fi

export LANG=en_US.UTF-8
# export LANGUAGE=en_US:en
# export LC_ALL=en_US.UTF-8

. /lib/lsb/init-functions

set -e

debug() {
	if [ "${DEBUG:-}" = "TRUE" ]; then
		echo "$(date +'%Y-%m-%d %H:%M:%S') $DEBUG_SCRIPT:$DEBUG_ARGS:$DEBUG_PID $1" >>"$DEBUG_LOG"
	fi
	return 0
}

is_running() {
	debug "is_running pidfile $PIDFILE $([ ! -f $PIDFILE ] && echo "not ")exists,\
pid=$(cat $PIDFILE 2>/dev/null), \
proc $([ ! -s "$PIDFILE" ] || [ ! -d "/proc/$(cat $PIDFILE)" ] && echo "not ")exists"
	if [ ! -s "$PIDFILE" ] || [ ! -d "/proc/$(cat $PIDFILE)" ]; then
		return 1
	fi
	return 0
}

check_pid_process() {
	ps_axm="$(ps axm)"
	# Ubuntu 20.04: /usr/bin/redis-server 127.0.0.1:0
	# Ubuntu 24.04: /usr/bin/redis-server unixsocket:/var/run/redis/redis-server.sock
	ptrn="$(cat $PIDFILE) .* /usr/bin/redis-server (127.0.0.1:0|unixsocket)"
	# Странная ситуация, иногда в pid попадал другой процесс
	if ! grep -q -E "$ptrn" <<<"$ps_axm"; then
		debug "check_pid_process pidfile $PIDFILE $(cat $PIDFILE) not this proccess: \
$(ps axm | grep "$(cat $PIDFILE)" | grep -v grep)"
		return 1
	fi
	return 0
}

kill_proc_by_daemon_args() {
	ps axm | grep "/usr/bin/redis-server 127.0.0.1:0" | grep -v grep \
		| awk '{ print $1; }' > /tmp/init_d_procs_to_kill.$$
	if [ -s /tmp/init_d_procs_to_kill.$$ ]; then
		debug "kill_proc_by_daemon_args procs to kill $(cat /tmp/init_d_procs_to_kill.$$)"
		while read -r pid t; do
			[ -d /proc/$pid ] && kill -TERM $pid
		done < /tmp/init_d_procs_to_kill.$$
		sleep 1
		while read pid t; do
			[ -d /proc/$pid ] && kill -KILL $pid
		done < /tmp/init_d_procs_to_kill.$$
	fi
	rm -f /tmp/init_d_procs_to_kill.$$
	return 0
}

if [ "$(id -u)" != "0" ]
then
	:
	# log_failure_msg "Must be run as root."
	# exit 1
fi

debug "Start $0 $*"

case "$1" in
  start)
	echo -n "Starting $DESC: "
	if is_running; then
		if ! check_pid_process; then
			echo "rm bad pidfile and start."
			rm -f $PIDFILE
			${0} start
		else
			echo "already started."
		fi
	else
		mkdir -p $RUNDIR
		rm -f $PIDFILE
		touch $PIDFILE
		if [ $(id -u) = 0 ]; then
			chown evauser:evagroup $RUNDIR $PIDFILE
			chmod 775 $RUNDIR

			if [ -n "$ULIMIT" ]
			then
				ulimit -n $ULIMIT || true
			fi
		fi

		if start-stop-daemon --start --quiet --oknodo --umask 007 --pidfile $PIDFILE --chuid evauser:evagroup --exec $DAEMON -- $DAEMON_ARGS
		then
			echo "$NAME started."
		else
			echo "failed."
		fi
	fi
	;;
  stop)
	echo -n "Stopping $DESC: "
	if ! is_running; then
		echo "already stopped."
	else
		kill -INT `cat $PIDFILE`
		if start-stop-daemon --stop --retry forever/TERM/1 --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON
		then
			if is_running; then
				# По идее нам не обязательно ждать когда демон остановится, но в некоторых случаях может быть довольно долго
				# и падать зависимые от работоспособности демона вещи в скриптах. Например синхронизация пользователей.
				for i in $(seq 1 30); do
					! is_running && break
					sleep 1
				done
			fi
			if is_running; then
				echo "$NAME may still be stopping down or stopping may have failed."
			else
				echo "$NAME stopped."
			fi
		else
			echo "failed."
		fi
		rm -f $PIDFILE
		sleep 1
	fi
	kill_proc_by_daemon_args
	;;

  restart|force-reload)
	${0} stop
	${0} start
	;;

  status)
	status_of_proc -p ${PIDFILE} ${DAEMON} ${NAME}
	;;

  *)
	echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
	exit 1
	;;
esac

debug "End $0 $*"

exit 0
