#!/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
[[ ${TZ:-} ]] && export PGTZ="$TZ"

# Для поддержки docker exec,
[[ $# != 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


uwsgi_mode() {
	# TODO: Use uwsgi instead nginx
	/etc/init.d/nginx start
	# Для uwsgi серверов используем отдельные логи, так удобней и привычней для ТП.
	# Но если их отключить, то логи уйдут в stdout/stderr,
	#   в итоге их будет обслуживать кластер, что тоже хорошо.
	exec /usr/local/bin/uwsgi --ini /tmp/uwsgi-emperor.ini
	return 0
}

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

	if (source /opt/CONFIG && [[ $EVA_DEPLOY_TYPE = k8s ]] ); then
		uwsgi_mode  # do exec uwsgi
		return 1
	fi

	# Добавляем запись в логи после 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
		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
}


source /opt/bin/nss_wrapper.sh
main
