diff --git a/internal/lkgateway/onboarding_test.go b/internal/lkgateway/onboarding_test.go
index 6c9ec7a..912298e 100644
--- a/internal/lkgateway/onboarding_test.go
+++ b/internal/lkgateway/onboarding_test.go
@@ -210,11 +210,11 @@ func TestWizardChaptersWithoutLicense(t *testing.T) {
rc, _ := NewRuntimeConfig(t.TempDir() + "/setup.json")
done := map[int]bool{2: true, 6: true}
path, chapters := wizPath(rc, done, 4)
- want := []int{1, 12, 4, 7, 8, 9, 13, 10} // без лицензии нет учёта DEPO, QUIK и модулей; база и Валидата — сделаны; учётные записи — перед проверкой
+ want := []int{14, 1, 12, 4, 7, 8, 9, 13, 10} // обновление — первый пункт; без лицензии нет учёта DEPO, QUIK и модулей; база и Валидата — сделаны; учётные записи — перед проверкой
if fmt.Sprint(path) != fmt.Sprint(want) {
t.Fatalf("путь %v, ожидался %v", path, want)
}
- if len(chapters) != 4 || !chapters[1].Current || chapters[1].Steps[0].N != 4 {
+ if len(chapters) != 5 || !chapters[2].Current || chapters[2].Steps[0].N != 4 {
t.Fatalf("главы: %+v", chapters)
}
if p, n := wizNeighbours(path, 4); p != 12 || n != 7 {
@@ -233,10 +233,10 @@ func TestWizardChaptersWithoutLicense(t *testing.T) {
if len(wizModuleViews(rc, rc.Snapshot())) != 0 {
t.Fatal("без лицензии модулей в мастере быть не должно")
}
- if chapters[1].Title != "Организация" {
- t.Fatalf("без учёта DEPO и QUIK глава 2 — «Организация», а не %q", chapters[1].Title)
+ if chapters[2].Title != "Организация" {
+ t.Fatalf("без учёта DEPO и QUIK глава «Организация», а не %q", chapters[2].Title)
}
- if l := wizChaptersLine(chapters); l != "Четыре главы: сервер, организация, НРД, запуск." {
+ if l := wizChaptersLine(chapters); l != "Пять глав: обновление, сервер, организация, НРД, запуск." {
t.Fatalf("подзаголовок: %q", l)
}
}
@@ -437,7 +437,7 @@ func TestWizardStepsRender(t *testing.T) {
t.Fatal(err)
}
h := &setupHandlers{rc: rc, tpl: &adminTemplates{a: a}}
- for step, want := range map[string]string{"1": "QUIK: неторговые поручения", "3": "wiz-depo", "5": "Сохранить и проверить", "12": "wiz-tz-suggest", "10": "Проверка"} {
+ for step, want := range map[string]string{"1": "QUIK: неторговые поручения", "3": "wiz-depo", "5": "Сохранить и проверить", "12": "wiz-tz-suggest", "10": "Проверка", "14": "sec-update"} {
w := httptest.NewRecorder()
h.renderWizard(w, httptest.NewRequest(http.MethodGet, "/admin/wizard?step="+step, nil))
body := w.Body.String()
diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go
index ac02af6..276aed8 100644
--- a/internal/lkgateway/setup.go
+++ b/internal/lkgateway/setup.go
@@ -288,8 +288,9 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
// Главы (wizchapters.go): в пути только шаги, нужные этой установке — по лицензии и без сделанного
// установщиком. Без ?step — первый несделанный обязательный шаг, а если всё сделано — проверка.
d.Done.Users = doneUsers()
+ _, wizUpdAvail := updateComponentRows(h.rc) // шаг 14 «Обновление»: зелёный, пока нет версии новее
done := map[int]bool{1: d.Done.License, 2: d.Done.Postgres, 3: d.Done.Depo, 4: d.Done.Org, 5: d.Done.Quik, 6: d.Done.Crypto,
- 7: d.Done.NSD, 8: d.Done.Certs, 9: d.Done.Alerts, 10: d.Done.TestRun, 11: d.Done.Modules, 12: d.Done.Server, 13: d.Done.Users}
+ 7: d.Done.NSD, 8: d.Done.Certs, 9: d.Done.Alerts, 10: d.Done.TestRun, 11: d.Done.Modules, 12: d.Done.Server, 13: d.Done.Users, 14: !wizUpdAvail}
path, _ := wizPath(h.rc, done, 0)
step := wizDefaultStep(path, done)
if v := r.URL.Query().Get("step"); v != "" {
@@ -327,7 +328,7 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
}
cancel()
}
- if (step >= 3 && step <= 5) || step == 9 || step == 11 || step == 13 { // DEPO, организация, QUIK МНП, оповещения и копии, модули, учётные записи — общие блоки из «Настройки»
+ if (step >= 3 && step <= 5) || step == 9 || step == 11 || step == 13 || step == 14 { // DEPO, организация, QUIK МНП, оповещения и копии, модули, учётные записи, обновление — общие блоки из «Настройки»
fd := h.setupData(w, r, "")
fd.InWizard = true
d.Fancy = &fd
@@ -398,7 +399,7 @@ func depoServerEdition(ctx context.Context, f FancyMSSQLSettings) (string, bool)
// wizardSteps — шагов в мастере: 1 лицензия, 2 база bj, 3 учёт DEPO, 4 наша организация, 5 QUIK МНП,
// 6 Валидата, 7 шлюз НРД, 8 ключ и сертификаты (ключ ставится в профиль ИШ — после шлюза),
// 9 оповещения и резервные копии, 10 проверка готовности.
-const wizardSteps = 13 // 11 — модули по лицензии (глава «Запуск»), 12 — время и сеть (глава «Сервер»), 13 — учётные записи
+const wizardSteps = 14 // 11 — модули, 12 — время и сеть, 13 — учётные записи, 14 — обновление (первый пункт, глава «Обновление»)
// dsnSummary — «host:port, база name» из строки подключения PostgreSQL, без логина и пароля.
func dsnSummary(dsn string) string {
diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html
index e127c1d..cd80a54 100644
--- a/internal/lkgateway/web/templates/admin_setup.html
+++ b/internal/lkgateway/web/templates/admin_setup.html
@@ -936,88 +936,7 @@
{{/* ============ ОБНОВЛЕНИЯ ============ */}}
- В лицензии нет модуля «Обновления». Закрытый контур. Если у сервера нет выхода к серверу обновлений, скачайте пакет обновления на портале клиента (lic.zetit.ru → Установка → «Пакет обновления») и загрузите его кнопкой «Обновить из файла». Система сама распознаёт, что внутри — ядро, модули или всё вместе — и ставит в правильном порядке. Модуль, которому нужно более новое ядро, чем установлено, будет пропущен с подсказкой обновить сначала ядро.Обновления
- {{template "verline" (.Versions.Get "bj-server")}}
-
- Компоненты и версиичто установлено на этом сервере и что есть в выпуске; можно обновить один компонент
-
-
-
- {{range .Components}}Компонент Установлена Доступна Служба
- {{end}}
-
- {{.Title}}
- {{.Name}}{{if eq .Name "crypto-service.jar"}}{{with $.Versions.Get "validata"}}{{if .Version}} · работает с «Валидата Клиент L» {{.Version}}{{end}}{{end}}{{end}}{{if .Present}}{{if .Installed}}{{.Installed}}{{else}}неизвестна{{end}}{{else}}не установлен{{end}}
- {{if .Available}}{{.Available}}{{if .New}} к установке{{else if .Update}} новее{{end}}{{if .Blocked}}
-
- {{.Unit}}{{if .Update}}{{end}}
- Расширенные настройкиисточник и канал обновлений, обновление из файла для сервера без выхода в интернет
- Обновление из файла
- Источник обновлений
-
-
Проверка и установка обновлений bj. Это первый пункт мастера — сюда можно вернуться в любой момент.
+ {{with .Fancy}}{{template "updateSection" .}}{{end}} + {{template "wizNav" .}} +В лицензии нет модуля «Обновления».
{{end}} +| Компонент | Установлена | Доступна | Служба | |
|---|---|---|---|---|
{{.Title}}{{.Name}}{{if eq .Name "crypto-service.jar"}}{{with $.Versions.Get "validata"}}{{if .Version}} · работает с «Валидата Клиент L» {{.Version}}{{end}}{{end}}{{end}} |
+ {{if .Present}}{{if .Installed}}{{.Installed}}{{else}}неизвестна{{end}}{{else}}не установлен{{end}} | +{{if .Available}}{{.Available}}{{if .New}} к установке{{else if .Update}} новее{{end}}{{if .Blocked}} {{.Blocked}} {{end}}{{else}}нет данных{{end}} |
+ {{.Unit}} |
+ {{if .Update}}{{end}} | +
Закрытый контур. Если у сервера нет выхода к серверу обновлений, скачайте пакет обновления на портале клиента (lic.zetit.ru → Установка → «Пакет обновления») и загрузите его кнопкой «Обновить из файла». Система сама распознаёт, что внутри — ядро, модули или всё вместе — и ставит в правильном порядке. Модуль, которому нужно более новое ядро, чем установлено, будет пропущен с подсказкой обновить сначала ядро.
+