package config import ( "crypto/rand" "encoding/hex" "log" "os" "strings" ) type Config struct { DNS string ManagerURL string AgentPort string AgentID string } var Cfg *Config func init() { Cfg = &Config{ AgentPort: "5087", // default } } func LoadConfig() { paths := []string{".env", "../.env"} for _, p := range paths { content, err := os.ReadFile(p) if err == nil { parseEnv(string(content)) break } } if h := os.Getenv("MANAGER_URL"); h != "" { Cfg.ManagerURL = h } if Cfg.ManagerURL == "" { Cfg.ManagerURL = "http://localhost:5086" // Default } if d := os.Getenv("DNS"); d != "" { Cfg.DNS = d } loadOrGenerateAgentID() } func parseEnv(content string) { lines := strings.Split(content, "\n") for _, line := range lines { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "#") { continue } parts := strings.SplitN(line, "=", 2) if len(parts) == 2 { os.Setenv(parts[0], parts[1]) } } } func loadOrGenerateAgentID() { path := "agent_id.txt" data, err := os.ReadFile(path) if err == nil { Cfg.AgentID = strings.TrimSpace(string(data)) if Cfg.AgentID != "" { return } } // Generate new AgentID b := make([]byte, 8) rand.Read(b) Cfg.AgentID = "agent-" + hex.EncodeToString(b) err = os.WriteFile(path, []byte(Cfg.AgentID), 0600) if err != nil { log.Printf("Warning: failed to save agent_id.txt: %v", err) } } func ResetAgentID() { os.Remove("agent_id.txt") loadOrGenerateAgentID() }