#!/bin/bash

# Скрипт помогает установить пакеты EMS на один сервер
# Предварительно устанавливает Java, mysql-server, tomcat, curl, libcurl и прочие необходимые пакеты из зависимостей
# Затем последовательно устанавливает все нужные пакеты комплекса:
#
# eltex-ems-db             : Разворачивает схему в БД MySQL для EMS
# eltex-ems                : Серверная и клиентская часть СУ EMS

# Версия: EMS 3.23
# Целевая ОС: xenial (ubuntu 16.04), bionic (ubuntu 18.04)
# Автор: Абаренов ВП
# ООО Предприятие Элтекс
# Новосибирск, 2021

# Модификаторы запуска скрипта:
# --skip      : пропустить установку системных пакетов. только установка пакетов из репозитория eltex

# Ответы для автоматической установки
# Измените при необходимости

# Имя пользователя администратора MySQL
export ANSWER_SOFTWLC_MYSQL_USER=root
# Пароль администратора MySQL
export ANSWER_SOFTWLC_MYSQL_PASSWORD=root
# Имя пользователя администратора SoftWLC
export ANSWER_AUTH_SERVICE_ADMIN_USER=admin
# Пароль администратора SoftWLC
export ANSWER_AUTH_SERVICE_ADMIN_PASSWORD=password
# Пароль служебного пользователя SoftWLC (softwlc_service)
export ANSWER_SOFTWLC_SERVICE_USER_PASSWORD=softwlc
# Корневой домен
export ANSWER_SOFTWLC_ROOT_DOMAIN=root
# Язык EMS по умолчанию: 1 - русский, 2 - английский
export ANSWER_EMS_LANG=1
# Максимальное количество ОЗУ, выделяемое EMS (в МБ)
export ANSWER_EMS_MAX_HEAP=1024
# Максимальное количество ОЗУ, выделяемое Tomcat (в МБ)
export ANSWER_TOMCAT_MAX_HEAP=1024
# Код создаваемого тарифа
export ANSWER_RADIUS_TARIFF_CODE=default
# Генерировать ли сертификат для сервера RADIUS
export ANSWER_NBI_MAKE_SERVER_CERTIFICATE=1
# Срок действия серверного сертификата RADIUS
export ANSWER_NBI_SERVER_CERTIFICATE_PERIOD=3650
# Пароль от закрытого ключа серверного сертификата RADIUS
export ANSWER_NBI_SERVER_CERTIFICATE_KEY=1234

# Не рекомендуется редактировать
export ANSWER_SOFTWLC_LOCAL=1
export ANSWER_EMS_REPLACE_CONF=1
export ANSWER_EMS_ACCESS_TYPE_DOMAIN=1

# Настройка автоматического ответа на интерактивные вопросы
export DEBIAN_FRONTEND="noninteractive"

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`

# Public Eltex production repo
ELTEX_PUBLIC_REPO="http://archive.eltex-co.ru/wireless"
# Private (internal) repo
ELTEX_PRIVATE_REPO="http://lab3-repo.eltex.loc:2088"
# Переменная, которая является рабочей. Внутри скрипта работа идёт с ней в зависимости от параметров вызова скрипта
ELTEX_REPO=${ELTEX_PUBLIC_REPO}

# Наименование программ (определяют путь в репозитории)
EMS_VERSION="ems-3.23-xenial"

EMS_DISTRIBUTION="$EMS_VERSION"
REPO_SOURCES="deb [arch=amd64] $ELTEX_REPO $EMS_VERSION main"
REPO_GPG_KEY_ADDR="$ELTEX_REPO/repo.gpg.key"

DHCPD_HELPER="$(dirname `which $0`)/dhcpd-helper.sh"
# переменная для пропуска установки пакетов linux, java и т.д. (т.е. только установка/обновление Eltex-пакетов из репо)
SKIP_LINUX_DEB=0

# Вендор JVM
JAVA_VENDOR="openjdk"
TOMCAT_PACKET_NAME="tomcat7"                       # по умолчанию ставить tomcat7, в более поздних (>= bionic) ставить 8
EMS_PACKET_NAME="eltex-ems"


# Прервать установку при ошибках
set -e

update_repo_related_vars() {
    REPO_GPG_KEY_ADDR="${ELTEX_REPO}/repo.gpg.key"
    REPO_SOURCES="deb [arch=amd64] $ELTEX_REPO $EMS_VERSION main"
}

set_silent_mode() {
    # mysql root password settings (default: login=root, password=root)
    sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $ANSWER_SOFTWLC_MYSQL_PASSWORD"
    sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $ANSWER_SOFTWLC_MYSQL_PASSWORD"
    # rsyslog-mysql login@password settings (default: login=root, password=root)
    echo "rsyslog-mysql   rsyslog-mysql/dbconfig-install  boolean true" | debconf-set-selections
    echo "rsyslog-mysql   rsyslog-mysql/mysql/app-pass    password $ANSWER_SOFTWLC_MYSQL_PASSWORD" | debconf-set-selections
    echo "rsyslog-mysql   rsyslog-mysql/app-password-confirm      password $ANSWER_SOFTWLC_MYSQL_PASSWORD" | debconf-set-selections
    echo "rsyslog-mysql   rsyslog-mysql/password-confirm  password $ANSWER_SOFTWLC_MYSQL_PASSWORD" | debconf-set-selections
    echo "rsyslog-mysql   rsyslog-mysql/mysql/admin-pass  password $ANSWER_SOFTWLC_MYSQL_PASSWORD" | debconf-set-selections
    echo "rsyslog-mysql   rsyslog-mysql/remote/port       string " | debconf-set-selections
}


install() {
    apt-get --yes install "$@"
}

stop() {
    # add '|| true' - to ignore error
	service "$@" stop || true
}

restart() {
	service "$@" restart
}

start() {
	service "$@" start || true
}

reload() {
	service "$@" reload || true
}


# Контроль открытого порта
# Вызов функции: check_port "8080" result_var
# В результат будет помещён 0 - OK(порт открыт) или 1 - Ошибка (порта нет)
function check_port() {
    local  __resultvar=$2
    local  myresult='0'
    if [[ `netstat -pna | grep ":$1"` ]]; then
        echo "${green}Check port '$1' - passed${reset}"
        myresult='0'
    else
        echo "${red}Check port '$1' - error${reset}"
        myresult='1'
    fi
    eval ${__resultvar}="'$myresult'"
}

# Выставить режим пропуска инсталляции системных пакетов
if [[ ! -z "$1" ]]
then
for i in "$@" ; do
    if [[ ${i} == "--public" ]] ; then
        ELTEX_REPO=${ELTEX_PUBLIC_REPO}
        update_repo_related_vars
        break
    fi

    if [[ ${i} == "--private" ]] ; then
        ELTEX_REPO=${ELTEX_PRIVATE_REPO}
        update_repo_related_vars
        break
    fi
done
fi

# узнать кодовое имя дистрибутива ubuntu вперёд всех операций
DISTRIB_CODENAME=
source /etc/lsb-release

echo "${green}Ubuntu distrib code name: $DISTRIB_CODENAME${reset}"

if [[ `id -u` -ne 0 ]]; then
    echo "${red}This script can only be run as root${reset}"
    exit 1
fi

#проверить разрядность системы и отказаться работать, если не x64
DISTRIB_PLATFORM=`/bin/uname -m`
echo "Platform : $DISTRIB_PLATFORM"

if [[ ${DISTRIB_PLATFORM} != "x86_64" ]] ; then
    echo "${red}Platform is not 'x86_64', script aborted!${reset}"
    exit -1
fi


# Выставить режим пропуска инсталляции системных пакетов
if [[ ! -z "$1" ]]
then
for i in "$@" ; do
    if [[ ${i} == "--skip" ]] ; then
        SKIP_LINUX_DEB=1
        echo "${green}Skipping installation of system packages${reset}"
        break
    fi
done
fi

# вывести в консоль репозиторий после проверки флага --public
echo "${green}Repository: $ELTEX_REPO ${reset}"

# Путь репозитория переопределяется в зависимости от имени дистрибутива Ubuntu
EMS_DISTRIBUTION="$DISTRIB_CODENAME/$EMS_VERSION"

# Режим "пропустить инсталляцию системных пакетов"
if [[ ! ${SKIP_LINUX_DEB} == "1" ]] ; then

    # Добавить новый доверенный ключ на репозиторий mysql.
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C

    # установить (обновить) программу работы с репозиторием add-apt-repository (т.к. в некоторых системах она не присутствует)
    install software-properties-common

    if [[ ${DISTRIB_CODENAME} != "bionic" ]]; then
        # обновить репозиторий (перед инсталляцией gnupg-curl, иначе он недоступен!)
        apt-get update || true

	# установка пакета 'gnupg-curl', без которого в некоторых системах невозможно выкачать и проверить 'keyserver'
        install gnupg-curl
    fi

    # удалить старый репозиторий (ems), если он есть
    if [[ -f "/etc/apt/sources.list.d/eltex.list" ]]; then
	rm /etc/apt/sources.list.d/eltex.list
    fi

    # добавить репозиторий Eltex в список источников apt
    echo "$REPO_SOURCES" > /etc/apt/sources.list.d/eltex.list

    # добавить GPG ключ
    #apt-key adv --keyserver keyserver.ubuntu.com --recv F558A287
    wget -O - ${REPO_GPG_KEY_ADDR} | sudo apt-key add -

    # если старая версия Убунту, то подключить другой repo
    if [[ ${DISTRIB_CODENAME} == "trusty" ]]; then
	echo "${green}Ubuntu 14.04 (trusty) detected. Add other openjdk repo..${reset}"
	add-apt-repository ppa:openjdk-r/ppa
    fi


    # обновить репозиторий
    apt-get update || true

    # Заранее задать ответы на вопросы инсталлятора о паролях mysql и прочее
    set_silent_mode

    # провести инсталляцию пакета openjdk
    install openjdk-8-jdk
    # прописать в системе использование только что установленного пакета
    update-java-alternatives -s java-1.8.0-openjdk-amd64 

    # Обязательное создание линка ДО инсталляции Tomcat
    # иначе процесс для Tomcat вывалится с ошибкой 'Not found JAVA_HOME' и вся установка прервётся.
    # Обнаружено в Ubuntu16 (xenial), в старой Ubuntu14 (trusty) всё проходило нормально.
    if [[ ! -e /usr/lib/jvm/default-java ]]; then
        ln -s /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/default-java
    fi

    if [[ "$DISTRIB_CODENAME" == "bionic" ]]; then
        TOMCAT_PACKET_NAME="tomcat8"
    fi

    # установить Tomcat
    install ${TOMCAT_PACKET_NAME}

    # Установить максимальный размер heap для Tomcat
    sed -i "s/-Xmx[0-9]\+[a-zA-Z]/-Xmx${ANSWER_TOMCAT_MAX_HEAP}m/" /etc/default/${TOMCAT_PACKET_NAME}

    # Добавить джава опцию, изменяющую рандом файл на urandom
    if ! grep "^[^#].*-Djava\.security\.egd=file:/dev/\./urandom\b" /etc/default/${TOMCAT_PACKET_NAME} &> /dev/null; then
        echo "JAVA_OPTS=\"\${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom\"" >> /etc/default/${TOMCAT_PACKET_NAME}
    fi

    # Принудительное использование openjdk в Tomcat
    echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/default/${TOMCAT_PACKET_NAME}

    # установить прочие пакеты, которые прописаны в зависимостях пакета eltex-ems
    install expect daemon psmisc mysql-server mysql-client ntp tftp-hpa tftpd-hpa snmpd snmp rsyslog curl

    # некоторые дистрибутивы (desktop) могут не содержать net-tools:netstat
    install net-tools

    if [[ "$DISTRIB_CODENAME" == "bionic" ]]; then
        install libcurl4
    else
        install libcurl3
    fi


    # rsyslog-mysql устанавливается только после окончания установки mysql-server
    # иначе попытка его конфигурирования провалится
    install rsyslog-mysql

else

    apt-get update || true

fi

PACKAGES="eltex-ems-db
        eltex-ems"

# Последовательная установка пакетов
for package in ${PACKAGES}; do
    echo
    echo "*"
    echo "* Installing $package ..."
    echo "*"
    echo
    install ${package}
done

if [[ -x "$DHCPD_HELPER" ]]; then
    echo -n "Install and configure ISC DHCP server? [y/N] "
    read ans
    if [[ "$ans" == [yY] ]] ; then
        install isc-dhcp-server
        ${DHCPD_HELPER}
    fi
fi

echo "Start services.."

# Перезапустить сервисы

restart ${TOMCAT_PACKET_NAME}
# EMS через стоп и старт, т.к. с рестаротом проблемы на определённых ОС (trusty)
stop ${EMS_PACKET_NAME}
start ${EMS_PACKET_NAME}

# проверить открытые порты
echo "Waiting 10 seconds.."
sleep 10

echo "Check Tomcat port.."
check_port "8080" check_port_result

echo "Check EMS port (60 seconds for retry).."
CHECK_COUNT=60
PORT_9310_PASSED="1"
for i in $(seq 1 ${CHECK_COUNT}); do
    check_port "9310" check_port_result
    if [[ "$check_port_result" != "0" ]] ; then
        sleep 1
    else
        PORT_9310_PASSED="0"
        break
    fi
done

#Если все циклы проверки прошли, а порт 9310 так и не открылся, значит беда, выходим отсюда
if [[ "$PORT_9310_PASSED" != "0" ]] ; then
    echo "${red}Packet eltex-ems out of service (port 9310 not opened)${reset}"
    exit -1
fi

echo "Check EMS internal NBI"
if [[ `curl "localhost:8080/northbound/getVersion"` ]]; then
    echo "${green}Check NBI on 'localhost' - passed${reset}"
else
    echo "${red}Check NBI on 'localhost' - error${reset}"
    exit -1
fi

# Всё
    echo "Installation of Eltex SoftWLC finished"
    echo "URLs of SoftWLC components:
Eltex.EMS GUI: http://localhost:8080/ems/jws
    login: admin
    password: <empty>"

exit 0
