112 lines
2.8 KiB
Go
Executable file
112 lines
2.8 KiB
Go
Executable file
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
|
||
}
|