package config import ( "encoding/json" "os" "path/filepath" "runtime" ) type Config struct { ServerURL string `json:"server_url"` EnrollmentToken string `json:"enrollment_token,omitempty"` DeviceID string `json:"device_id"` Credential string `json:"credential"` Label string `json:"label"` HeartbeatSec int `json:"heartbeat_interval_seconds"` } func configDir() string { switch runtime.GOOS { case "windows": if p := os.Getenv("ProgramData"); p != "" { return filepath.Join(p, "FleetForge") } return `C:\ProgramData\FleetForge` case "darwin": home, _ := os.UserHomeDir() return filepath.Join(home, "Library", "Application Support", "FleetForge") default: home, _ := os.UserHomeDir() return filepath.Join(home, ".config", "forge-agent") } } func ConfigPath() string { return filepath.Join(configDir(), "config.json") } func Load() (*Config, error) { data, err := os.ReadFile(ConfigPath()) if err != nil { return nil, err } var cfg Config if err := json.Unmarshal(data, &cfg); err != nil { return nil, err } if cfg.HeartbeatSec <= 0 { cfg.HeartbeatSec = 30 } return &cfg, nil } func Save(cfg *Config) error { dir := filepath.Dir(ConfigPath()) if err := os.MkdirAll(dir, 0700); err != nil { return err } data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } return os.WriteFile(ConfigPath(), data, 0600) } func Delete() error { return os.Remove(ConfigPath()) }