#!/bin/bash
# skip crab_syntax
set -eu

# LXC в отличии от докера по-умолчанию не инициализирует окружение. Естановим сами что надо.
export HOME=/root
export USER=root
export LANG=en_US.UTF-8
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# for psql
[ ! -z "${TZ:-}" ] && export PGTZ="$TZ"

# Для поддержки docker exec, TODO eva_init.sh
[[ $# != 0 ]] && exec "$@"

declare shutdown=0
# init-скрипт для контейнера Eva
# Example https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/docker/assets/wrapper
# Сергей предлагает использовать init https://github.com/krallin/tini
# Вроде как он встроен в докер и активируется по --init флагу

container_stop() {
	local sig="${1:--}"
	echo "$sig signal received, try to gracefully shutdown all services..." >&2
	# /opt/bin/services stop
	shutdown=1
	# exit 0
	return 0
}


# SIGPWR - lxc halt/stop
# SIGINT - lxc reboot
# SIGTERM - docker
trap "container_stop TERM" TERM
trap "container_stop PWR" PWR
trap "container_stop INT" INT
trap "container_stop HUP" HUP


main(){
	echo "Инициализируем контейнер и конфигурацию"
	/opt/bin/eva_init.sh

	# Добавляем запись в логи после eva_init, т.к. до этого каталог с логами может быть не инициализирован
	local log=/var/log/init.log
	touch "$log"
	tail --follow=name --retry --lines=0 --pid=$$ "$log" &
	exec &>>"$log"
	sleep 0.3  # wait tail start

	echo "Запускаем сервисы"
	/opt/bin/services start

	# Это строка анализируется скриптом установки в eva_admin. Не менять!
	echo "Контейнер запущен."
	local watchdog_ts now
	watchdog_ts=$(date +%s)
	while true; do
		# TODO delme, при сборке используем wrapper_fake
		# if [ -f /eva_build ]; then
		#	# Идет сборка
		#	sleep 10
		#	continue
		# fi
		# if [ -f /need_update ]; then
		#	echo "Выставлен флаг обновления. Скачиваем обновление"
		#	/opt/eva_deploy/update_scripts/update_download.sh
		#	echo "Останавливаем все сервисы"
		#	/opt/bin/services stop
		#	echo "Запускаем обновление"
		#	/opt/eva_deploy/update_scripts/update_apply.sh
		#	# Ждем
		#	# wait
		#	echo "Снимаем флаг обновления"
		#	rm /need_update
		#	echo "Делаем re-exec себя"
		#	exec /wrapper
		# fi
		now=$(date +%s)
		if [ ! -f /mnt/shared/upgrade_running ] && (( now - watchdog_ts >= 600 )); then
			watchdog_ts=$(date +%s)
			/usr/local/sbin/watchdog &>> /var/log/watchdog.log &
		fi
		# !!! Пока работает команда сигналы маскируются
		#   и обработчик не вызывается пока не завершиться команда.
		#   Поэтому sleep делаем недолгим.
		if [ "$shutdown" == "1" ]; then
			/opt/bin/services stop
			exit 0
		fi
		sleep 1 || true
	done
	return 1  # Сюда не должны попадать.
	return 0
}


main
