Экспорт QUIK — отдельная служба bj-quikexport; модули, выделенные из ядра, ставятся с обновлением

bj-quikexport (modules/quikexport + cmd/bj-quikexport, 127.0.0.1:8084): управление ARQA
quikexport перенесено из bj-server. Настройки у службы в /var/lib/bj/.bj/quik-export/settings.json
(при первом запуске переносятся из setup.json), раздел отдаётся фрагментом с индикатором меню,
действия отвечают X-BJ-Flash. bj-server встраивает раздел в «Настройку», проксирует формы
/admin/setup/quikexport/… и передаёт лицензию (X-BJ-Licensed). Общая проверка служебного
ключа — modules/modkit (им пользуется и bj-npr), общее для прокси — lkgateway/modules.go.

Выделенные из ядра модули (bj-npr, bj-quikexport: Component.FromCore) при обновлении ставятся и
там, где их ещё нет, если входят в лицензию: release.MarkSplitModules, request.json "new",
root-установщик ставит и включает unit-файл из комплекта. Если в обновлении меняется сам
установщик, модули ставятся после перезапуска bj-server (ensureSplitModules).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-16 01:15:27 +03:00
parent 5527a464ca
commit 97e99b72c7
26 changed files with 1095 additions and 303 deletions
+21
View File
@@ -64,3 +64,24 @@ func TestPlanIndependentVersions(t *testing.T) {
t.Fatalf("откат на 0.9.0 не должен предлагаться: %+v", s)
}
}
func TestSplitModulesInstalledWithCore(t *testing.T) {
root := t.TempDir()
writeComp(t, root, "bj-server", "core")
m := &Manifest{Version: "2026.09.2", Artifacts: []Artifact{
{Name: "bj-npr", Version: "0.1.0", SHA256: "n"},
{Name: "bj-quikexport", Version: "0.1.0", SHA256: "q"},
{Name: "bj-lk", Version: "0.2.0", SHA256: "l"},
}}
st := Plan(root, m, nil, "2.0.0")
MarkSplitModules(st, func(f string) bool { return f == "npr" || f == "web-cabinet" })
if s := state(st, "bj-npr"); !s.Update || !s.New {
t.Fatalf("выделенный из ядра модуль по лицензии должен ставиться: %+v", s)
}
if s := state(st, "bj-quikexport"); s.Update || s.New {
t.Fatalf("модуль без лицензии не ставится: %+v", s)
}
if s := state(st, "bj-lk"); s.Update || s.New {
t.Fatalf("самостоятельный модуль обновлением не ставится: %+v", s)
}
}