#!/bin/sh
# bj-welcome — приветственный экран на консоли до входа (/etc/issue.d/10-bj.issue):
# адреса веб-входа и состояние bj. Вызывается службой bj-welcome при загрузке и по таймеру,
# а также установщиком после шагов, меняющих состояние. Читает только локальные файлы.
set -u
ISSUE=/etc/issue.d/10-bj.issue
mkdir -p /etc/issue.d
BJ=/opt/bj/bj-server
SETUP=/var/lib/bj/.bj/setup.json
USERS=/var/lib/bj/.bj/users.json
FIRSTRUN=/var/lib/bj/.bj/first-run.json
PORT=8080
HOST=$(hostname 2>/dev/null || echo bj)
ADDRS=$(ip -4 -o addr show scope global 2>/dev/null | awk '{split($4,a,"/"); print a[1]}' | tr '\n' ' ')
[ -z "$ADDRS" ] && ADDRS="<адрес не получен: проверьте сеть>"
url() { for a in $ADDRS; do case "$a" in \<*) printf '      http://%s:%s%s\n' "<IP сервера>" "$PORT" "$1";; *) printf '      http://%s:%s%s\n' "$a" "$PORT" "$1";; esac; done; }
lic=""
if [ -r "$SETUP" ]; then
  lic=$(python3 - "$SETUP" 2>/dev/null <<'PY'
import json,sys
try:
    d=json.load(open(sys.argv[1])); l=d.get("license",{})
    # только устойчивое состояние: сообщение о продлении меняется каждые 15 минут, и экран
    # перерисовывался бы (перезапуск входа на консоли) без нужды
    print("да" if l.get("key") else "нет")
except Exception: print("")
PY
)
fi
{
  printf '\033[H\033[2J'  # очистить экран: при повторном показе приглашения текст не копится
  printf '\n  ┌────────────────────────────────────────────────────────────────┐\n'
  printf '  │  Bridge&Join (bj) — шлюз переводов ценных бумаг M2M / НРД        │\n'
  printf '  └────────────────────────────────────────────────────────────────┘\n'
  printf '  Сервер: %s   Адреса: %s\n\n' "$HOST" "$ADDRS"
  if [ ! -x "$BJ" ]; then
    printf '  Состояние: bj НЕ УСТАНОВЛЕН.\n'
    if [ -f /var/lib/bj/bundle/manifest.json ]; then
      printf '  Установка с образа (ключ продукта — потом, в браузере):\n      sudo bj-installer install --bundle /var/lib/bj/bundle\n'
      printf '  Или с ключом продукта:  sudo bj-installer install --code BJ-XXXX-XXXX-XXXX\n'
    else
      printf '  Установка:  sudo bj-installer install --code BJ-XXXX-XXXX-XXXX  (ключ — в портале клиента)\n'
    fi
  elif ! grep -q '"login"' "$USERS" 2>/dev/null; then
    printf '  Состояние: bj установлен, ПЕРВИЧНАЯ НАСТРОЙКА НЕ ВЫПОЛНЕНА.\n'
    printf '  Откройте в браузере на своём компьютере:\n'; url /first-run
    if [ -f "$FIRSTRUN" ]; then
      printf '  Введите одноразовый код, показанный установщиком. Код потерян или истёк —\n  новый код:  sudo bj-installer first-run-code\n'
    else
      printf '  Нужен одноразовый код:  sudo bj-installer first-run-code\n'
    fi
    case "$lic" in да*) ;; *) printf '  Ключ продукта ещё не введён — его спросит первая страница.\n';; esac
  else
    printf '  Состояние: bj работает. Вход в веб-интерфейс:\n'; url /admin
    case "$lic" in
      да*) printf '  Лицензия: ключ продукта введён (подробности — «Настройка → Лицензия»).\n';;
      *)   printf '  Лицензия НЕ АКТИВИРОВАНА: введите ключ продукта в «Настройка → Лицензия».\n';;
    esac
  fi
  if id root_bj >/dev/null 2>&1; then
    printf '\n  Вход в консоль сервера (обслуживание): root_bj — администратор (sudo), user_bj — обычный.\n  Пароли показаны один раз при первой загрузке. Веб-вход в bj — по адресу выше.\n\n'
  else
    ADM=$(getent group sudo | cut -d: -f4 | tr ',' ' ')
    printf '\n  Вход в консоль сервера (обслуживание): логин администратора ОС%s и его пароль,\n  заданные при установке; команды — через sudo. Веб-вход — по адресу выше.\n\n' "${ADM:+ ($ADM)}"
  fi
} > "$ISSUE.tmp"
if ! cmp -s "$ISSUE.tmp" "$ISSUE" 2>/dev/null; then
  mv -f "$ISSUE.tmp" "$ISSUE"
  # обновить приглашение на tty1, если там никто не вошёл
  if command -v systemctl >/dev/null && ! who 2>/dev/null | grep -qE '^\S+\s+tty1\b'; then
    systemctl try-restart getty@tty1.service 2>/dev/null || true
  fi
else
  rm -f "$ISSUE.tmp"
fi
