#!/bin/bash
#
# Скрипт помогает установить пакеты проекта Видеосервер на один физический или виртуальный хост
#
# wget -q -O - http://archive.eltex-co.ru/evi-perimeter/evi-perimeter-1.7.0.sh | sudo bash
# 
# evi-perimeter-server         : Основной продкут - видеосервер
# evi-perimeter-client         : Рабочее место, АРМ охранника

# Испорт системных переменных
. /etc/os-release




PRODUCT_NAME="evi-perimeter"
REPO_HOST=archive.eltex-co.ru
REPO_PORT=80
REPO_DIST="evi-perimeter"
REPO_URL="http://$REPO_HOST:$REPO_PORT/$REPO_DIST"
REPO_GPG_KEY_ADDR="$REPO_URL/$REPO_DIST.gpg.key"

CODENAME="jammy"

# Наименование программ (определяют путь в репозитории)
REPO_NAME="$CODENAME"

REPO_SOURCES="deb [arch=amd64] $REPO_URL $REPO_NAME main"

red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr 0)

INSTALL_OPT=(
  "Postgresql-Server"
  "${PRODUCT_NAME}-server"
  "${PRODUCT_NAME}-client"
)

DIA_HEIGHT=15
DIA_WIDTH=64
DIA_CHOICE_HEIGHT=2
DIA_BACKTITLE="${PRODUCT_NAME} installation mode"
DIA_TITLE="Install mode"
DIA_MENU="Choose one or more of the following options:"

DIA_OPTIONS=(
  "${INSTALL_OPT[0]}" "${INSTALL_OPT[0]}" "on"
  "${INSTALL_OPT[1]}" "${INSTALL_OPT[1]}" "on"
  "${INSTALL_OPT[2]}" "${INSTALL_OPT[2]}" "off"
)


# postgres: имя БД (схемы), пользователя и роли
EVS_DB_USER="evs"

log(){
  [[ $2 =~ ([1-9]+) ]] && {
    echo "${red}ERROR: $1${reset}"
    exit $2
  } || {
    echo "${green}$1${reset}"
  }
}

# ===================== Проверка возможности установки ===================
preinstall() {

  log "$FUNCNAME"

  # Проверка на права root
  if [[ `id -u` -ne 0 ]]; then
      log "This script can only be run as root" 1
      exit 1
  fi

  # Проверка поддержка инструкции avx >= 2
  grep -q -m1 -o "avx2" /proc/cpuinfo || log "AVX2 IS NOT SUPPORTED BY YOUR SYSTEM !!!" 2

  #проверить разрядность системы и отказаться работать, если не x64
  log "Check platform"
  [[ $(/bin/uname -m) =~ x86_64 ]] || {
    log "Platform is not 'x86_64', script aborted!" 1
  }

  # Проверить, что наименование дистрибутора Linux находится в списке известных
  [[ "$VERSION_CODENAME" != "$CODENAME" ||
    "$UBUNTU_CODENAME"  != "$CODENAME" ]] && {
    log "OS version code name is '$VERSION_CODENAME', and not '$CODENAME', script aborted!" 1
  }


  log "OS distributer ID: $ID"
  log "OS distrib code name: $NAME"
  log "OS version code name: $VERSION_CODENAME"
  log "Repository: $REPO_URL"

}

install() {
  apt install -yf "$@" &>/dev/null
}

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

restart() {
	systemctl restart "$@" 
}



# Контроль открытого порта
# Вызов функции: check_port "8080" result_var
# В результат будет помещён 0 - OK(порт открыт) или 1 - Ошибка (порта нет)
function check_port() {
  ss -nlt | grep -q -o :$1 && {
    return 0
  } || {
    return 1
  }
}

# =========== Проверка требований к системе ===========
preinstall

# =========== Блок подготовки системы ===========

# Вспомогательные утилиты
log "Prepare..."
install wget dialog


# добавить репозиторий в список источников apt если не добавлен ранее
log "Repo add..."
[[ -f /etc/apt/sources.list.d/$REPO_DIST.list ]] && 
grep -q "$(echo -n $REPO_SOURCES | sed 's=\[=\\[=;s=\]=\\]=')" /etc/apt/sources.list.d/$REPO_DIST.list || 
echo "$REPO_SOURCES" >> /etc/apt/sources.list.d/$REPO_DIST.list

# добавить GPG ключ
log "ADD GPG..."
wget -q -O - ${REPO_GPG_KEY_ADDR} | sudo gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/${REPO_DIST}.gpg --import >&/dev/null &&
chmod +r /etc/apt/trusted.gpg.d/${REPO_DIST}.gpg || {
  log "Import key ${REPO_GPG_KEY_ADDR}" 1
}

# обновить репозиторий
log "Update..."
apt update >&/dev/null

# Запрос на установку компонентов системы
while [[ -z "$SELECTED" ]]
do
  SELECTED="$(dialog --clear --backtitle "$DIA_BACKTITLE" --title "$DIA_TITLE" --no-cancel --checklist "$DIA_MENU" $DIA_HEIGHT $DIA_WIDTH $DIA_CHOICE_HEIGHT ${DIA_OPTIONS[@]} 3>&1 1>&2 2>&3 3>&-)"
done

# Установка postgresql
[[ "${SELECTED[@]}" =~ ${INSTALL_OPT[0]} ]] && {
  
  log "INSTALL: postgresql"
  install "postgresql" "postgresql-contrib"
  
  log "Check postgres port"
  check_port "5432" || {
    log "Check postgres port" 2
  }
  log "Check postgres port OK"

  # Создать базу данных и пользователя
  log "Create database '$EVS_DB_USER' 'for user '$EVS_DB_USER'"
  echo "drop database $EVS_DB_USER;create user $EVS_DB_USER password '$EVS_DB_USER';create database $EVS_DB_USER OWNER $EVS_DB_USER;GRANT ALL ON DATABASE $EVS_DB_USER TO $EVS_DB_USER;" | sudo -u postgres psql &>/dev/null
  log "Create database done"

  log "INSTALL: postgresql done"
}

# Установка сервера EVI-Perimeter
[[ "${SELECTED[@]}" =~ ${INSTALL_OPT[1]} ]] && {

  log "INSTALL: ${PRODUCT_NAME} Server"
  install "${INSTALL_OPT[1]}"

  # Ожидание запуска
  sleep 2

  # Проверяем запуск
  systemctl status ${INSTALL_OPT[1]}.service | grep -q "Active: active (running)" || {
    log "$(systemctl status ${INSTALL_OPT[1]}.service)" 3
  }

  # Проверяем что сервер работает
  log "Check ${PRODUCT_NAME} port:" &&
  check_port "8080" &&
  check_port "8081" || {
    log "Check ${PRODUCT_NAME} port" 2
  }
  log "Check ${PRODUCT_NAME} port OK"

  log "INSTALL: ${PRODUCT_NAME} Server done"
}

# Установка клиента EVI-Perimeter
[[ ${SELECTED[@]} =~ ${INSTALL_OPT[2]} ]] && {

  log "INSTALL: ${PRODUCT_NAME} client"
  install "${INSTALL_OPT[2]}"
  sed -i 's/#WaylandEnable=false/WaylandEnable=false/' /etc/gdm3/custom.conf
  log "INSTALL: ${PRODUCT_NAME} client done"
}

log "Installation finished."
