#!/bin/sh

services_ctrl_check()
{
  if [ "x$SERVICES_CTRL" = "xsystemd" ]; then
    systemctl --help >/dev/null 2>&1
    if [ $? -ne 0 ]; then
      echo "Программа systemctl не найдена."
      return 1
    fi

    if [ ! -d "/lib/systemd/system" -a ! -L "/lib/systemd/system" ]; then
      echo "Директория конфигурации systemd не обнаружена."
      return 1
    fi
  elif [ "x$SERVICES_CTRL" != "x" -a "x$SERVICES_CTRL" != "xno" ]; then
    echo "Неверная система управления службами. Пожалуйста, задайте переменную SERVICES_CTRL в файле /etc/minipbx.cfg."
    return 1
  fi

  return 0
}

services_ctrl_install()
{
  if [ "x$SERVICES_CTRL" = "xsystemd" ]; then
    sed -e "s|TARGET|$TARGET|" dist/minipbx.service > "/lib/systemd/system/minipbx.service"
    if [ -z "$DEBUG_DONT_PULL" ]; then
      systemctl enable minipbx.service
    fi
    systemctl daemon-reload
  fi
}

services_ctrl_uninstall()
{
  if [ "x$SERVICES_CTRL" = "xsystemd" ]; then
    systemctl disable minipbx.service
    rm -rf "/lib/systemd/system/minipbx.service"
  fi
}

read_config()
{
  . /etc/minipbx.cfg

  if [ ! -z "$ADD_PATH" ]; then
    export PATH="$PATH:/usr/bin:$ADD_PATH"
  else
    export PATH="$PATH:/usr/bin"
  fi
}

check_tools()
{
  local TOOLS="docker netstat usb_modeswitch wget md5sum tar ip groupadd usermod"
  local NF=

  services_ctrl_check
  if [ $? -ne 0 ]; then
    return 1
  fi

  for TOOL in $TOOLS; do
    if [ "x$TOOL" = "xnetstat" -o "x$TOOL" = "xip" ]; then
      "$TOOL" -V >/dev/null 2>&1
    else
      "$TOOL" --help >/dev/null 2>&1
    fi
    if [ $? -ne 0 ]; then
      NF="$NF $TOOL"
    fi
  done

  if [ ! -z "$NF" ]; then
    echo "Пожалуйста, установите следующие программы:$NF"
    return 1
  fi

  return 0
}

upd_cfg_format()
{
  grep "^CGROUP_FIX=" /etc/minipbx.cfg
  if [ $? -ne 0 ]; then
    cat >> /etc/minipbx.cfg << EOF

# Устранение проблемы с запуском, связанной с cgroup
CGROUP_FIX=
EOF
  fi

  grep -q "^WEB_PORT=" /etc/minipbx.cfg
  if [ $? -ne 0 ]; then
    cat >> /etc/minipbx.cfg << EOF

# Порт для web-панели
WEB_PORT=80
EOF
  fi
}

inst()
{
  if [ -f "$TARGET/minipbx-ctrl" -o -f "$TARGET/minipbx.ver" ]; then
    echo "АТС уже установлена"
    return 1
  fi

  echo "-> Проверка наличия необходимых программ"
  check_tools
  if [ $? -ne 0 ]; then
    return 1
  fi

  echo "-> Подготовка"
  upd_cfg_format
  read_config

  if [ -z "$DEBUG_DONT_PULL" ]; then
    echo "-> Загрузка образа АТС"
    local VERSION=$(cat "dist/minipbx.ver")
    docker pull "${IMAGE_ID}-base"
    docker pull "$IMAGE_ID:$BRANCH-$VERSION"
    if [ $? -ne 0 ]; then
      echo "Невозможно загрузить образ АТС. Пожалуйста, обратитесь в техподдержку."
      return 1
    fi
  fi

  echo "-> Установка"
  install -d "$TARGET"
  install -m 0644 dist/41-huawei.rules /etc/udev/rules.d/41-huawei.rules
  install -m 0644 dist/minipbx.ver "$TARGET/"
  install -m 0755 dist/minipbx-ctrl "$TARGET/"
  install -m 0755 dist/minipbx-install /usr/bin
  install -m 0755 dist/minipbx-uninstall /usr/bin
  install -m 0755 dist/minipbx-update /usr/bin
  install -m 0755 dist/minipbx-start /usr/bin
  install -m 0755 dist/minipbx-stop /usr/bin
  install -m 0755 dist/minipbx-restart /usr/bin
  install -m 0755 dist/minipbx-status /usr/bin
  install -m 0755 dist/minipbx-config /usr/bin

  services_ctrl_install

  local IP=$(ip route get 1.2.3.4 | grep via | head -1 | awk '{print $7}' |\
    grep -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
  if [ -z "$IP" ]; then
    IP="127.0.0.1"
  fi

  echo
  echo "Успешно установлено."
  #echo "Вставьте ключ-токен в компьютер и запустите АТС командой:"
  #echo "  sudo minipbx-start"
  echo "Выполняется запуск АТС."
  echo "Управление АТС будет доступно через несколько секунд по адресу:"
  echo "http://$IP"
  if [ "x$SERVICES_CTRL" != "xsystemd" ]; then
    echo "Основной процесс будет запущен в данном терминале."
  fi
  "$TARGET/minipbx-ctrl" start
  return 0
}

uninst()
{
  if [ ! -f "$TARGET/minipbx-ctrl" -o ! -f "$TARGET/minipbx.ver" ]; then
    echo "АТС не установлена"
    return 1
  fi

  echo "-> Останов АТС"
  "$TARGET/minipbx-ctrl" stop

  if [ -z "$DEBUG_DONT_PULL" ]; then
    echo "-> Удаление образа АТС"
    local VERSION=$(cat "$TARGET/minipbx.ver")
    docker image rm "$IMAGE_ID:$BRANCH-$VERSION"
  fi

  echo "-> Удаление компонентов"
  services_ctrl_uninstall
  rm -rf /etc/udev/rules.d/41-huawei.rules
  rm -rf "$TARGET/minipbx.ver"
  rm -rf "$TARGET/minipbx-ctrl"
  rm -rf /usr/bin/minipbx-install
  rm -rf /usr/bin/minipbx-uninstall
  rm -rf /usr/bin/minipbx-update
  rm -rf /usr/bin/minipbx-start
  rm -rf /usr/bin/minipbx-stop
  rm -rf /usr/bin/minipbx-restart
  rm -rf /usr/bin/minipbx-status
  rm -rf /usr/bin/minipbx-config

  echo "Успешно удалено"
  return 0
}

check_version()
{
  V1=$(echo "$1" | sed 's/\./ /g;s/-/ /g')
  V2=$(echo "$2" | sed 's/\./ /g;s/-/ /g')
  i=1
  for V in $V1; do
    VD=$(echo "$V2" | cut -d' ' -f $i)
    i=$(($i + 1))
    if [ -z "$VD" -o "$V" -gt "$VD" ]; then
      return 0
    fi
    if [ "$V" -lt "$VD" ]; then
      return 1
    fi
  done
  if [ "$V" -eq "$VD" ]; then
    return 1
  fi
  return 0
}

update()
{
  local SERVER="poladis.ru"
  if [ ! -z "$DEBUG_SERVER" ]; then
    SERVER="$DEBUG_SERVER"
  fi
  local URL="http://$SERVER/minipbx-pc/$BRANCH"
  local UPDDIR="/tmp/minipbx-update"

  local VER="0.0.0"
  local VER_NEW=
  local MD5=
  local MD5_REAL=

  if [ ! -f "$TARGET/minipbx-ctrl" -o ! -f "$TARGET/minipbx.ver" ]; then
    echo "АТС не установлена"
    return 1
  fi

  rm -rf "$UPDDIR"
  mkdir -p "$UPDDIR"

  echo "-> Проверка наличия обновлений"
  wget --quiet "$URL/minipbx.tar.gz" -O "$UPDDIR/minipbx.tar.gz"
  if [ $? -ne 0 ]; then
    echo "Невозможно получить информацию об обновлениях. Повторите попытку позднее."
    return 1
  fi

  wget --quiet "$URL/minipbx.md5" -O "$UPDDIR/minipbx.md5"
  if [ $? -ne 0 ]; then
    echo "Не все сведения об обновлениях были получены. Повторите попытку позднее."
    return 1
  fi

  MD5=$(cat "$UPDDIR/minipbx.md5" | cut -d' ' -f1)
  MD5_REAL=$(md5sum "$UPDDIR/minipbx.tar.gz" | cut -d' ' -f1)
  if [ "x$MD5" != "x$MD5_REAL" ]; then
    echo "Получены некорректные сведения об обновлениях. Повторите попытку позднее"
    return 1
  fi

  tar xf "$UPDDIR/minipbx.tar.gz" -C "$UPDDIR"
  if [ $? -ne 0 ]; then
    echo "Ошибка при обработке сведений об обновлениях. Повторите попытку позднее."
    return 1
  fi

  VER=$(cat "$TARGET/minipbx.ver")
  VER_NEW=$(cat "$UPDDIR/minipbx/dist/minipbx.ver")
  check_version "$VER_NEW" "$VER"
  if [ $? -ne 0 ]; then
    echo "Обновлений не найдено."
    return 0
  fi

  echo "Обнаружена новая версия АТС: $VER_NEW"

  uninst

  chmod 0755 "$UPDDIR/minipbx/install"
  "$UPDDIR/minipbx/install"
  return $?
}


if [ "x$(whoami)" != "xroot" ]; then
  echo "Требуются права суперпользователя. Выполните:"
  case "$1" in
    update)
      CMD="minipbx-update"
    ;;
    uninstall)
      CMD="minipbx-uninstall"
    ;;
    *)
      CMD="$0"
    ;;
  esac
  echo "  sudo $CMD"
  exit 1
fi

cd $(dirname $0)
DIR=$(pwd)
BRANCH=stable

if [ ! -f /etc/minipbx.cfg ]; then
  if [ -f dist/minipbx.cfg ]; then
    install -m 0644 dist/minipbx.cfg /etc/minipbx.cfg
    if [ $? -ne 0 ]; then
      echo "Невозможно скопировать файл конфигурации minipbx.cfg."
      exit 1
    fi
  else
    echo "Файл конфигурации /etc/minipbx.cfg не найден."
    exit 1
  fi
fi

read_config

IMAGE_ID="cr.yandex/crp9f1mct0nssd2k2cic/minipbx-pc"


case "$1" in
  update)
    update
  ;;
  uninstall)
    uninst
  ;;
  *)
    inst
  ;;
esac

exit $?
