ИШ: страница блокируется на время обновления, автооткат при сбое, честные статусы
- Обновление ИШ из обновления 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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user