Мастер, шаг 3 DEPO: подключение → трансферные таблицы → обработка (job); по умолчанию джобу SQL Agent создаёт bj разовым логином администратора

- редакция SQL Server определяется (Express/PostgreSQL — обработку запускает bj);
- создание джобы и таблиц — логином администратора, который не сохраняется;
- настройки обмена с DEPO открыты без пароля перспективных модулей, если QUIK МНП в лицензии.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-24 22:11:42 +03:00
parent 775b4214b6
commit e043e7c371
5 changed files with 123 additions and 11 deletions
+37 -1
View File
@@ -170,6 +170,11 @@ type WizardData struct {
Lic LicenseStatus
DepoLicensed bool
DepoDB string
DepoTables DepoTablesView
DepoJob DepoJobView
DepoEdition string // редакция SQL Server клиента (пусто — не определена)
DepoAgent bool // у SQL Server есть SQL Agent (не Express, не PostgreSQL)
DepoJobDef string // способ обработки по умолчанию для мастера
ValidataVer string // версия установленной «Валидаты Клиент L» (пусто — не установлена)
CryptoSvc string // состояние службы bj-crypto (systemctl is-active)
PGSummary string // куда подключена база bj, без пароля
@@ -208,7 +213,10 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
d.Done.License = d.Lic.Valid
d.DepoLicensed = moduleAllowed(h.rc, "quik-mnp")
d.DepoDB = s.Fancy.DepoDB()
d.Done.Depo = strings.TrimSpace(s.Fancy.Server) != "" || !d.DepoLicensed
d.DepoTables = depoTablesView(s.Fancy)
d.DepoJob = depoJobView(s.Fancy)
// Шаг 3 выполнен, когда есть подключение, трансферные таблицы и работающая обработка (job).
d.Done.Depo = !d.DepoLicensed || (strings.TrimSpace(s.Fancy.Server) != "" && s.Fancy.DepoTablesCheckOK && s.Fancy.DepoJobCheckOK)
d.Done.Postgres = s.Postgres.DSN != ""
{
ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second)
@@ -256,6 +264,19 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
step = 7
}
d.Step = step
if step == 3 && d.DepoLicensed && strings.TrimSpace(s.Fancy.Server) != "" {
// Есть ли у сервера SQL Agent: у Express его нет, у PostgreSQL — тоже; тогда обработку
// запускает сам bj. Иначе по умолчанию джобу SQL Agent создаёт bj.
d.DepoJobDef = "bj"
if !s.Fancy.IsPostgres() {
ctx, cancel := context.WithTimeout(r.Context(), 4*time.Second)
d.DepoEdition, d.DepoAgent = depoServerEdition(ctx, s.Fancy)
cancel()
if d.DepoAgent || d.DepoEdition == "" {
d.DepoJobDef = "sql-auto"
}
}
}
if step == 1 && d.Done.License {
// Образ ставит ядро той версии, с которой собран; всё, что вышло позже (исправления ядра,
// установщика и служб), приезжает обновлением — предлагаем его сразу после ввода ключа.
@@ -268,6 +289,21 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) {
render(w, h.tpl.a.wizard, d)
}
// depoServerEdition — редакция SQL Server и есть ли у неё SQL Agent (EngineEdition 4 — Express).
func depoServerEdition(ctx context.Context, f FancyMSSQLSettings) (string, bool) {
db, err := fancyOpen(f, "master")
if err != nil {
return "", false
}
defer db.Close()
var eng int
var ed string
if err := db.QueryRowContext(ctx, "SELECT CAST(SERVERPROPERTY('EngineEdition') AS int), CAST(SERVERPROPERTY('Edition') AS nvarchar(128))").Scan(&eng, &ed); err != nil {
return "", false
}
return ed, eng != 4
}
// wizardProgressFile — номер последнего пройденного шага мастера (переход «Далее» на шаг N
// означает, что шаги до N пройдены).
const wizardProgressFile = "/var/lib/bj/.bj/wizard-progress"