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>
63 lines
1.7 KiB
Go
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
|
|
}
|