#!/bin/bash

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

# Версия: EMS 3.30
# Целевая ОС: bionic (ubuntu 18.04), stretch (debian 9), 'orel' (astralinuxce 2.12)
# Автор: Абаренов ВП
# ООО Предприятие Элтекс
# Новосибирск, 2022

# Модификаторы запуска скрипта:
# --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 sgr 0)

# 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_DISTRIBUTION="softwlc-1.26-xenial"
RADIUS_VERSION="radius-1.26"
REPO_SOURCES="deb [arch=amd64] $ELTEX_REPO $EMS_DISTRIBUTION main"
REPO_GPG_KEY_ADDR="$ELTEX_REPO/repo.gpg.key"

# переменная для пропуска установки пакетов linux, java и т.д. (т.е. только установка/обновление Eltex-пакетов из репо)
SKIP_LINUX_DEB=0

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

# Пользователь в СУБД MySQL для доступа к схемам
EMS_USER="javauser"
EMS_PASSWORD="javapassword"

# Список поддерживаемых кодовых имён операционных систем
LINUX_CODENAMES="
  trusty
  xenial
  bionic
  stretch
  buster
  orel"

# Список поддерживаемых дистрибуторов операционных систем
LINUX_DISTRIBUTORS="
  debian
  ubuntu
  astralinuxce"


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

update_repo_related_vars() {
    REPO_GPG_KEY_ADDR="${ELTEX_REPO}/repo.gpg.key"
    REPO_SOURCES="deb [arch=amd64] $ELTEX_REPO $EMS_DISTRIBUTION 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
}

# Перезаписывает файловые лимиты для службы mysql
function replace_open_files_for_mysql() {
    local DIR="/etc/systemd/system/mysql.service.d"
    local FILE_OVERRIDE="$DIR/override.conf"
    if [ -f "$FILE_OVERRIDE" ]; then
        rm "$FILE_OVERRIDE"
    fi

    if [ ! -d "$DIR" ]; then
        mkdir -p "$DIR"
    fi

    echo "[Service]" > "$FILE_OVERRIDE"
    echo "LimitNOFILE=1617596" >> "$FILE_OVERRIDE"
    echo "LimitNOFILESoft=1617596" >> "$FILE_OVERRIDE"
    echo "File '$FILE_OVERRIDE' replaced with new configuration"

    # Для U14 trusty работает другой механизм задать лимит открытых файлов
    if [[ ! ${DISTRIB_CODENAME} == "trusty" ]]; then
       # В trusty нет systemctl
       systemctl daemon-reload
    else
      # Зато в trusty надо прямо прописывать в конфиг файл сервиса его ограничения, то что написано выше
      # в файле /etc/systemd/system/mysql.service.d в trusty не действует (но и не мешает)
      echo "[mysqld]" >> /etc/mysql/my.cnf
      echo "open_files_limit = 102400"  >> /etc/mysql/my.cnf
    fi
    restart mysql
}


# Раскомментировать модули приёма данных из сети, если они закоментированы в главном конфиге службы
function rsyslog_uncomment_network_mod(){
    # uncomment
    # sed -i '/<pattern>/s/^#//g' file
    # comment
    # sed -i '/<pattern>/s/^/#/g' file
    local FILE="/etc/rsyslog.conf"

    sed -i '/imudp/s/^#//g' $FILE
    sed -i '/imtcp/s/^#//g' $FILE
}

# Полностью переписать конфиг для плагина rsyslog-mysql
function rsyslog_mysql_replace_config(){
    # Это оригинальный файл: /etc/rsyslog.d/mysql.conf
    # Нам нужен файл, который выполнится ранее дефолтного /etc/rsyslog.d/50-default.conf
    # обработает цепочку "сохранить данные из сети" и прервёт обработку не загружая файловые логгеры
    # Для этого нужно создать конфиг mysql с именем 10-mysql.conf, переопределить там шаблон сохранения SQL
    # и прервать цепочку

    # Удалим первоначальный файл
    local DIR="/etc/rsyslog.d"
    local FILE_OVERRIDE="$DIR/mysql.conf"
    if [ -f "$FILE_OVERRIDE" ]; then
        rm "$FILE_OVERRIDE"
    fi

    # Удалим целевой файл, если как-то его создавали ранее
    local FILE_OVERRIDE="$DIR/10-mysql.conf"
    if [ -f "$FILE_OVERRIDE" ]; then
        rm "$FILE_OVERRIDE"
    fi

    echo "### Configuration file for rsyslog-mysql" > "$FILE_OVERRIDE"
    echo "### Changes are preserved" >> "$FILE_OVERRIDE"
    echo "\$template tpl,\"insert into SystemEvents (Message, Facility,FromHost, FromHostIp, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%', INET_ATON('%fromhost-ip%'), %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')\",SQL" >> "$FILE_OVERRIDE"
    echo "module (load=\"ommysql\")" >> "$FILE_OVERRIDE"
    echo ":fromhost-ip, !isequal, \"127.0.0.1\" action(type=\"ommysql\" server=\"localhost\" db=\"Syslog\" uid=\"rsyslog\" pwd=\"root\" Template=\"tpl\")" >> "$FILE_OVERRIDE"
    echo "& stop" >> "$FILE_OVERRIDE"
}

# Функция проверяет установлена ли расширенная схема Syslog в базе данных (с партициями и новыми полями)
# Возвращает "0", если схема соответствует эталону;
# Возвращает "1", если схема не соoтветствует эталону;
function rsyslog_check_extended_database(){
    # Запомнить переменную "на входе", чтобы передать в неё значение "на выходе"
    local  __resultvar=$1
    local  myresult="0"

    local DB="Syslog"
    local TABLE="SystemEvents"
    local PART29="PARTITION p29"
    local myvar=""
    LP="--login-path=local"

    # trusty (mysql 5.5) не принимает --login-path, поэтому уберём его из запуска
    if [[ ${DISTRIB_CODENAME} == "trusty" ]]; then
      LP=""
    fi

    # Проверка наличия схемы
    myvar=$(mysql $LP -DSyslog -u$ANSWER_SOFTWLC_MYSQL_USER -p$ANSWER_SOFTWLC_MYSQL_PASSWORD -se "SHOW DATABASES LIKE '$DB';" )
    # echo "MySQL answer = "${myvar}
    if [[ ! $myvar == *${DB}* ]]; then
        echo "${red}Database '$DB' does not exists${reset}"
        myresult="1"
    else
        myresult="0"
    fi

    # Проверка наличия таблицы
    if [[ ! "$myresult" == "1" ]]; then
        myvar=$(mysql $LP -D$DB -u$ANSWER_SOFTWLC_MYSQL_USER -p$ANSWER_SOFTWLC_MYSQL_PASSWORD -se "SHOW TABLES LIKE '$TABLE';" )
        # echo "MySQL answer = "${myvar}
        if [[ ! $myvar == *${TABLE}* ]]; then
            echo "${red}Table '$TABLE' does not exists${reset}"
            myresult="1"
        else
            myresult="0"
        fi
    fi

    # Проверка наличия партиционирования в схеме - единственный положительный результат
    if [[ ! "$myresult" == "1" ]]; then
        myvar=$(mysql $LP -D$DB -u$ANSWER_SOFTWLC_MYSQL_USER -p$ANSWER_SOFTWLC_MYSQL_PASSWORD -se "SHOW CREATE TABLE $TABLE;")
        # echo "MySQL answer = "${myvar}
        if [[ $myvar == *${PART29}* ]]; then
            myresult="0"
        else
            myresult="1"
        fi
    fi

    # Возвращаем результат
    if [[ "$__resultvar" ]]; then
        eval $__resultvar="'$myresult'"
    else
        echo "$myresult"
    fi
}

# Создаем расширенную схему Syslog, которую использует rsyslog-mysql и показывает сервер и GUI eltex-ems
function rsyslog_create_extended_database(){

mysql -u$ANSWER_SOFTWLC_MYSQL_USER -p$ANSWER_SOFTWLC_MYSQL_PASSWORD <<MY_QUERY
-- MySQL dump 10.13  Distrib 5.1.67, for debian-linux-gnu (i486)
--
-- Host: localhost    Database: Syslog
-- ------------------------------------------------------
-- Server version       5.1.67-0ubuntu0.10.04.1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: Syslog
--

drop database if exists Syslog;

CREATE DATABASE /*!32312 IF NOT EXISTS*/ Syslog DEFAULT CHARACTER SET utf8;

USE Syslog;

-- DROP TABLE IF EXISTS SystemEvents;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
-- DROP TABLE IF EXISTS SystemEvents;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE SystemEvents (
  ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  CustomerID bigint(20) DEFAULT NULL,
  ReceivedAt datetime NOT NULL DEFAULT '1971-01-01 00:00:01',
  DeviceReportedTime datetime DEFAULT NULL,
  Facility smallint(6) DEFAULT NULL,
  Priority smallint(6) DEFAULT NULL,
  FromHost varchar(60) DEFAULT NULL,
  Message text,
  InfoUnitID int(11) DEFAULT NULL,
  SysLogTag varchar(60) DEFAULT NULL,
  FromHostIp INT UNSIGNED,
  PRIMARY KEY (ID,ReceivedAt,FromHostIp)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE ( DAYOFMONTH(ReceivedAt))
SUBPARTITION BY HASH(FromHostIp) SUBPARTITIONS 33
(PARTITION p1 VALUES LESS THAN (2),
 PARTITION p2 VALUES LESS THAN (3),
 PARTITION p3 VALUES LESS THAN (4),
 PARTITION p4 VALUES LESS THAN (5),
 PARTITION p5 VALUES LESS THAN (6),
 PARTITION p6 VALUES LESS THAN (7),
 PARTITION p7 VALUES LESS THAN (8),
 PARTITION p8 VALUES LESS THAN (9),
 PARTITION p9 VALUES LESS THAN (10),
 PARTITION p10 VALUES LESS THAN (11),
 PARTITION p11 VALUES LESS THAN (12),
 PARTITION p12 VALUES LESS THAN (13),
 PARTITION p13 VALUES LESS THAN (14),
 PARTITION p14 VALUES LESS THAN (15),
 PARTITION p15 VALUES LESS THAN (16),
 PARTITION p16 VALUES LESS THAN (17),
 PARTITION p17 VALUES LESS THAN (18),
 PARTITION p18 VALUES LESS THAN (19),
 PARTITION p19 VALUES LESS THAN (20),
 PARTITION p20 VALUES LESS THAN (21),
 PARTITION p21 VALUES LESS THAN (22),
 PARTITION p22 VALUES LESS THAN (23),
 PARTITION p23 VALUES LESS THAN (24),
 PARTITION p24 VALUES LESS THAN (25),
 PARTITION p25 VALUES LESS THAN (26),
 PARTITION p26 VALUES LESS THAN (27),
 PARTITION p27 VALUES LESS THAN (28),
 PARTITION p28 VALUES LESS THAN (29),
 PARTITION p29 VALUES LESS THAN (30),
 PARTITION p30 VALUES LESS THAN (31),
 PARTITION p31 VALUES LESS THAN MAXVALUE) */;
/*!40101 SET character_set_client = @saved_cs_client */;


-- DROP TABLE IF EXISTS SystemEventsProperties;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE SystemEventsProperties (
  ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  SystemEventID bigint(20) DEFAULT NULL,
  ParamName varchar(255) DEFAULT NULL,
  ParamValue text,
  PRIMARY KEY (ID)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
MY_QUERY
}

# Выполняет GRANT на заданной БД
# $1 - БД
# $2 - привелегия (ALL, FILE, etc.)
# $3 - пользователь
# $4 - пароль
# $5 - таблица
grant() {
    if [[ -z $5 ]]; then
        grant_advanced "$1" "$2" "$3" "$4" "*"
    else
        grant_advanced $1 $2 $3 $4 $5
    fi
}

grant_advanced() {
    local database="$1"
    local privilege="$2"
    local user="$3"
    local password="$4"
    local table="$5"

    sql_exec "GRANT ${privilege} ON ${database}.${table} TO '${user}'@'localhost' IDENTIFIED BY '${password}'"
    sql_exec "GRANT ${privilege} ON ${database}.${table} TO '${user}'@'127.0.0.1' IDENTIFIED BY '${password}'"
    if [ "${REMOTE}" = 1 ]; then
        sql_exec "GRANT ${privilege} ON ${database}.${table} TO '${user}'@'%' IDENTIFIED BY '${password}'"
    fi
}

# Выполняет $1 как SQL-запрос
sql_exec() {
    mysql -u$ANSWER_SOFTWLC_MYSQL_USER -p$ANSWER_SOFTWLC_MYSQL_PASSWORD -e "$1" > /dev/null
    return $?
}

# Контроль открытого порта
# Вызов функции: 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'"
}

# Метод для проверки валидности имени дистрибутива.
# Скрипт не будет устанавливать софт на неизвестный дистрибутив Linux
function check_codename_and_platform() {
  # проверить разрядность системы и отказаться работать, если не x64
  local 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

  # Проверить, что наименование дистрибутора Linux находится в списке известных
  local FOUND=0
  for distr in ${LINUX_DISTRIBUTORS}; do
    if [[ $1 == "$distr" ]]; then
      FOUND=1
      break
    fi
  done

  if [[ $FOUND == 0 ]]; then
    echo "${red}Unsupported Linux Distributor '$1', script aborted.${reset}"
    exit 1
  fi

  # Проверить, что кодовое имя дистрибутива находится в списке известных
  FOUND=0
  for distr in ${LINUX_CODENAMES}; do
    if [[ $2 == "$distr" ]]; then
      FOUND=1
      break
    fi
  done

  if [[ $FOUND == 0 ]]; then
    echo "${red}Unsupported Linux Codename '$2', script aborted.${reset}"
    exit 1
  fi
}

# Инсталлирует MySQL в зависимости от версии операционной системы
function install_mysql_community() {

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

  export DEBIAN_FRONTEND=noninteractive

  # 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}"

  if [[ "$ORIGINAL_DISTRIB_CODENAME" == "orel" || "$ORIGINAL_DISTRIB_CODENAME" == "stretch" ]]; then
    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 04EE7237B7D453EC
    echo "deb http://archive.debian.org/debian/ stretch main"  >> /etc/apt/sources.list
    echo "deb-src http://archive.debian.org/debian/ stretch main"  >> /etc/apt/sources.list
    apt-get update
    apt-get install -y libmecab2
    apt-get install -y daemon
    apt-get install -y mysql-common=5.7.34-1debian9
    apt-get install -y mysql-client=5.7.34-1debian9
    apt-get install -y mysql-community-server
  else
    apt-get install -y libmecab2
    apt-get install -y daemon

    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/repo-codename select ${DISTRIB_CODENAME}"
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/repo-distro select ${DISTRIBUTOR_ID}"
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/repo-url string http://repo.mysql.com/apt/"
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/select-preview select "
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/select-product select Ok"
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/select-server select mysql-5.7"
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/select-tools select "
    debconf-set-selections <<<"mysql-apt-config mysql-apt-config/unsupported-platform select abort"
    MYSQL_APT_CONFIG_DEB="mysql-apt-config_0.8.17-1_all.deb"
    MYSQL_APT_CONFIG_URL="http://dev.mysql.com/get/${MYSQL_APT_CONFIG_DEB}"
    wget ${MYSQL_APT_CONFIG_URL}
    dpkg -i $MYSQL_APT_CONFIG_DEB
    apt-get update
    apt-get install -y mysql-community-server
  fi

  # прописать принудительно выключение ssl сервиса mysql для всех целевых ОС
  MYSQL_CFG_FILE=/etc/mysql/mysql.conf.d/mysqld.cnf
  if [[ ! -f "$MYSQL_CFG_FILE" ]]; then
    echo "${red}File not exists '$MYSQL_CFG_FILE'${reset}"
  else
    # Если файл есть, то проверить что в конфиге ssl ещё не выключен
    if [[ ! `egrep "^[^#;]" $MYSQL_CFG_FILE | egrep "ssl=0"` ]]; then
      echo -en '\nssl=0\n' >> $MYSQL_CFG_FILE
      echo "Modified file '$MYSQL_CFG_FILE', restarting service mysql"
      service mysql restart
    fi
  fi
}

# Инсталляция утилиты curl в зависимости от платформы
function install_lib_curl() {
  case "$DISTRIB_CODENAME" in
  "trusty"|"xenial"|"stretch"|"orel")
    LIBCURL_PACKET_NAME="libcurl3"
    ;;
  "bionic"|"buster")
    LIBCURL_PACKET_NAME="libcurl4"
    ;;
  *)
    echo "Unknown Linux codename for libcurl. Script aborted!"
    exit 1
    ;;
  esac
  install $LIBCURL_PACKET_NAME
}

# Поиск установленного tomcat
# Результат помещается в первую переменную, которую передают аргументом в функцию
find_tomcat() {
    local -n VAR=$1
    names="tomcat6 tomcat7 tomcat8 tomcat9"
    for name in $names; do
        # Проверяем, установлен ли заданный пакет
        if dpkg-query -f '${Status}\n' --show $name | grep '^install' &> /dev/null; then
            VAR=$name
            return 0
        fi
    done
    return 0
}

# Инсталляция и настройка пакета tomcat. Доступная версия зависит от ОС. Не заменяет уже установленный раннее пакет.
function install_tomcat() {
  # Обнулим знание о найденном в системе tomcat и выполним поиск
  FOUND_TOMCAT=""
  find_tomcat FOUND_TOMCAT

  # если tomcat найден, то мы не будем его переписывать принудительно
  if [[ $FOUND_TOMCAT =~ "tomcat" ]]; then
      echo "${green}Found tomcat: $FOUND_TOMCAT${reset}"
      TOMCAT_PACKET_NAME=$FOUND_TOMCAT
  else
      case "$DISTRIB_CODENAME" in
      "trusty")
          TOMCAT_PACKET_NAME="tomcat6"
          ;;
      "xenial")
          TOMCAT_PACKET_NAME="tomcat7"
          ;;
      "bionic"|"stretch"|"orel")
          TOMCAT_PACKET_NAME="tomcat8"
          ;;
      "buster"|"focal")
          TOMCAT_PACKET_NAME="tomcat9"
          ;;
      *)
          echo "${red}Unknown Linux codename for tomcat. Script aborted!${reset}"
          exit 1
          ;;
      esac
  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}
}

# Метод для полной инсталляции rsyslog-mysql, с заменой конфигов, модификацией баз,
# выдачей GRANT и всем остальным.
function full_installation_rsyslog_mysql() {
  install rsyslog-mysql

  # Пересоздать схему 'Syslog' в базе данных (в случае необходимости)
  res="0"
  rsyslog_check_extended_database res
  if [[ "$res" == "1" ]]; then
    echo "${red}Invalid database 'Syslog', need update ${reset}"
    rsyslog_create_extended_database
    echo "${green}Database 'Syslog' updated ${reset}"
  else
    echo "${green}Table 'SystemEvents' is valid (contains parts)${reset}"
  fi

  # После пересоздания БД лучше ещё раз её проверить, чтобы убедиться, что всё в базе согласно ожиданий
  rsyslog_check_extended_database res
  if [[ "$res" == "1" ]]; then
    echo "${red}Invalid database 'Syslog', update failed, script aborted!${reset}"
    exit 1
  fi

  # Выдать права (гранты) на вновь созданную схему для пользователя в СУБД, с которым работает продукт EMS
  grant "Syslog" ALL "$EMS_USER" "$EMS_PASSWORD"

  # После установки rsyslog-mysql нужно провести его кастомную конфигурацию.
  # Включить приём данных из сети по UDP и TCP
  # Настроить, чтобы сетевой трафик сохранялся в mysql и не сохранялся в локальные файлы
  rsyslog_uncomment_network_mod
  rsyslog_mysql_replace_config
  # Рестарт службы для применения всех новых конфигов
  restart rsyslog
}


# Выставить режим пропуска инсталляции системных пакетов
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

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

# Узнать наименование дистрибутора (debian/ubuntu/astra-linux) и записать lowercase
tmp_str=$(lsb_release -is)
DISTRIBUTOR_ID="${tmp_str,,}"

# узнать кодовое имя дистрибутива и записать lowercase
tmp_str=$(lsb_release -cs)
DISTRIB_CODENAME="${tmp_str,,}"
ORIGINAL_DISTRIB_CODENAME="${tmp_str,,}"

check_codename_and_platform ${DISTRIBUTOR_ID} ${DISTRIB_CODENAME}

echo "${green}OS distributer ID: $DISTRIBUTOR_ID${reset}"
echo "${green}OS distrib code name: $DISTRIB_CODENAME${reset}"
echo "${green}Repository: $ELTEX_REPO ${reset}"
echo "${green}Java vendor: $JAVA_VENDOR${reset}"

# Сохраним наименование дистрибуции для пакета eltex-radius, eltex-radius-db, он единственный дистрибутится в персональном репе
RADIUS_DISTRIBUTION="$RADIUS_VERSION-$DISTRIB_CODENAME"

# Astralinux(ce) 'orel' - это форк Debuan 9 'stretch', поэтому чтобы работали все репозитории (Элтекс и весь opensource),
# мы подменяем в скрипте $CODENAME 'orel' на 'stretch' $DISTRIBUTOR_ID 'astralinuxce' на 'debian' и работаем далее.
if [[ ${DISTRIBUTOR_ID} == "astralinuxce" ]]; then
  DISTRIBUTOR_ID="debian"
  echo "${green}Replaced OS distributer ID: $DISTRIBUTOR_ID${reset}"
fi
if [[ ${DISTRIB_CODENAME} == "orel" ]]; then
  DISTRIB_CODENAME="stretch"
  echo "${green}Replaced OS distrib code name: $DISTRIB_CODENAME${reset}"
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}"

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

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

    if [[ ${DISTRIB_CODENAME} == "xenial" ]]; 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
    echo "deb [arch=amd64] $ELTEX_REPO $RADIUS_DISTRIBUTION main" >>/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 -y 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

    # Инсталляция tomcat только после JVM
    install_tomcat

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

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

    # Установка библиотеки libcurl, которая очень нужна некоторым сервисам, например eltex-radius, причём индекс
    # зависит от операционной системы
    install_lib_curl

    # Установить mysql из специального репозитория, где нужная версия доступна для всех ОС.
    # Устанавливать обязательно после установки libpcap0.8, libssl, openssl
    if [[ ! ${DISTRIB_CODENAME} == "trusty" ]]; then
      install_mysql_community
    else
      install mysql-server mysql-client
    fi

    # переписываем лимиты для сервиса mysql, иначе rsyslog-mysql с пагинацией не работает на U16+
    replace_open_files_for_mysql

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

else

    apt-get update || true

fi


PACKAGES="eltex-ems-db
          eltex-oui-list
          eltex-ems"

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

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 2
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 2
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