package config import ( "os" "strconv" "time" ) type Config struct { Addr string DataPath string PollInterval time.Duration LokiURL string LokiTenantID string LokiUsername string LokiPassword string DryRunActions bool AnalysisProvider string AnalysisEndpoint string AnalysisToken string OllamaURL string OllamaModel string AuthUsername string AuthPassword string } func Load() Config { return Config{ Addr: env("LOG_GUARDIAN_ADDR", ":8080"), DataPath: env("LOG_GUARDIAN_DATA_PATH", "/data/config.json"), PollInterval: durationEnv("LOG_GUARDIAN_POLL_INTERVAL", 1*time.Minute), LokiURL: trimRightSlash(env("LOKI_URL", "http://loki:3100")), LokiTenantID: env("LOKI_TENANT_ID", ""), LokiUsername: env("LOKI_USERNAME", ""), LokiPassword: env("LOKI_PASSWORD", ""), DryRunActions: boolEnv("LOG_GUARDIAN_DRY_RUN_ACTIONS", true), AnalysisProvider: env("LOG_GUARDIAN_ANALYSIS_PROVIDER", "none"), AnalysisEndpoint: env("LOG_GUARDIAN_ANALYSIS_ENDPOINT", ""), AnalysisToken: env("LOG_GUARDIAN_ANALYSIS_TOKEN", ""), OllamaURL: trimRightSlash(env("LOG_GUARDIAN_OLLAMA_URL", "http://ollama:11434")), OllamaModel: env("LOG_GUARDIAN_OLLAMA_MODEL", "llama3.1"), AuthUsername: env("LOG_GUARDIAN_AUTH_USERNAME", ""), AuthPassword: env("LOG_GUARDIAN_AUTH_PASSWORD", ""), } } func env(key, fallback string) string { if value := os.Getenv(key); value != "" { return value } return fallback } func boolEnv(key string, fallback bool) bool { value := os.Getenv(key) if value == "" { return fallback } parsed, err := strconv.ParseBool(value) if err != nil { return fallback } return parsed } func durationEnv(key string, fallback time.Duration) time.Duration { value := os.Getenv(key) if value == "" { return fallback } parsed, err := time.ParseDuration(value) if err != nil { return fallback } return parsed } func trimRightSlash(value string) string { for len(value) > 1 && value[len(value)-1] == '/' { value = value[:len(value)-1] } return value }