Версии систем: общий список в «Обзоре» и строка в разделе каждого модуля
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:
@@ -0,0 +1,62 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user