package version import ( "fmt" "time" ) // Version coordination for Server Authority model // The server is the single source of truth for all version information // CurrentVersions holds the authoritative version information type CurrentVersions struct { AgentVersion string `json:"agent_version"` // e.g., "0.1.23.6" ConfigVersion string `json:"config_version"` // e.g., "6" MinAgentVersion string `json:"min_agent_version"` // e.g., "0.1.22" BuildTime time.Time `json:"build_time"` } // GetCurrentVersions returns the current version information // In production, this would come from a version file, database, or environment func GetCurrentVersions() CurrentVersions { // TODO: For production, load this from version file or database // For now, use environment variables with defaults return CurrentVersions{ AgentVersion: "0.1.23", // Should match current branch ConfigVersion: "3", // Should map from agent version (0.1.23 -> "3") MinAgentVersion: "0.1.22", BuildTime: time.Now(), } } // ExtractConfigVersionFromAgent extracts config version from agent version // Agent version format: v0.1.23.6 where fourth octet maps to config version func ExtractConfigVersionFromAgent(agentVersion string) string { // Strip 'v' prefix if present cleanVersion := agentVersion if len(cleanVersion) > 0 && cleanVersion[0] == 'v' { cleanVersion = cleanVersion[1:] } // Split version parts parts := fmt.Sprintf("%s", cleanVersion) if len(parts) >= 1 { // For now, use the last octet as config version // v0.1.23 -> "3" (last digit) lastChar := parts[len(parts)-1:] return lastChar } // Default fallback return "3" } // ValidateAgentVersion checks if an agent version is compatible func ValidateAgentVersion(agentVersion string) error { current := GetCurrentVersions() // Check minimum version if agentVersion < current.MinAgentVersion { return fmt.Errorf("agent version %s is below minimum %s", agentVersion, current.MinAgentVersion) } return nil } // GetBuildFlags returns the ldflags to inject versions into agent builds func GetBuildFlags() []string { versions := GetCurrentVersions() return []string{ fmt.Sprintf("-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.Version=%s", versions.AgentVersion), fmt.Sprintf("-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.ConfigVersion=%s", versions.ConfigVersion), fmt.Sprintf("-X github.com/Fimeg/RedFlag/aggregator-agent/internal/version.BuildTime=%s", versions.BuildTime.Format(time.RFC3339)), } }