Экспорт 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
+3 -1
View File
@@ -5,6 +5,7 @@
// этот инструмент. Проверка и установка — release.InstallStaged: подпись манифеста ключом из
// /etc/bj/update.pub (принадлежит root), sha256 файлов, только известные компоненты, без отката,
// копия прежнего файла, перезапуск служб (ядро последним), записи в /var/lib/bj/.bj/components.json.
// Выделенным из ядра модулям, которые ставятся впервые, ставит и включает unit-файл службы из комплекта.
// Вывод — JSON для bj-server.
//
// bj-component-install <каталог подготовки>
@@ -17,6 +18,7 @@ import (
"fmt"
"os"
"git.zetit.ru/zuevav/Bridge-and-Join-s/deploy"
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/release"
)
@@ -30,7 +32,7 @@ func main() {
if pub, err := release.LoadPublicKey(*pubPath); err != nil {
res.Error = fmt.Sprintf("открытый ключ обновлений (%s): %v", *pubPath, err)
} else {
res = release.InstallStaged(fs.Arg(0), release.InstallOptions{Root: *root, PubKey: pub, Restart: !*noRestart})
res = release.InstallStaged(fs.Arg(0), release.InstallOptions{Root: *root, PubKey: pub, Restart: !*noRestart, Units: deploy.Files})
}
b, _ := json.Marshal(res)
fmt.Println(string(b))
+49
View File
@@ -0,0 +1,49 @@
// Command bj-quikexport — служба модуля «Экспорт биржевой информации» (modules/quikexport):
// управление ARQA quikexport, обновляется независимо от ядра bj.
//
// Слушает только локальный адрес: раздел настроек показывает bj-server, который проверяет вход,
// права и лицензию и передаёт запросы со служебным ключом. Привилегированные операции
// (установка файлов в каталог экспортёра, служба, база) идут через root-воркер bj-keymedia-worker.
//
// bj-quikexport [-addr 127.0.0.1:8084] [-store /var/lib/bj/.bj/quik-export/settings.json]
// [-setup /var/lib/bj/.bj/setup.json] [-key /var/lib/bj/.bj/module.key]
// bj-quikexport -version
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"time"
"git.zetit.ru/zuevav/Bridge-and-Join-s/modules/quikexport"
)
// version — версия модуля (go build -ldflags "-X main.version=…").
var version = "0.1.0"
func main() {
addr := flag.String("addr", "127.0.0.1:8084", "адрес службы (только локальный)")
store := flag.String("store", "/var/lib/bj/.bj/quik-export/settings.json", "настройки модуля")
setup := flag.String("setup", "/var/lib/bj/.bj/setup.json", "настройки bj (перенос раздела quik_export при первом запуске)")
key := flag.String("key", "/var/lib/bj/.bj/module.key", "служебный ключ модулей (создаёт bj-server)")
showVersion := flag.Bool("version", false, "показать версию")
flag.Parse()
if *showVersion {
fmt.Println("bj-quikexport", version)
return
}
srv, err := quikexport.New(quikexport.Config{StorePath: *store, SetupPath: *setup, KeyPath: *key})
if err != nil {
log.Fatalf("bj-quikexport: %v", err)
}
log.Printf("bj-quikexport %s: слушаю %s", version, *addr)
// WriteTimeout не задаём: применение настроек ждёт root-воркер до нескольких минут.
hs := &http.Server{Addr: *addr, Handler: srv.Handler(), ReadHeaderTimeout: 10 * time.Second}
if err := hs.ListenAndServe(); err != nil {
log.Printf("bj-quikexport: %v", err)
os.Exit(1)
}
}