ИШ: страница блокируется на время обновления, автооткат при сбое, честные статусы
- Обновление ИШ из обновления 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:
@@ -167,6 +167,13 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
res["depo_db_test"], res["depo_db_prod"] = s.NSD.DepoDBTest, s.NSD.DepoDBProd
|
||||
res["bundled"] = igateBundledVersion()
|
||||
res["keymedia"] = keymediaState() // missing — ИШ ждёт флешку с ключом: переустановка не поможет
|
||||
res["upgrade_to"] = igatePendingUpgrade()
|
||||
if v, _ := res["version"].(string); v != "" && canonVer(systemVersions(rc).Get("ish").Version) != canonVer(v) {
|
||||
go refreshVersions(rc) // ИШ обновили/откатили — строка версий над разделом не должна показывать прежнюю
|
||||
}
|
||||
if st := igateInstallStatus(); st.Busy {
|
||||
res["installing"] = st.Msg
|
||||
}
|
||||
jsonOut(w, res)
|
||||
})
|
||||
// установка или обновление ИШ: загруженный архив НРД или версия для скачивания с nsd.ru
|
||||
@@ -474,14 +481,28 @@ func igateInstallDist(ctx context.Context) error {
|
||||
// igateAutoUpgradeSkipPath — версия дистрибутива, с которой ИШ откатили (её автоматически не ставим).
|
||||
var igateAutoUpgradeSkipPath = "/var/lib/bj/igate-autoupgrade-skip"
|
||||
|
||||
func igateUpgradeSkipped(dist string) bool {
|
||||
b, err := os.ReadFile(igateAutoUpgradeSkipPath)
|
||||
return err == nil && strings.TrimSpace(string(b)) == dist
|
||||
}
|
||||
|
||||
// igatePendingUpgrade — версия ИШ, до которой bj обновит шлюз сам (пришла с обновлением bj); "" — нечего.
|
||||
func igatePendingUpgrade() string {
|
||||
cur := ishInstalledVersion()
|
||||
_, dist := igateDistFile()
|
||||
if !igateInstalled() || cur == "" || dist == "" || !release.IsNewer(dist, cur) || igateUpgradeSkipped(dist) {
|
||||
return ""
|
||||
}
|
||||
return dist
|
||||
}
|
||||
|
||||
func igateAutoUpgrade(ctx context.Context, rc *RuntimeConfig) {
|
||||
cur := ishInstalledVersion()
|
||||
_, dist := igateDistFile()
|
||||
if !igateInstalled() || cur == "" || dist == "" || !release.IsNewer(dist, cur) || igateInstallStatus().Busy {
|
||||
return
|
||||
}
|
||||
// ИШ откатили с этой версии вручную — сам не ставим, пока не придёт следующая
|
||||
if b, err := os.ReadFile(igateAutoUpgradeSkipPath); err == nil && strings.TrimSpace(string(b)) == dist {
|
||||
if igateUpgradeSkipped(dist) { // ИШ откатили с этой версии вручную — сам не ставим, пока не придёт следующая
|
||||
return
|
||||
}
|
||||
log.Printf("lk-gateway: ИШ %s старее проверенного дистрибутива %s — обновляю", cur, dist)
|
||||
|
||||
Reference in New Issue
Block a user