#!/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 TLSPORT=8443 # веб-вход по HTTPS (сертификат сервера — браузер попросит подтвердить исключение) 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 ' https://%s:%s%s\n' "" "$TLSPORT" "$1";; *) printf ' https://%s:%s%s\n' "$a" "$TLSPORT" "$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