package main import ( "bufio" "fmt" "os" "strings" ) const ( DefaultEnvFile = "/etc/grafana_gen/grafana_gen.env" ) // loadEnvFile загружает переменные из .env файла // Не переопределяет уже установленные переменные окружения func loadEnvFile(filepath string) error { // Если файл не существует - это не ошибка if _, err := os.Stat(filepath); os.IsNotExist(err) { return nil } file, err := os.Open(filepath) if err != nil { return fmt.Errorf("failed to open env file: %w", err) } defer file.Close() scanner := bufio.NewScanner(file) lineNum := 0 for scanner.Scan() { lineNum++ line := strings.TrimSpace(scanner.Text()) // Пропустить пустые строки и комментарии if line == "" || strings.HasPrefix(line, "#") { continue } // Разделить на KEY=VALUE parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { return fmt.Errorf("invalid format at line %d: %s", lineNum, line) } key := strings.TrimSpace(parts[0]) value := strings.TrimSpace(parts[1]) // Убрать кавычки если есть value = strings.Trim(value, "\"'") // Установить переменную окружения ТОЛЬКО если её ещё нет if os.Getenv(key) == "" { if err := os.Setenv(key, value); err != nil { return fmt.Errorf("failed to set %s: %w", key, err) } } } if err := scanner.Err(); err != nil { return fmt.Errorf("error reading env file: %w", err) } return nil } // loadEnvFileWithFallback загружает .env файл с fallback путями func loadEnvFileWithFallback() error { // Попробовать пути в порядке приоритета: // 1. Переменная окружения GRAFANA_GEN_ENV_FILE // 2. /etc/grafana_gen/grafana_gen.env // 3. ./grafana_gen.env (текущая директория) // 4. ./.env paths := []string{ os.Getenv("GRAFANA_GEN_ENV_FILE"), DefaultEnvFile, "./grafana_gen.env", "./.env", } for _, path := range paths { if path == "" { continue } if err := loadEnvFile(path); err != nil { continue } // Если загрузка успешна if _, err := os.Stat(path); err == nil { return nil } } // Если ни один файл не найден - это не ошибка (все переменные через flags/env) return nil } // loadEnvFileQuiet загружает .env файл без логирования // Возвращает true если файл был загружен func loadEnvFileQuiet(filepath string) bool { if err := loadEnvFile(filepath); err != nil { return false } // Проверить что файл существует if _, err := os.Stat(filepath); err == nil { return true } return false }