#!/bin/bash

set -euE

echo "$0 $@ [$$] START" >&2

declare NGINX="${NGINX:-1}"
declare ANGULAR_SUPPORT="${ANGULAR_SUPPORT:-0}"
declare WILDCARD="${WILDCARD:-0}"
declare RENAME="${RENAME:-0}"

# Много echo, поэтому функция. Да, можно было fi >&2, но не стал людей пугать.
usage() {
	D="weirded.fake"
	echo "Info: $0 - генерация SSL-ключей для account и eva-app + корневой серт"
	echo "Usage: [NGINX=0/1 $0 [--help|<домен машины>|[старые домены для симуляции 3 стадии выдачи VM]"
	echo "Example: $0 10.90.140.68; $0 10.90.140.77 - сгенерирует ключи для двух машин"
	echo "	CA будет общим."
	echo "Лучше запускать, находясь в отдельной папке для ключей."
	echo "Example: NGINX=0 $0 10.90.140.68 - ключи не будут скопированы в папку nginx автоматически"
	echo "Example: WILDCARD=1 $0 evaka.$D eva.$D acrm28533.$D"
	echo "	сгенерировать конфиг где eva.$D и acrm28533.$D будут редиректить на crmka.$D"
	exit 0
}

[ "${1:-}" == '--help' ] && usage >&2

make_ext() {
	local domain="$1"
	echo "authorityKeyIdentifier=keyid,issuer"
	echo "basicConstraints=CA:FALSE"
	echo "keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment"
	echo "subjectAltName = @alt_names"
	echo
	echo "[alt_names]"
	echo "DNS.1 = $domain"
	echo "DNS.2 = *.$domain"
	return 0
}

make_certs() {
	local domain="$1"
	[ "$WILDCARD" = '1' -o "$RENAME" != '0' ] && domain="${domain#*.}"
	local subj

	echo "# rootCA.key - корневой закрытый ключ, оставляем его тут и НИКОМУ не даём" >&2
	if [ ! -f rootCA.key ]; then
		openssl genrsa -out rootCA.key 2048
	fi

	echo "# rootCA.pem - корневой сертификат, его надо будет добавить в браузер..." >&2
	echo "и на Eva в конец файлов:" >&2
	echo "- /etc/ssl/certs/ca-certificates.crt для работы CURL" >&2
	echo "- /root/.local/lib/python3.8/site-packages/certifi/cacert.pem для работы регистрации" >&2
	subj="/C=RU/ST=Russia/L=YekaterinburgOrMoscow/O=CarbonSoft/OU=EvaTeam/"
	if [ ! -f rootCA.pem ]; then
		openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 999 \
			-out rootCA.pem -subj "$subj/CN=CAKEY"
	fi

	echo "# $domain.key - закрытый ключ, нужно будет подложить на nginx" >&2
	echo "# $domain.csr - запрос сертификата, можно оставить здесь" >&2
	if [ ! -f "$domain.key" -o ! -f "$domain.csr" ]; then
		openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout "$domain.key" \
			-subj "$subj/CN=$domain" -out "$domain.csr"
	fi

	echo "# $domain.ext - вспомогательный файл, можно оставить здесь" >&2
	if [ ! -f "$domain.ext" ]; then
		make_ext "$domain" > "$domain.ext"
	fi

	echo "# $domain.crt - собственно, сертификат для nginx" >&2
	if [ ! -f "$domain.crt" ]; then
		openssl x509 -req -in "$domain.csr" -CA rootCA.pem -CAkey rootCA.key -CAcreateserial \
			-out "$domain.crt" -days 500 -sha256 -extfile "$domain.ext"
	fi
	return 0
}

nginx_make_conf() {
	local domain="$1"
	shift
	echo "# $domain.conf - настройки сервера для nginx" >&2
	# Новый генератор конфига только для Eva пока. Всё остальное - по старинке.
	if [ -d /opt/eva-app/ ]; then
		local cmd
		cmd="/opt/fox_acrm/deploy/provision.py --sla=sla0 --nginx --domain=$domain"
		[ "$WILDCARD" = '1' ] && cmd="$cmd --wildcard"
		[ "$ANGULAR_SUPPORT" = '1' ] && cmd="$cmd --angular-support"
		[ "$#" -gt 0 ] && cmd="$cmd --redirect-from $@"
		# Так-то этому место в nginx_install_certs
		# Некрасиво, но это только вручную наши разработчики будут запускать.
		find /etc/nginx/conf.d/ -type f -delete
		$cmd
		return 0
	fi
	local template="/opt/fox_acrm/contrib/self-signed-cert-nginx.conf"
	# Предполагаем отладку ангуляра только в Eva, в account считаем его ПОКА рудиментарным
	if [ "${ANGULAR_SUPPORT:-0}" = '1' -a "${domain:0:3}" == 'eva' ]; then
		template="/opt/fox_acrm/contrib/self-signed-cert-nginx-dev.conf"
		echo "## Используем конфиг с раздельными frontend и backend ( $template )" >&2
	fi
	# Конфиг перегенерируем независимо от того есть он уже или нет.
	sed "s/@@@domain%%%/$domain/g" "$template" > "$domain.conf"
	return 0
}

nginx_conf_readme() {
	local domain="$1"
	echo "Вы поставили NGINX=0, видимо хотите ключи положить на другую ВМ"
	echo "Не забудьте выполнить:"
	echo "host='ip-машины'"
	echo 'ssh root@$host mkdir -p /etc/nginx/ssl'
	echo 'ssh root@$host openssl dhparam -dsaparam -out /etc/nginx/dh4096.pem 4096'
	echo "scp $domain.conf root@"'$host'":/etc/nginx/conf.d/"
	echo "scp $domain.crt $domain.key root@"'$host'":/etc/nginx/ssl/"
	return 0
}

nginx_install_certs() {
	local domain="$1"
	# [ "$WILDCARD" = '1' -o "$RENAME" != '0' ] && domain="${domain#*.}"
	# if [ "${NGINX:-1}" == '0' ]; then
	#	nginx_conf_readme >&2y
	#	return 0
	# fi
	# mkdir -p "/etc/nginx/ssl/"
	# cp -va "$domain.key" "$domain.crt" /etc/nginx/ssl/ >&2
	# cp -va "$domain.conf" /etc/nginx/conf.d/ >&2
	if [ ! -f /etc/nginx/dh4096.pem ]; then
		echo "# /etc/nginx/dh4096.pem — секретик для nginx" >&2
		openssl dhparam -dsaparam -out /etc/nginx/dh4096.pem 4096
	fi
	return 0
}

main() {
	local domain="$1"
	make_certs "$domain"
	nginx_make_conf "$@" # здесь могут быть старые домены ещё.
	nginx_install_certs "$domain"
	return 0
}

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