#!/bin/sh
# Первая загрузка сервера, установленного с образа Bridge&Join. Спрашивает ключ продукта на консоли;
# без ключа ставит ядро bj с образа (/var/lib/bj/bundle), а ключ вводится в браузере на первой
# странице настройки. Пока bj не установлен, вопрос повторяется при каждой загрузке (с таймаутом),
# адрес и подсказки всегда есть на экране входа (bj-welcome).
set -u
MARK=/var/lib/bj/.bj/installed-from-iso
SERVER=https://lic.zetit.ru
CHANNEL=stable
BUNDLE=/var/lib/bj/bundle
[ -s /etc/bj/channel ] && CHANNEL=$(tr -d ' \n' < /etc/bj/channel)
finish() {
  mkdir -p "$(dirname "$MARK")" && date -Iseconds > "$MARK"
  systemctl disable bj-firstboot.service >/dev/null 2>&1
  [ -x /usr/local/sbin/bj-welcome ] && /usr/local/sbin/bj-welcome
}
urls() { ip -4 -o addr show scope global 2>/dev/null | awk '{split($4,a,"/"); printf "      http://%s:8080%s\n", a[1], "'"$1"'"}'; }
clear
printf '\n  Bridge&Join: установка на сервер\n  ────────────────────────────────────────────────────────────\n'
printf '  Debian установлен. Осталось установить bj.\n\n'
if [ -f "$BUNDLE/manifest.json" ]; then
  printf '  Ключ продукта (BJ-XXXX-XXXX-XXXX) есть в портале клиента %s/portal/.\n' "$SERVER"
  printf '  Вводить его здесь необязательно: нажмите Enter — ядро bj установится с образа,\n  а ключ вы введёте в браузере на первой странице настройки (там его удобно вставить).\n\n'
else
  printf '  Нужен ключ продукта (BJ-XXXX-XXXX-XXXX): он есть в портале клиента %s/portal/\n\n' "$SERVER"
fi
for i in $(seq 1 30); do
  curl -fsS -m 5 -o /dev/null "$SERVER/healthz" && break
  [ "$i" = 1 ] && printf '  Жду сеть и связь с %s…\n' "$SERVER"
  sleep 2
done
while true; do
  CODE=""
  if [ -f "$BUNDLE/manifest.json" ]; then
    read -t 120 -r -p "  Ключ продукта (Enter — установить с образа, ключ ввести в браузере): " CODE || true
  else
    read -t 120 -r -p "  Ключ продукта (Enter — установить позже): " CODE || true
  fi
  CODE=$(printf '%s' "${CODE:-}" | tr -d ' ' | tr '[:lower:]' '[:upper:]')
  if [ -z "$CODE" ]; then
    if [ -f "$BUNDLE/manifest.json" ]; then
      if /usr/local/sbin/bj-installer install --bundle "$BUNDLE" --server "$SERVER" --channel "$CHANNEL"; then
        finish
        printf '\n  Ключ продукта спросит первая страница настройки в браузере:\n'; urls /first-run; printf '\n'
        read -t 60 -r -p "  Нажмите Enter, чтобы перейти к экрану входа. " _ || true
        exit 0
      fi
      printf '\n  Установка с образа не завершилась. Подробности выше; повторить:\n      sudo bj-installer install --bundle %s\n\n' "$BUNDLE"
      sleep 5; exit 0
    fi
    printf '\n  Установка bj отложена. Вопрос повторится при следующей загрузке; вручную:\n      sudo bj-installer install --code КЛЮЧ-ПРОДУКТА\n\n'
    sleep 3
    exit 0
  fi
  if /usr/local/sbin/bj-installer install --code "$CODE" --server "$SERVER" --channel "$CHANNEL"; then
    finish
    read -t 60 -r -p "  Нажмите Enter, чтобы перейти к экрану входа. " _ || true
    exit 0
  fi
  printf '\n  Установка не завершилась. Проверьте ключ продукта и сеть и попробуйте ещё раз.\n\n'
done
