From 76fe95400c82aaa5a2f1cd7e51bbd7b0946dc991 Mon Sep 17 00:00:00 2001 From: lorsan Date: Mon, 13 Apr 2026 20:53:40 +0300 Subject: [PATCH] create system register agent id --- cmd/agent/main.go | 5 +- internal/agent/app/app.go | 24 +++++-- internal/agent/service/agent_service/agent.go | 13 ++-- internal/agent/utils/config_yaml/config.go | 3 +- internal/agent/utils/settings/settings.go | 68 +++++++++++++++++++ .../{agent/domain/agent.go => domain/info.go} | 0 6 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 internal/agent/utils/settings/settings.go rename internal/{agent/domain/agent.go => domain/info.go} (100%) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 9370bec..67febdd 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -3,6 +3,9 @@ package main import "github.com/lorsanstand/HomeOps-Hub/internal/agent/app" func main() { - start := app.NewApp() + start, err := app.NewApp() + if err != nil { + return + } start.Run() } diff --git a/internal/agent/app/app.go b/internal/agent/app/app.go index d87f5c8..a588b6d 100644 --- a/internal/agent/app/app.go +++ b/internal/agent/app/app.go @@ -10,6 +10,7 @@ import ( "github.com/lorsanstand/HomeOps-Hub/internal/agent/service/collector" "github.com/lorsanstand/HomeOps-Hub/internal/agent/service/docker_service" "github.com/lorsanstand/HomeOps-Hub/internal/agent/utils/config_yaml" + "github.com/lorsanstand/HomeOps-Hub/internal/agent/utils/settings" log2 "github.com/lorsanstand/HomeOps-Hub/internal/shared/log" "github.com/rs/zerolog" "google.golang.org/grpc" @@ -17,21 +18,30 @@ import ( ) type App struct { - log zerolog.Logger - cfg *config_yaml.AgentConfig - hubConn *rpc.Connection + log zerolog.Logger + cfg *config_yaml.AgentConfig + settings *settings.Settings + hubConn *rpc.Connection } -func NewApp() *App { +func NewApp() (*App, error) { cfg, err := config_yaml.NewConfig() if err != nil { - standartlog.Fatalf("failed get config: %v", err) + standartlog.Fatalf("failed to get config: %v", err) + return nil, err } log := log2.NewLogger(cfg) + log = log.With().Str("component", "agent.app").Logger() - return &App{cfg: cfg, log: log} + sett, err := settings.ReadSettings(cfg.SettingsPath) + if err != nil { + log.Error().Err(err).Msg("failed to get settings") + return nil, err + } + + return &App{cfg: cfg, log: log, settings: sett}, nil } func (a *App) Run() { @@ -58,6 +68,6 @@ func (a *App) Run() { collect := collector.NewCollector(DockerService, a.log) - agent := agent_service.NewAgentService(collect, conn, "", a.cfg, a.log) + agent := agent_service.NewAgentService(collect, conn, a.settings, a.cfg, a.log) agent.RegisterAgentConn(ctx) } diff --git a/internal/agent/service/agent_service/agent.go b/internal/agent/service/agent_service/agent.go index 2f28a1c..31f89a9 100644 --- a/internal/agent/service/agent_service/agent.go +++ b/internal/agent/service/agent_service/agent.go @@ -6,6 +6,7 @@ import ( "github.com/lorsanstand/HomeOps-Hub/internal/agent/domain" "github.com/lorsanstand/HomeOps-Hub/internal/agent/utils/config_yaml" + "github.com/lorsanstand/HomeOps-Hub/internal/agent/utils/settings" "github.com/rs/zerolog" ) @@ -23,24 +24,24 @@ type AgentService struct { log zerolog.Logger cfg *config_yaml.AgentConfig heartBeat int - agentID string + settings *settings.Settings } func NewAgentService( collector Collector, conn HubConnection, - AgentID string, + settings *settings.Settings, cfg *config_yaml.AgentConfig, logger zerolog.Logger, ) *AgentService { logger = logger.With().Str("component", "agent.service.agent_serivce").Logger() - return &AgentService{collect: collector, conn: conn, cfg: cfg, log: logger, agentID: AgentID} + return &AgentService{collect: collector, conn: conn, cfg: cfg, log: logger, settings: settings} } func (a *AgentService) RegisterAgentConn(ctx context.Context) { info, caps := a.collect.GatherInfoSystem() - AgentID := a.agentID + AgentID := a.settings.AgentID AgentName := a.cfg.AppName AgentData := domain.RegisterAgentData{AgentId: AgentID, AgentName: AgentName, Host: info, Capabilities: caps} @@ -49,5 +50,9 @@ func (a *AgentService) RegisterAgentConn(ctx context.Context) { a.log.Error().Err(err).Msg("failed register agent") return } + + if err = a.settings.Insert(settings.Settings{AgentID: data.AgentID}); err != nil { + a.log.Warn().Err(err).Msg("failed to save agent id") + } fmt.Println(data) } diff --git a/internal/agent/utils/config_yaml/config.go b/internal/agent/utils/config_yaml/config.go index 6bccab3..9d24106 100644 --- a/internal/agent/utils/config_yaml/config.go +++ b/internal/agent/utils/config_yaml/config.go @@ -14,7 +14,8 @@ type AgentConfig struct { Host string `yaml:"host"` Port int `yaml:"port"` } `yaml:"hub"` - LogLevel string `yaml:"log_level"` + LogLevel string `yaml:"log_level"` + SettingsPath string `yaml:"settings_path"` } func NewConfig() (*AgentConfig, error) { diff --git a/internal/agent/utils/settings/settings.go b/internal/agent/utils/settings/settings.go new file mode 100644 index 0000000..9be1cb0 --- /dev/null +++ b/internal/agent/utils/settings/settings.go @@ -0,0 +1,68 @@ +package settings + +import ( + "encoding/json" + "errors" + "io" + "os" + "path/filepath" +) + +type Settings struct { + AgentID string `json:"agent_id"` + path string +} + +func ReadSettings(path string) (*Settings, error) { + if path == "" { + homeDir, err := os.UserHomeDir() + if err != nil { + return nil, err + } + path = filepath.Join(homeDir, ".config", "homeops") + } + + err := os.Mkdir(path, 0755) + if err != nil { + if !errors.Is(err, os.ErrExist) { + return nil, err + } + err = nil + } + + file, err := os.Create(path + "/settings.json") + if err != nil { + if !errors.Is(err, os.ErrExist) { + return nil, err + } + err = nil + } + defer file.Close() + + var settings Settings + + err = json.NewDecoder(file).Decode(&settings) + if err != nil { + if !errors.Is(err, io.EOF) { + return nil, err + } + } + + settings.path = path + "/settings.json" + + return &settings, nil +} + +func (s *Settings) Insert(sett Settings) error { + file, err := os.OpenFile(s.path, os.O_RDWR, 0755) + if err != nil { + return err + } + defer file.Close() + + if err = json.NewEncoder(file).Encode(sett); err != nil { + return err + } + + return nil +} diff --git a/internal/agent/domain/agent.go b/internal/domain/info.go similarity index 100% rename from internal/agent/domain/agent.go rename to internal/domain/info.go