61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
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
|
|
}
|