#!/bin/bash
set -eu
echo "$0 $@ [$$] START" >&2

set -x

if [[ ${1:-} != i_know_what_i_do ]]; then
	echo "Info: !!! НЕ не запускайте, если не знаете что делаете"
	echo "Info: Скрипт заменяет систему старого деплоя через git"
	echo "Info:   на новый вариант через updater"
	echo "Usage: $0 i_know_what_i_do [dist_dir]"
	echo "Usage: i_know_what_i_do - защита от нежелательного запуска"
	echo "Usage: dist_dir - расположение дистрибутива, по-умолчанию папка запуска."
	echo -n "Example: /mnt/evateam/public/builds/01.01.21.0071/eva_opt/bin/"
	echo    "_vm_deploy_migrate.sh i_know_what_i_do"
	[[ ${1:-} == --help ]] && exit 0
	exit 1
fi

if pidof -csxo %PPID "${0##*/}"; then
	echo "Already running" >&2
	exit 1
fi

declare DIST_DIR

if [[ ${2:-} ]]; then
	DIST_DIR="$2"
else
	DIST_DIR="$( cd -- "${0%/*}" &>/dev/null && pwd -P )"
	if [[ $DIST_DIR != */eva_opt/bin ]]; then
		echo "Не могу определить путь к дистрибутиву. Укажите его явно параметром" >&2
		exit 1
	fi
	DIST_DIR="${DIST_DIR%/eva_opt/bin}"
fi


check_distr() {
	local eva_size check_file

	for check_file in branch eva_opt eva_root eva_opt.version eva_opt/eva_version; do
		if [[ ! -e $DIST_DIR/$check_file ]]; then
			echo "Отсутствует $DIST_DIR/$check_file." \
				"Вероятно дистрибутив неисправен." >&2
			exit 1
		fi
	done

	set -o pipefail
	eva_size="$(du -s "$DIST_DIR/eva_opt" | awk '{print $1}')"
	set +o pipefail
	# Меньше 100Мб
	if [[ $eva_size -lt 100000 ]]; then
		echo "Ошибка обновления! Размер opt меньше 100Мб. $DIST_DIR" >&2
		exit 1
	fi
	set -o pipefail
	eva_size="$(du -s "$DIST_DIR/eva_root" | awk '{print $1}')"
	set +o pipefail
	# Меньше 2Гб
	if [[ $eva_size -lt 2000000 ]]; then
		echo "Ошибка обновления! Размер root меньше 2Гб. $DIST_DIR" >&2
		exit 1
	fi

	# skip strongbash034
	if ! (cd /opt/crm && git status) | grep -qx "HEAD detached at crm-v0.1.27"; then
		echo "Можно мигрировать только версию crm-v0.1.27" >&2
		exit 1
	fi

	if [[ $(<"$DIST_DIR/eva_opt.version") != 01.01.21.0071 ]]; then
		echo "Можно мигрировать только на версию 01.01.21.0071" >&2
		exit 1
	fi

	return 0
}


install_files() {
	rsync --exclude=/CONFIG --exclude=/files/* --exclude=/files.meta/* \
		--exclude=/crm/common/static/forms/* --exclude=/crm/backup/* \
		--stats --checksum -a --delete \
		"$DIST_DIR/eva_opt/" /opt/
	rsync  --exclude=/dev --exclude=/mnt --exclude=/proc --exclude=/sys --exclude=/tmp \
		--include=/run/postgresql --include=/run/redis --exclude=/run/** \
		--exclude=/opt \
		--exclude=/etc/hostname --exclude=/etc/hosts --exclude=/etc/resolv.conf \
		--stats --checksum -a --delete \
		"$DIST_DIR/eva_root/" /
	return 0
}

# strongbash hack
declare SLA

install_config() {
	cat > /opt/CONFIG <<EOF
# Домен EvaTeam
DOMAIN=""
# Email администратора
ADMIN_EMAIL=""

# Получать бесплатный SSL-сертификат от Lets Encrypt
NGINX_USE_CERTBOT="0"

# Параметры системы обновления
UPDATE_SERVER=""
UPDATE_BRANCH="$(cat "$DIST_DIR/branch")"

UPDATE_URL="/mnt"
INSTALLATION_TYPE=cloud
SLA="$(. /CONFIG && echo "$SLA")"
EOF
	return 0
}


declare USER_DATA_DIR=/tmp/backup


store_user_data() {
	# skip strongbash010
	# rm -rf /tmp/backup
	mkdir "$USER_DATA_DIR"  # -p
	mkdir -p /opt/crm/common/static/forms /opt/crm/common/static/avatar /opt/crm/backup \
		/opt/crm/files /opt/crm/files.meta

	rsync -a --relative \
		/opt/./crm/files /opt/./crm/files.meta /opt/./crm/custom /opt/./crm/backup \
		/opt/./crm/common/static/forms /opt/./crm/common/static/avatar \
		"$USER_DATA_DIR"

	rsync -a --relative --exclude=/root/.cache --exclude=/root/.local \
		/./root "$USER_DATA_DIR"

	rsync -a --relative \
		/./var/lib/postgresql/13/main/ \
		"$USER_DATA_DIR"

	if [[ -f /opt/crm/demo_ids.json ]]; then
		cp /opt/crm/demo_ids.json "$USER_DATA_DIR/crm/custom/"
	fi

	cat /opt/crm/jwt_rsa > "$USER_DATA_DIR/crm/custom/jwt_rsa"
	cat /opt/crm/jwt_rsa.pub.orig > "$USER_DATA_DIR/crm/custom/jwt_rsa.pub"
	cat /opt/crm/jwt_rsa.pub > "$USER_DATA_DIR/crm/custom/account.jwt_rsa.pub"
	return 0
}


restore_user_data() {
	rsync -a --relative --delete \
		"$USER_DATA_DIR/crm/./files" "$USER_DATA_DIR/crm/./files.meta" \
		/opt

	rsync -a --relative --delete \
		$USER_DATA_DIR/crm/./custom $USER_DATA_DIR/crm/./backup \
		$USER_DATA_DIR/crm/./common/static/forms \
		$USER_DATA_DIR/crm/./common/static/avatar \
		/opt/crm

	rsync -a "$USER_DATA_DIR/root/" /opt/custom/root

	rsync -a --delete "$USER_DATA_DIR/var/lib/postgresql/13/main/" \
		/opt/var/lib/postgresql/13/main/
	# На случай, если id слетят
	chown -R postgres:postgres /opt/var/lib/postgresql/13/main/

	rm -f /opt/account/jwt_rsa* /opt/crm/jwt_rsa*
	mkdir -p /opt/account/custom
	cp /opt/crm/custom/account.jwt_rsa.pub /opt/account/custom/jwt_rsa.pub
	ln -s custom/jwt_rsa.pub /opt/account/jwt_rsa.pub
	ln -s custom/jwt_rsa /opt/crm/jwt_rsa
	ln -s ../account/jwt_rsa.pub /opt/crm/jwt_rsa.pub
	# skip strongbash010
	rm -rf /tmp/backup
	return 0
}


main() {
	check_distr
	systemctl stop wsgidav crm crm-celery cron postgresql redis-server
	store_user_data
	install_files
	install_config
	restore_user_data
	return 0
}


main


echo "$0 $@ [$$] SUCCESS" >&2
exit 0
