grafana_gen/env.go

112 lines
2.8 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}