package main import ( "context" "flag" "log/slog" "os" "os/signal" "path/filepath" "syscall" "github.com/monlet/agent/internal/agentkey" "github.com/monlet/agent/internal/app" "github.com/monlet/agent/internal/client" "github.com/monlet/agent/internal/config" "github.com/monlet/agent/internal/ids" "github.com/monlet/agent/internal/metrics" "github.com/monlet/agent/internal/spool" ) var version = "0.1.0" func main() { cfgPath := flag.String("config", "config.toml", "path to TOML config") flag.Parse() log := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelInfo})) cfg, err := config.Load(*cfgPath) if err != nil { log.Error("load config", "err", err) os.Exit(1) } agentID, err := ids.ResolveAgentID(cfg.AgentID, cfg.Hostname) if err != nil { log.Error("agent_id", "err", err) os.Exit(1) } sp, err := spool.Open(filepath.Join(cfg.StateDir, "spool"), spool.DefaultMaxEvents, spool.DefaultMaxBytes) if err != nil { log.Error("open spool", "err", err) os.Exit(1) } key := "" if cfg.PushesToServer() { key, err = agentkey.LoadOrCreate(cfg.StateDir) if err != nil { log.Error("agent key", "err", err) os.Exit(1) } } a := &app.App{ Cfg: cfg, AgentID: agentID, Version: version, Client: client.New(cfg.Server.URL, key, agentID), Spool: sp, Metrics: metrics.New(), Log: log, } ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() log.Info("monlet-agent starting", "agent_id", agentID, "version", version, "checks", len(cfg.Checks)) if err := a.Run(ctx); err != nil { log.Error("run", "err", err) os.Exit(1) } log.Info("monlet-agent stopped") }