58d402e6fa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
74 lines
2.7 KiB
Go
74 lines
2.7 KiB
Go
package lkgateway
|
|
|
|
// Шаги настройки — одни и те же для мастера и дашборда: дашборд пишет «Требуется настройка — N из M»
|
|
// ровно по шагам мастера (с учётом лицензии), а не по отдельному списку проверок.
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/cryptocli"
|
|
)
|
|
|
|
type SetupStep struct {
|
|
Step int
|
|
Title string
|
|
Done bool
|
|
}
|
|
|
|
var setupProbeCache = struct {
|
|
sync.Mutex
|
|
at time.Time
|
|
validata string
|
|
certs int
|
|
}{}
|
|
|
|
// setupProbes — версия Валидаты и число сертификатов (внешние вызовы) с кэшем на минуту.
|
|
func setupProbes(rc *RuntimeConfig) (string, int) {
|
|
setupProbeCache.Lock()
|
|
defer setupProbeCache.Unlock()
|
|
if time.Since(setupProbeCache.at) < time.Minute {
|
|
return setupProbeCache.validata, setupProbeCache.certs
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second)
|
|
defer cancel()
|
|
setupProbeCache.validata, _, _ = validataVersion(ctx)
|
|
setupProbeCache.certs = 0
|
|
s := rc.Snapshot()
|
|
if s.Crypto.Provider != "" && s.Crypto.Provider != "stub" {
|
|
cli := cryptocli.New(cryptocli.Config{Provider: cryptocli.Provider(s.Crypto.Provider), SocketPath: s.Crypto.SocketPath, ModulePath: s.Crypto.ModulePath})
|
|
if certs, err := cli.FindCertificates(ctx); err == nil {
|
|
setupProbeCache.certs = len(certs)
|
|
}
|
|
cli.Close()
|
|
}
|
|
setupProbeCache.at = time.Now()
|
|
return setupProbeCache.validata, setupProbeCache.certs
|
|
}
|
|
|
|
// setupSteps — шаги мастера, которые относятся к этой установке (по лицензии), и выполнены ли они.
|
|
func setupSteps(rc *RuntimeConfig) []SetupStep {
|
|
s := rc.Snapshot()
|
|
mnp := moduleAllowed(rc, "quik-mnp")
|
|
validata, certs := setupProbes(rc)
|
|
steps := []SetupStep{
|
|
{1, "Лицензия", licenseStatus(rc).Valid},
|
|
{2, "База bj", s.Postgres.DSN != ""},
|
|
}
|
|
if mnp {
|
|
steps = append(steps, SetupStep{3, "Учёт DEPO", strings.TrimSpace(s.Fancy.Server) != "" && s.Fancy.DepoTablesCheckOK && s.Fancy.DepoJobCheckOK})
|
|
}
|
|
steps = append(steps, SetupStep{4, "Наша организация", orgCode(s) != "" && orgINN(s) != ""})
|
|
if mnp {
|
|
steps = append(steps, SetupStep{5, "QUIK МНП", s.Quik.Verified})
|
|
}
|
|
steps = append(steps,
|
|
SetupStep{6, "Валидата", validata != "" || (s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != "")},
|
|
SetupStep{7, "Сертификаты", certs > 0},
|
|
SetupStep{8, "Шлюз НРД", s.NSD.IGWBaseURL != "" && s.NSD.Profile != ""},
|
|
)
|
|
return steps
|
|
}
|