ИШ: страница блокируется на время обновления, автооткат при сбое, честные статусы

- Обновление ИШ из обновления bj: страница «Шлюз НРД» (мастер и «Настройка → НРД»)
  перекрывается окном с ходом установки; успех — перезагрузка страницы, ошибка —
  текст и журнал. Статус ИШ отдаёт upgrade_to (получена версия, обновится сам) и
  installing (идёт установка) — вместо «ИШ не работает» и кнопки переустановки.
- Сбой после полного бэкапа (dpkg, запуск, движок не в Running) — bj-igate-admin
  сам откатывает ИШ к прежней версии (этап rollback); итог — ошибка «обновление до X
  не прошло: …, ИШ автоматически откатан к Y и работает». Проверено на 28
  искусственным сбоем после установки пакета.
- Откат не опускает счётчики id в базе ИШ: иначе новые пакеты получали бы уже
  виденные bj номера и поллер их пропускал.
- Автообновление ИШ после перезапуска ядра — через 20 с (было 2 мин), с повторами
  через 2 и 10 мин, если дистрибутив дописан позже. В итоге обновления bj —
  пояснение, что сам шлюз обновится через несколько минут.
- Строка версий над разделом НРД обновляется сразу при смене версии ИШ.
- Сводка «НРД → Организация» и раскрытие «Перенастроить» смотрят организацию так
  же, как bj (orgEff: введённое или из справочника по коду) — не «не задана», когда
  ИНН взят из справочника.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 20:15:10 +03:00
parent 41d33fefad
commit e4d7e31f7d
9 changed files with 115 additions and 21 deletions
+19 -3
View File
@@ -180,6 +180,13 @@ PY
cp -a "$UNIT" "$BK/" 2>/dev/null; cp -a "$UNIT.d" "$BK/" 2>/dev/null; cp -a "$WRAPPER" "$BK/" 2>/dev/null
igate_version > "$BK/version"
echo "$BK" > /var/backups/ish-last-backup.txt; echo "резервная копия прежнего ИШ $(cat "$BK/version"): $BK"
[ -s "$BK/var-lib-igate.tar.gz" ] && [ -s "$BK/igate-db.dump" ] && [ -s "$BK/opt-nsd-igate.tar.gz" ] && FULLBK=$BK
fi
if [ -n "${FULLBK:-}" ]; then
# обновление поверх работающего ИШ: при любой ошибке дальше — вернуть прежнюю версию (этап rollback, не error:
# страница продолжает показывать ход, итог — ошибка с пометкой «откатан»)
newv=$(basename "$deb" | sed -E "s/^igate_([0-9.]+)-([0-9]+)_.*/\\1.\\2/") # igate_110.0-997_amd64.deb → 110.0.997
die() { st rollback "$1 — откатываю к прежней версии"; echo "== ошибка обновления: $1 — откат"; BJ_RB_REASON="$1" BJ_RB_TO="$newv" /usr/local/sbin/bj-igate-admin rollback-now; exit 1; }
fi
echo "igate igate/service boolean false" | debconf-set-selections
echo "igate igate/shortcut boolean false" | debconf-set-selections
@@ -268,14 +275,14 @@ SQL
ok "откат ИШ к $(cat "$BK/version") запущен" ;;
rollback-now)
LOG=/var/log/bj-igate-install.log; : > "$LOG"
LOG=/var/log/bj-igate-install.log; [ -n "${BJ_RB_REASON:-}" ] || : > "$LOG"
st() { python3 - "$STATUS" "$1" "$2" "$LOG" <<'PY'
import json,sys,datetime
tail=open(sys.argv[4],errors='replace').read()[-1500:]
json.dump({"at":datetime.datetime.now().astimezone().isoformat(timespec="seconds"),"stage":sys.argv[2],"msg":sys.argv[3],"log":tail},open(sys.argv[1],"w"),ensure_ascii=False)
PY
chown bj:bj "$STATUS" 2>/dev/null; echo "== $2" >> "$LOG"; }
die() { st error "$1"; exit 1; }
die() { st error "${BJ_RB_REASON:+Обновление ИШ не прошло ($BJ_RB_REASON), и откат не удался: }$1"; exit 1; }
exec >>"$LOG" 2>&1
BK=$(cat /var/backups/ish-last-backup.txt 2>/dev/null); old=$(cat "$BK/version" 2>/dev/null); cur=$(igate_version)
[ -n "$old" ] || die "нет резервной копии прежнего ИШ"
@@ -290,9 +297,14 @@ PY
[ -d "$BK/$(basename "$UNIT").d" ] && { rm -rf "$UNIT.d"; cp -a "$BK/$(basename "$UNIT").d" "$UNIT.d"; }
[ -f "$BK/$(basename "$WRAPPER")" ] && cp -a "$BK/$(basename "$WRAPPER")" "$WRAPPER"
st db "возврат базы ИШ"
# текущие счётчики id: после отката не опускать их ниже — иначе ИШ выдаст новым пакетам уже виденные bj номера
seqs=$(psqlq -c "select sequencename||' '||coalesce(last_value,0) from pg_sequences where schemaname='public'" 2>/dev/null)
runuser -u postgres -- dropdb --if-exists "$DB" && runuser -u postgres -- createdb -O "$SVC_USER" "$DB" || die "не пересоздана база ИШ"
runuser -u postgres -- pg_restore -d "$DB" "$BK/igate-db.dump" || true
psqlq -c "select to_regclass('public.parameters') is not null" | grep -q t || die "база ИШ не восстановилась из $BK/igate-db.dump"
printf '%s\n' "$seqs" | while read -r n v; do
[ -n "$n" ] && psqlq -c "select setval('public.\"$n\"', greatest($v, (select last_value from public.\"$n\")))" >/dev/null 2>&1
done
# пришедший с обновлением дистрибутив больше не ставить сам (иначе bj вернёт версию сразу); новая версия — снова автоматически
dv=$(python3 -c "import json;print(json.load(open('/var/lib/bj/.bj/components.json')).get('igate-dist',{}).get('version',''))" 2>/dev/null)
[ -n "$dv" ] && { printf '%s
@@ -300,7 +312,11 @@ PY
st start "запуск ИШ $old"
systemctl daemon-reload; systemctl restart igate || die "служба igate не запустилась"
wait_engine 120 || die "ИШ $old запущен, но движок не перешёл в Running за 2 минуты. Журнал ИШ: $DATA_DIR/logs-svc/log.txt"
st done "ИШ откатан с $cur к $old и работает" ;;
if [ -n "${BJ_RB_REASON:-}" ]; then
st error "Обновление ИШ${BJ_RB_TO:+ до $BJ_RB_TO} не прошло: $BJ_RB_REASON. ИШ автоматически откатан к $old и работает; настройки и каналы прежние."
else
st done "ИШ откатан с $cur к $old и работает"
fi ;;
contour)
contour=$(j contour); crypto=$(j crypto); dep=$(j deponent); prof=$(j profile)
+6 -6
View File
@@ -1,11 +1,11 @@
{
"bj-component-install": {
"fingerprint": "16a300f65063aaee25793158b20d42fed527c7212f9f632b4076ad476b2ed9fb",
"version": "2026.10.21.6"
"fingerprint": "5be608b8b424a076d2732b3ca0943b47d7a509a494285cd5d4fab96f1e997765",
"version": "2026.10.21.17"
},
"bj-installer": {
"fingerprint": "6ef45b6928de126dd28ba9bdd2c5da7871a7d18fe76e5f90b5962c55db4a0c47",
"version": "2026.10.21.6"
"fingerprint": "3e893a6143ad7476e3ac45a0b76a2edaee72b07ad0223901d527e32f61e317fb",
"version": "2026.10.21.17"
},
"bj-lk": {
"fingerprint": "48a6cac59febba3392c854423b729f426383d86d35514578b5546786c8ab3355",
@@ -20,8 +20,8 @@
"version": "2026.10.21.6"
},
"bj-server": {
"fingerprint": "5617c24adb2d2392aecdfe6711bff54e8936688c249408c22042174511f258ba",
"version": "2026.10.21.16"
"fingerprint": "56630a5e3e2bd9e4a4f829f8351eb01ca9049ce0287f16449f0961b150c9ef85",
"version": "2026.10.21.17"
},
"crypto-service.jar": {
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",