Версии систем: общий список в «Обзоре» и строка в разделе каждого модуля

bj собирает версии своих компонентов и внешних систем (в фоне, кэш 10 минут, прогрев при старте):
ядро и модули bj (components.json или «-version»), экспортёр ARQA (служба bj-quikexport, /version),
криптосервис (Health), «Валидата CSP» (zpki1utl), Java, ИШ НРД (deps.json + сайт НРД),
МНП QUIK (VersionInfo), DEPO (OD_DATA_VERSION), PostgreSQL, ОС. «Настройка → Обзор» — таблица
«Версии систем» с кнопкой «Обновить сведения»; в разделах БД, Fancy, QUIK МНП, Экспорт QUIK,
Криптография, НРД, ЛК, НПР и Обновления — строка с версией. В таблице обновлений у компонентов,
выложенных вручную, вместо «неизвестна» — версия самого компонента. bj-component-install: -version.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-16 12:00:00 +03:00
parent 6fee3c5ff7
commit 7c653a2490
15 changed files with 523 additions and 3 deletions
+8 -1
View File
@@ -7,7 +7,8 @@ package quikexport
// в заголовке X-BJ-Indicator — цвет индикатора меню (ok | warn | err | пусто);
// - POST /admin/setup/quikexport[/keys|apply|import|service|dbinit] — действие; итог — 204
// с сообщением в X-BJ-Flash, bj-server показывает его как обычное сообщение страницы настроек;
// - GET /admin/setup/quikexport/sql и /preview — файлы как есть.
// - GET /admin/setup/quikexport/sql и /preview — файлы как есть;
// - GET /version — версии модуля и экспортёра ARQA (JSON) для общего списка версий bj.
//
// Лицензию проверяет bj-server и передаёт в X-BJ-Licensed: 1.
@@ -38,6 +39,7 @@ type Config struct {
StorePath string // собственные настройки модуля
SetupPath string // setup.json bj: отсюда настройки переносятся при первом запуске (раздел quik_export)
KeyPath string // служебный ключ модулей
Version string // версия модуля bj-quikexport
}
// Server — служба модуля.
@@ -77,6 +79,7 @@ func (srv *Server) Handler() http.Handler {
mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte("ok")) })
mux.HandleFunc("/section", func(w http.ResponseWriter, r *http.Request) {
v := quikExportView(srv.store, licensed(r), r.URL.Query().Get("reveal_ro") == "1")
v.ModuleVersion, v.ExporterVersion = srv.cfg.Version, exporterVersion(v.S.Dir)
var buf bytes.Buffer
if err := srv.section.ExecuteTemplate(&buf, "section", v); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -87,6 +90,10 @@ func (srv *Server) Handler() http.Handler {
w.Header().Set("X-BJ-Indicator", indicator(v))
_, _ = w.Write(buf.Bytes())
})
mux.HandleFunc("/version", func(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]string{"module": srv.cfg.Version, "exporter": exporterVersion(srv.store.Get().Dir)})
})
mux.HandleFunc("/admin/setup/quikexport", srv.saveQuikExport)
mux.HandleFunc("/admin/setup/quikexport/keys", srv.uploadQuikExportKeys)
mux.HandleFunc("/admin/setup/quikexport/apply", srv.applyQuikExport)