package lexicomai import ( "fmt" "sync" "sync/atomic" "time" ) // InstallSession — описатель одной запущенной (или завершённой) установки. // Хранится в Manager, чтобы клиент мог опросить статус по id. type InstallSession struct { ID string Target string // alias машины Product string Branch string Version string File string // имя дистрибутива LogFile string // путь к логу установки на машине Started time.Time } // installSessions — потокобезопасный реестр установок. type installSessions struct { mu sync.Mutex list map[string]*InstallSession seq atomic.Int64 } func newInstallSessions() *installSessions { return &installSessions{list: make(map[string]*InstallSession)} } // add создаёт и регистрирует новую сессию; возвращает её с присвоенным id. func (s *installSessions) add(target, product, branch, version, file, logFile string) *InstallSession { n := s.seq.Add(1) id := fmt.Sprintf("i%d-%d", time.Now().UnixNano(), n) sess := &InstallSession{ ID: id, Target: target, Product: product, Branch: branch, Version: version, File: file, LogFile: logFile, Started: time.Now(), } s.mu.Lock() defer s.mu.Unlock() s.list[id] = sess return sess } // get возвращает сессию по id. func (s *installSessions) get(id string) (*InstallSession, bool) { s.mu.Lock() defer s.mu.Unlock() sess, ok := s.list[id] return sess, ok }