Files
zuevav 7c653a2490 Версии систем: общий список в «Обзоре» и строка в разделе каждого модуля
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>
2026-09-16 12:00:00 +03:00

63 lines
1.7 KiB
Go

package quikexport
// Версия экспортёра ARQA: строка вида 12.1.5.2 внутри программы export. Кандидат сверяется с версией
// установщика из .actions.log (install_quikexport-12.1.5.run), чтобы не принять чужую версию библиотеки.
import (
"bytes"
"os"
"path/filepath"
"regexp"
"sync"
"time"
)
var (
exporterVerRe = regexp.MustCompile(`^\d{1,3}\.\d+\.\d+\.\d+$`)
exporterInstallerRe = regexp.MustCompile(`install_quikexport-(\d+\.\d+\.\d+)\.run`)
)
var exporterVerCache struct {
sync.Mutex
path string
mod time.Time
ver string
}
// exporterVersion — версия ARQA quikexport в каталоге dir ("" — не определена).
func exporterVersion(dir string) string {
bin := filepath.Join(dir, "export")
fi, err := os.Stat(bin)
if err != nil {
return ""
}
exporterVerCache.Lock()
defer exporterVerCache.Unlock()
if exporterVerCache.path == bin && exporterVerCache.mod.Equal(fi.ModTime()) {
return exporterVerCache.ver
}
installer := ""
if log, err := os.ReadFile(filepath.Join(dir, ".actions.log")); err == nil {
if m := exporterInstallerRe.FindAllSubmatch(log, -1); len(m) > 0 {
installer = string(m[len(m)-1][1])
}
}
ver := ""
if b, err := os.ReadFile(bin); err == nil {
for _, tok := range bytes.Split(b, []byte{0}) {
if len(tok) > 20 || !exporterVerRe.Match(tok) {
continue
}
if installer == "" || bytes.HasPrefix(tok, []byte(installer+".")) {
ver = string(tok)
break
}
}
}
if ver == "" {
ver = installer
}
exporterVerCache.path, exporterVerCache.mod, exporterVerCache.ver = bin, fi.ModTime(), ver
return ver
}