inventory-app/pkg/agent/agent.go
2023-01-25 14:25:58 +03:00

158 lines
3.0 KiB
Go

// Copyright 2022 Listware
package agent
import (
"context"
"strings"
"git.fg-tech.ru/listware/go-core/pkg/executor"
"git.fg-tech.ru/listware/go-core/pkg/module"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/baseboard"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/bios"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/cpu"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/mem"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/netlink"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/node"
"git.fg-tech.ru/listware/inventory-app/pkg/agent/types/os"
proxy "git.fg-tech.ru/listware/proxy/pkg/module"
"github.com/sirupsen/logrus"
)
var (
log = logrus.New()
)
type Agent struct {
ctx context.Context
cancel context.CancelFunc
// init values
baseboard baseboard.Baseboard
bios bios.BIOS
cpu cpu.CPU
node node.Node
os os.OS
dimmDevs map[string]mem.MemoryDevice
links map[string]netlink.Netlink
executor executor.Executor
m module.Module
}
// Run agent
func Run() (err error) {
a := &Agent{}
a.ctx, a.cancel = context.WithCancel(context.Background())
if a.executor, err = executor.New(); err != nil {
return
}
if a.baseboard, err = baseboard.New(); err != nil {
return
}
if a.bios, err = bios.New(); err != nil {
return
}
if a.cpu, err = cpu.New(); err != nil {
return
}
if a.node, err = node.New(); err != nil {
return
}
if a.os, err = os.New(); err != nil {
return
}
if a.dimmDevs, err = mem.Inventory(); err != nil {
return
}
if a.links, err = netlink.New(); err != nil {
return
}
return a.run()
}
func appendPath(paths ...string) string {
return strings.Join(paths, ".")
}
func (a *Agent) hostname() string {
return a.node.Hostname
}
func (a *Agent) nodepath() string {
return appendPath(a.hostname(), types.NodeContainerPath)
}
func (a *Agent) baseboardpath() string {
return appendPath(types.BaseboardLink, a.nodepath())
}
func (a *Agent) biospath() string {
return appendPath(types.BiosLink, a.nodepath())
}
func (a *Agent) cpupath() string {
return appendPath(types.CpuLink, a.nodepath())
}
func (a *Agent) ospath() string {
return appendPath(types.OsLink, a.nodepath())
}
func (a *Agent) dimmpath(dev string) string {
return appendPath(dev, a.nodepath())
}
func (a *Agent) dimmspath() string {
return appendPath(memMask, a.nodepath())
}
func (a *Agent) netlinkpath(os string) string {
return appendPath(os, a.nodepath())
}
func (a *Agent) netlinkspath() string {
return appendPath(netlinkMask, a.nodepath())
}
func (a *Agent) run() (err error) {
defer a.executor.Close()
log.Infof("run system agent")
a.osSignalCtrl()
a.m = proxy.New(namespace, module.WithPort(8181))
if err = a.m.Bind(types.FunctionPath, a.workerFunction); err != nil {
return
}
// // TODO move to another app
// if err = a.m.Bind("monit", monit.Monit); err != nil {
// return
// }
go a.m.RegisterAndListen(a.ctx)
if err = a.entrypoint(); err != nil {
return
}
<-a.ctx.Done()
return nil
}