Мастер: «Настроить позже» и единый расчёт шагов для мастера и главной
- Необязательные шаги «Модули», «Оповещения и копии», «Учётные записи» и каждый модуль отдельно можно отложить кнопкой «Настроить позже»: мастер считает их завершёнными, глава «Запуск» закрывается. Отметку можно снять («Вернуть в мастер»); как только шаг настроен по-настоящему, отметка не показывается. Хранится в /var/lib/bj/.bj/wizard-deferred.json (wizdefer.go). - Шаг «Оповещения и копии» показывает, что уже настроено: почта, Zabbix, резервные копии — видно частичную настройку, сделанную в «Настройке». - Плашка «Требуется настройка — N из M» на главной считалась по старому списку из 9 шагов и расходилась с мастером. Теперь и мастер, и главная используют одну функцию wizDone и путь wizPath — те же шаги, лицензия и отметки «отложено». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -20,8 +20,8 @@
|
|||||||
"version": "2026.10.21.6"
|
"version": "2026.10.21.6"
|
||||||
},
|
},
|
||||||
"bj-server": {
|
"bj-server": {
|
||||||
"fingerprint": "6a2896e2078e2388caf8822568efa8b7d798a51891433ce1e6413cb7a11eeca1",
|
"fingerprint": "98167dc3f6c196784867f7eb88e091c693b160277f09735971e44e2c18f21a61",
|
||||||
"version": "2026.10.21.14"
|
"version": "2026.10.21.15"
|
||||||
},
|
},
|
||||||
"crypto-service.jar": {
|
"crypto-service.jar": {
|
||||||
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",
|
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ func registerSetup(mux *http.ServeMux, a *admin, rc *RuntimeConfig, svc *Service
|
|||||||
h.renderSetup(w, r, "")
|
h.renderSetup(w, r, "")
|
||||||
})
|
})
|
||||||
mux.HandleFunc("/admin/setup/postgres", h.savePostgres)
|
mux.HandleFunc("/admin/setup/postgres", h.savePostgres)
|
||||||
|
registerWizDefer(mux) // «Настроить позже» в мастере
|
||||||
mux.HandleFunc("/admin/setup/postgres/quick-start", h.quickStartPostgres)
|
mux.HandleFunc("/admin/setup/postgres/quick-start", h.quickStartPostgres)
|
||||||
h.registerPGMove(mux)
|
h.registerPGMove(mux)
|
||||||
h.registerFancy(mux) // вкладка «Обмен Fancy (MSSQL)»
|
h.registerFancy(mux) // вкладка «Обмен Fancy (MSSQL)»
|
||||||
@@ -200,8 +201,9 @@ type WizardData struct {
|
|||||||
StepRequired bool
|
StepRequired bool
|
||||||
StepTitle string
|
StepTitle string
|
||||||
ChapterTitle string
|
ChapterTitle string
|
||||||
ChaptersLine string // «Четыре главы: сервер, организация, НРД, запуск.»
|
ChaptersLine string // «Четыре главы: сервер, организация, НРД, запуск.»
|
||||||
Modules []WizModule // глава «Запуск»: модули по лицензии
|
Modules []WizModule // глава «Запуск»: модули по лицензии
|
||||||
|
Deferred map[int]bool // шаги, отложенные кнопкой «Настроить позже» (и ещё не настроенные)
|
||||||
Done struct {
|
Done struct {
|
||||||
License bool
|
License bool
|
||||||
Depo bool
|
Depo bool
|
||||||
@@ -279,18 +281,21 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
|
|||||||
d.Modules = wizModuleViews(h.rc, s)
|
d.Modules = wizModuleViews(h.rc, s)
|
||||||
d.Done.Server, _ = timeStatus(r.Context())
|
d.Done.Server, _ = timeStatus(r.Context())
|
||||||
d.Done.Server = d.Done.Server && !s.WorkHours.SavedAt.IsZero() // и рабочее время организации задано
|
d.Done.Server = d.Done.Server && !s.WorkHours.SavedAt.IsZero() // и рабочее время организации задано
|
||||||
|
def := loadWizDeferred()
|
||||||
d.Done.Modules = true
|
d.Done.Modules = true
|
||||||
for _, m := range d.Modules {
|
for i := range d.Modules {
|
||||||
if !m.Ready {
|
d.Modules[i].Deferred = !d.Modules[i].Ready && def.Modules[d.Modules[i].Key]
|
||||||
|
if !d.Modules[i].Ready {
|
||||||
d.Done.Modules = false
|
d.Done.Modules = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Главы (wizchapters.go): в пути только шаги, нужные этой установке — по лицензии и без сделанного
|
// Главы (wizchapters.go): в пути только шаги, нужные этой установке — по лицензии и без сделанного
|
||||||
// установщиком. Без ?step — первый несделанный обязательный шаг, а если всё сделано — проверка.
|
// установщиком. Без ?step — первый несделанный обязательный шаг, а если всё сделано — проверка.
|
||||||
d.Done.Users = doneUsers()
|
d.Done.Users = doneUsers()
|
||||||
_, wizUpdAvail := updateComponentRows(h.rc) // шаг 14 «Обновление»: зелёный, пока нет версии новее
|
// Выполнено ли — одно правило с плашкой на главной (wizDone), с учётом «Настроить позже».
|
||||||
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,
|
done := wizDone(r.Context(), h.rc, d.ValidataVer, d.Done.Certs || h.keyWiz.installed())
|
||||||
7: d.Done.NSD, 8: d.Done.Certs || h.keyWiz.installed(), 9: d.Done.Alerts, 10: d.Done.TestRun, 11: d.Done.Modules, 12: d.Done.Server, 13: d.Done.Users, 14: !wizUpdAvail}
|
// «отложено» показываем, только пока шаг не настроен по-настоящему
|
||||||
|
d.Deferred = map[int]bool{9: def.Steps[9] && !d.Done.Alerts, 11: def.Steps[11] && !d.Done.Modules, 13: def.Steps[13] && !d.Done.Users}
|
||||||
path, _ := wizPath(h.rc, done, 0)
|
path, _ := wizPath(h.rc, done, 0)
|
||||||
step := wizDefaultStep(path, done)
|
step := wizDefaultStep(path, done)
|
||||||
if v := r.URL.Query().Get("step"); v != "" {
|
if v := r.URL.Query().Get("step"); v != "" {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ package lkgateway
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -41,28 +40,18 @@ func setupProbes(rc *RuntimeConfig) (string, int) {
|
|||||||
return setupProbeCache.validata, setupProbeCache.certs
|
return setupProbeCache.validata, setupProbeCache.certs
|
||||||
}
|
}
|
||||||
|
|
||||||
// setupSteps — шаги мастера, которые относятся к этой установке (по лицензии), и выполнены ли они.
|
// setupSteps — шаги мастера этой установки и выполнены ли они: ровно тот путь и те же
|
||||||
|
// правила, что в мастере (wizPath + wizDone), чтобы плашка на главной не расходилась с ним.
|
||||||
func setupSteps(rc *RuntimeConfig) []SetupStep {
|
func setupSteps(rc *RuntimeConfig) []SetupStep {
|
||||||
s := rc.Snapshot()
|
|
||||||
mnp := moduleAllowed(rc, "quik-mnp")
|
|
||||||
validata, certs := setupProbes(rc)
|
validata, certs := setupProbes(rc)
|
||||||
steps := []SetupStep{
|
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||||
{1, "Лицензия", licenseStatus(rc).Valid},
|
defer cancel()
|
||||||
{2, "База bj", s.Postgres.DSN != ""},
|
done := wizDone(ctx, rc, validata, certs > 0)
|
||||||
|
path, _ := wizPath(rc, done, 0)
|
||||||
|
var steps []SetupStep
|
||||||
|
for _, n := range path {
|
||||||
|
steps = append(steps, SetupStep{n, wizStepTitles[n], done[n]})
|
||||||
}
|
}
|
||||||
if mnp {
|
|
||||||
steps = append(steps, SetupStep{3, "Учёт DEPO", strings.TrimSpace(s.Fancy.Server) != "" && s.Fancy.DepoTablesCheckOK && s.Fancy.DepoJobCheckOK})
|
|
||||||
}
|
|
||||||
steps = append(steps, SetupStep{4, "Наша организация", doneOrg(s)})
|
|
||||||
if mnp {
|
|
||||||
steps = append(steps, SetupStep{5, "QUIK МНП", doneQuik(s)})
|
|
||||||
}
|
|
||||||
steps = append(steps,
|
|
||||||
SetupStep{6, "Валидата", validata != "" || (s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != "")},
|
|
||||||
SetupStep{7, "Шлюз НРД", doneNSD(s)},
|
|
||||||
SetupStep{8, "Ключ и сертификаты", certs > 0},
|
|
||||||
SetupStep{9, "Оповещения и копии", doneAlerts(s)},
|
|
||||||
)
|
|
||||||
return steps
|
return steps
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -636,8 +636,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<p class="muted" style="font-size:13px;margin:6px 0 2px">{{.What}}</p>
|
<p class="muted" style="font-size:13px;margin:6px 0 2px">{{.What}}</p>
|
||||||
<p style="font-size:13px;margin:0;color:var({{if .Ready}}--ok{{else}}--warn{{end}})">{{if .Ready}}✓{{else}}⚠{{end}} {{.Status}}</p>
|
<p style="font-size:13px;margin:0;color:var({{if .Ready}}--ok{{else}}--warn{{end}})">{{if .Ready}}✓{{else}}⚠{{end}} {{.Status}}</p>
|
||||||
|
{{if not .Ready}}<form method="post" action="/admin/setup/wizard-defer" style="margin:8px 0 0;display:flex;gap:8px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="11"><input type="hidden" name="module" value="{{.Key}}">{{if .Deferred}}<span class="muted" style="font-size:12.5px">⏸ отложено — мастер считает модуль завершённым</span><button type="submit" name="undo" value="1" class="btn" style="padding:3px 10px;font-size:12.5px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Вернуть</button>{{else}}<button type="submit" class="btn" style="padding:3px 10px;font-size:12.5px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Настроить позже</button>{{end}}</form>{{end}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{template "wizDefer" .}}
|
||||||
{{template "wizNav" .}}
|
{{template "wizNav" .}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -647,6 +649,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h2><span class="dot {{if .Done.Alerts}}ok{{else}}warn{{end}}"></span>Оповещения и резервные копии</h2>
|
<h2><span class="dot {{if .Done.Alerts}}ok{{else}}warn{{end}}"></span>Оповещения и резервные копии</h2>
|
||||||
<p>bj напишет на почту, если НРД не отвечает, перевод застрял{{if .DepoLicensed}}, DEPO не обработал поручение{{end}} или истекает ключ, — и будет сам делать копии сервера. Настройте почтовый сервер, затем кому писать: администратору системы — о сбоях и обновлениях, отделам — о переводах и поручениях. Обмен работает и без этого, но о сбое тогда никто не узнает вовремя.</p>
|
<p>bj напишет на почту, если НРД не отвечает, перевод застрял{{if .DepoLicensed}}, DEPO не обработал поручение{{end}} или истекает ключ, — и будет сам делать копии сервера. Настройте почтовый сервер, затем кому писать: администратору системы — о сбоях и обновлениях, отделам — о переводах и поручениях. Обмен работает и без этого, но о сбое тогда никто не узнает вовремя.</p>
|
||||||
|
<div class="wiz-info" style="margin:10px 0"><span>Сейчас: почта — {{if and .Settings.Alerts.SMTP.Enabled .Settings.Alerts.SMTP.Host .Settings.Alerts.SMTP.To}}<b style="color:var(--ok)">✓ настроена</b>{{else}}<b style="color:var(--warn)">не настроена</b>{{end}}; Zabbix — {{if .Settings.Alerts.Zabbix.Enabled}}<b style="color:var(--ok)">✓ включён</b>{{else}}выключен{{end}}; резервные копии — {{if .Settings.Backup.Enabled}}<b style="color:var(--ok)">✓ включены</b>{{else}}<b style="color:var(--warn)">выключены</b>{{end}}. Шаг закрывается, когда есть оповещения (почта или Zabbix) и включены копии.</span></div>
|
||||||
<style>.wiz9 label:not(:has(input[type=checkbox])){display:block;margin:0}.wiz9 label input:not([type=checkbox]),.wiz9 label select,.wiz9 .grid input,.wiz9 .grid select{width:100%;box-sizing:border-box;margin-top:4px}</style>
|
<style>.wiz9 label:not(:has(input[type=checkbox])){display:block;margin:0}.wiz9 label input:not([type=checkbox]),.wiz9 label select,.wiz9 .grid input,.wiz9 .grid select{width:100%;box-sizing:border-box;margin-top:4px}</style>
|
||||||
<div class="wiz9">
|
<div class="wiz9">
|
||||||
{{with .Fancy}}
|
{{with .Fancy}}
|
||||||
@@ -655,6 +658,7 @@
|
|||||||
{{template "backupCard" .}}
|
{{template "backupCard" .}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
{{template "wizDefer" .}}
|
||||||
{{template "wizNav" .}}
|
{{template "wizNav" .}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -666,6 +670,7 @@
|
|||||||
<p>У каждого, кто работает с bj, — своя учётная запись: свой пароль и свои права, а в журнале видно, кто что сделал. Заведите сотрудников по ролям; права, пароли и вход через Active Directory меняются позже в разделе Настройка → Пользователи.</p>
|
<p>У каждого, кто работает с bj, — своя учётная запись: свой пароль и свои права, а в журнале видно, кто что сделал. Заведите сотрудников по ролям; права, пароли и вход через Active Directory меняются позже в разделе Настройка → Пользователи.</p>
|
||||||
{{with .Fancy}}{{template "accountsAdd" (withRet . "/admin/wizard?step=13")}}{{template "accountsAD" (withRet . "/admin/wizard?step=13")}}
|
{{with .Fancy}}{{template "accountsAdd" (withRet . "/admin/wizard?step=13")}}{{template "accountsAD" (withRet . "/admin/wizard?step=13")}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{template "wizDefer" .}}
|
||||||
{{template "wizNav" .}}
|
{{template "wizNav" .}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
{{/* Низ карточки шага мастера: «Назад» слева, «Далее» справа (несделанный обязательный шаг — «Пропустить пока»). */}}
|
{{/* Низ карточки шага мастера: «Назад» слева, «Далее» справа (несделанный обязательный шаг — «Пропустить пока»). */}}
|
||||||
|
{{/* «Настроить позже» для необязательного шага (9, 11, 13): шаг считается завершённым, вернуть можно. */}}
|
||||||
|
{{define "wizDefer"}}{{if index .Deferred .Step}}<div class="wiz-info" style="margin-top:14px;align-items:center;flex-wrap:wrap"><span>⏸ Шаг отложен — мастер считает его завершённым. Настроить можно в любой момент в «Настройке».</span>
|
||||||
|
<form method="post" action="/admin/setup/wizard-defer" style="display:inline;margin:0"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" name="undo" value="1" class="btn" style="padding:4px 10px;font-size:13px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Вернуть в мастер</button></form></div>
|
||||||
|
{{else if not .StepDone}}<form method="post" action="/admin/setup/wizard-defer" style="margin:14px 0 0;display:flex;gap:10px;align-items:center;flex-wrap:wrap"><input type="hidden" name="step" value="{{.Step}}"><button type="submit" class="btn" style="padding:6px 14px;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Настроить позже</button><span class="muted" style="font-size:13px">шаг будет считаться завершённым; вернуться можно в любой момент</span></form>{{end}}{{end}}
|
||||||
|
|
||||||
{{define "wizNav"}}
|
{{define "wizNav"}}
|
||||||
<div class="wiz-nav">
|
<div class="wiz-nav">
|
||||||
{{if .Prev}}<a href="/admin/wizard?step={{.Prev}}" class="wiz-back">← Назад</a>{{else}}<span></span>{{end}}
|
{{if .Prev}}<a href="/admin/wizard?step={{.Prev}}" class="wiz-back">← Назад</a>{{else}}<span></span>{{end}}
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ func wizDefaultStep(path []int, done map[int]bool) int {
|
|||||||
type WizModule struct {
|
type WizModule struct {
|
||||||
Key, Title, What, Status, Link string
|
Key, Title, What, Status, Link string
|
||||||
Ready bool
|
Ready bool
|
||||||
|
Deferred bool // «Настроить позже»: мастер считает модуль завершённым
|
||||||
}
|
}
|
||||||
|
|
||||||
// wizModuleViews — модули этой лицензии (без лицензии модуля в мастере нет).
|
// wizModuleViews — модули этой лицензии (без лицензии модуля в мастере нет).
|
||||||
|
|||||||
@@ -0,0 +1,141 @@
|
|||||||
|
package lkgateway
|
||||||
|
|
||||||
|
// wizdefer.go — «Настроить позже» в мастере: необязательные шаги (модули, оповещения,
|
||||||
|
// учётные записи) и отдельные модули можно отложить — мастер считает их завершёнными
|
||||||
|
// и не держит главу «Запуск» незакрытой. Как только настроено по-настоящему, отметка
|
||||||
|
// не нужна: готовность всё равно считается из настроек. Отметку можно снять.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const wizDeferredFile = "/var/lib/bj/.bj/wizard-deferred.json"
|
||||||
|
|
||||||
|
// wizDeferrable — шаги, которые можно отложить (необязательные для обмена с НРД).
|
||||||
|
var wizDeferrable = map[int]bool{9: true, 11: true, 13: true}
|
||||||
|
|
||||||
|
type wizDeferred struct {
|
||||||
|
Steps map[int]bool `json:"steps,omitempty"`
|
||||||
|
Modules map[string]bool `json:"modules,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var wizDeferredMu sync.Mutex
|
||||||
|
|
||||||
|
func loadWizDeferred() wizDeferred {
|
||||||
|
wizDeferredMu.Lock()
|
||||||
|
defer wizDeferredMu.Unlock()
|
||||||
|
return readWizDeferred()
|
||||||
|
}
|
||||||
|
|
||||||
|
func readWizDeferred() wizDeferred {
|
||||||
|
var d wizDeferred
|
||||||
|
if b, err := os.ReadFile(wizDeferredFile); err == nil {
|
||||||
|
_ = json.Unmarshal(b, &d)
|
||||||
|
}
|
||||||
|
if d.Steps == nil {
|
||||||
|
d.Steps = map[int]bool{}
|
||||||
|
}
|
||||||
|
if d.Modules == nil {
|
||||||
|
d.Modules = map[string]bool{}
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateWizDeferred(mut func(*wizDeferred)) error {
|
||||||
|
wizDeferredMu.Lock()
|
||||||
|
defer wizDeferredMu.Unlock()
|
||||||
|
d := readWizDeferred()
|
||||||
|
mut(&d)
|
||||||
|
b, err := json.MarshalIndent(&d, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tmp := wizDeferredFile + ".tmp"
|
||||||
|
if err := os.WriteFile(tmp, b, 0o640); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return os.Rename(tmp, wizDeferredFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
// registerWizDefer — POST /admin/setup/wizard-defer: step=N [module=key] [undo=1].
|
||||||
|
func registerWizDefer(mux *http.ServeMux) {
|
||||||
|
mux.HandleFunc("/admin/setup/wizard-defer", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.Method != http.MethodPost {
|
||||||
|
http.Error(w, "method", http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_ = r.ParseForm()
|
||||||
|
step, _ := strconv.Atoi(r.FormValue("step"))
|
||||||
|
module := strings.TrimSpace(r.FormValue("module"))
|
||||||
|
undo := r.FormValue("undo") == "1"
|
||||||
|
if !wizDeferrable[step] {
|
||||||
|
http.Error(w, "этот шаг нельзя отложить", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if module != "" && !moduleKnown(module) {
|
||||||
|
http.Error(w, "неизвестный модуль", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_ = updateWizDeferred(func(d *wizDeferred) {
|
||||||
|
switch {
|
||||||
|
case module != "" && undo:
|
||||||
|
delete(d.Modules, module)
|
||||||
|
case module != "":
|
||||||
|
d.Modules[module] = true
|
||||||
|
case undo:
|
||||||
|
delete(d.Steps, step)
|
||||||
|
default:
|
||||||
|
d.Steps[step] = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
http.Redirect(w, r, "/admin/wizard?step="+strconv.Itoa(step), http.StatusSeeOther)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func moduleKnown(key string) bool {
|
||||||
|
for _, m := range wizModules {
|
||||||
|
if m == key {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// wizDone — выполнены ли шаги мастера. Одно правило для мастера и плашки «Требуется
|
||||||
|
// настройка» на главной: тот же путь (лицензия, автоматика) и те же отметки «отложено».
|
||||||
|
// validata — версия «Валидаты» ("" — нет), certsDone — ключ организации подключён.
|
||||||
|
func wizDone(ctx context.Context, rc *RuntimeConfig, validata string, certsDone bool) map[int]bool {
|
||||||
|
s := rc.Snapshot()
|
||||||
|
def := loadWizDeferred()
|
||||||
|
mnp := moduleAllowed(rc, "quik-mnp")
|
||||||
|
srv, _ := timeStatus(ctx)
|
||||||
|
_, upd := updateComponentRows(rc)
|
||||||
|
mods := true
|
||||||
|
for _, m := range wizModuleViews(rc, s) {
|
||||||
|
if !m.Ready && !def.Modules[m.Key] {
|
||||||
|
mods = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map[int]bool{
|
||||||
|
1: licenseStatus(rc).Valid,
|
||||||
|
2: s.Postgres.DSN != "",
|
||||||
|
3: !mnp || (strings.TrimSpace(s.Fancy.Server) != "" && s.Fancy.DepoTablesCheckOK && s.Fancy.DepoJobCheckOK),
|
||||||
|
4: doneOrg(s),
|
||||||
|
5: !mnp || doneQuik(s),
|
||||||
|
6: validata != "" || (s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != ""),
|
||||||
|
7: doneNSD(s),
|
||||||
|
8: certsDone,
|
||||||
|
9: doneAlerts(s) || def.Steps[9],
|
||||||
|
10: s.LastTest != nil || (!devMode(rc) && readinessDone()),
|
||||||
|
11: mods || def.Steps[11],
|
||||||
|
12: srv && !s.WorkHours.SavedAt.IsZero(),
|
||||||
|
13: doneUsers() || def.Steps[13],
|
||||||
|
14: !upd,
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user