ИШ: этапы обновления шлюза в окне обновления bj, проверка нового ИШ, свежая версия в строке НРД

- окно обновления bj после перезапуска ведёт обновление ИШ по этапам (загрузка, остановка,
  резервная копия, установка, запуск, проверка) и закрывается только после проверки;
  пока шлюз обновляется, то же окно на любой странице
- bj-igate-admin: этапы stop/backup/verify; после запуска сверяются версия, служба, движок,
  каналы и ключ с прежними (иначе автооткат), обмен с НРД
- версия ИШ в строке НРД читается всегда заново (кэш 6 ч — только сайт НРД);
  после установки версии пересобираются сразу

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 22:50:43 +03:00
parent e4d7e31f7d
commit c9ab60130f
6 changed files with 179 additions and 56 deletions
+25 -14
View File
@@ -234,20 +234,7 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
})
// ход установки: этап, сообщение, журнал и сколько секунд идёт текущий этап (по времени записи файла)
mux.HandleFunc("/admin/setup/igate/install-status", func(w http.ResponseWriter, r *http.Request) {
raw, err := os.ReadFile(igateInstallStatusPath)
out := map[string]any{}
if err != nil || json.Unmarshal(raw, &out) != nil {
jsonOut(w, map[string]any{})
return
}
if fi, err := os.Stat(igateInstallStatusPath); err == nil {
out["elapsed"] = int(time.Since(fi.ModTime()).Seconds())
}
st := igateInstallStatus()
if st.Stage == "error" && out["stage"] != "error" { // молчит 20 минут — прервалась
out["stage"], out["msg"] = "error", st.Msg
}
jsonOut(w, out)
jsonOut(w, igateInstallStatusJSON(rc))
})
// канал контура в ИШ (адрес, отпечаток УЦ, папка обмена); ключ — мастером установки ключа
mux.HandleFunc("/admin/setup/igate/contour", func(w http.ResponseWriter, r *http.Request) {
@@ -410,6 +397,30 @@ type igateInstallState struct {
// igateInstallStatusPath — файл хода установки; var — для тестов.
var igateInstallStatusPath = "/var/lib/bj/igate-install-status.json"
// igateInstallStatusJSON — ход установки/обновления ИШ для страниц: этап, сообщение, журнал, сколько
// секунд идёт этап (elapsed), идёт ли сейчас (busy). Как только установка закончилась, версии
// пересобираются тут же — строка «Интеграционный шлюз НРД (ИШ): …» не показывает прежнюю.
func igateInstallStatusJSON(rc *RuntimeConfig) map[string]any {
out := map[string]any{}
raw, err := os.ReadFile(igateInstallStatusPath)
if err != nil || json.Unmarshal(raw, &out) != nil {
return map[string]any{}
}
fi, err := os.Stat(igateInstallStatusPath)
if err == nil {
out["elapsed"] = int(time.Since(fi.ModTime()).Seconds())
}
st := igateInstallStatus()
if st.Stage == "error" && out["stage"] != "error" { // молчит 20 минут — прервалась
out["stage"], out["msg"] = "error", st.Msg
}
out["busy"] = st.Busy
if !st.Busy && err == nil && fi.ModTime().After(systemVersions(rc).At) {
refreshVersions(rc)
}
return out
}
func igateInstallStatus() igateInstallState {
p := igateInstallStatusPath
var st igateInstallState