You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.1 KiB
106 lines
3.1 KiB
package lib
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
"github.com/kelseyhightower/envconfig"
|
|
"github.com/labstack/gommon/color"
|
|
)
|
|
|
|
var warning = color.Red("[Fail]")
|
|
|
|
// ConfigLoad читаем конфигурации
|
|
// получаем только название конфигурации
|
|
// 1. поднимаемся до корневой директории
|
|
// 2. от нее ищем полный путь до конфига
|
|
// 3. читаем по этому пути
|
|
func ConfigLoad(config string, pointToCfg interface{}) (payload string, err error) {
|
|
|
|
if err := envconfig.Process("", pointToCfg); err != nil {
|
|
fmt.Printf("%s Error load default enviroment: %s\n", warning, err)
|
|
err = fmt.Errorf("Error load default enviroment: %s", err)
|
|
return "", err
|
|
}
|
|
|
|
// проверка на длину конфигурационного файла
|
|
// если он больше 100, то скорее всего передали конфигурацию в base64
|
|
if len(config) < 200 {
|
|
// 3.
|
|
if len(config) == 0 {
|
|
return "", fmt.Errorf("%s", "Error. Configfile is empty.")
|
|
}
|
|
if !strings.Contains(config, ".") {
|
|
config = config + ".cfg"
|
|
}
|
|
|
|
// 4. читаем из файла
|
|
payload, err = ReadFile(config)
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error raed configfile: (%s), err: %s", config, err)
|
|
}
|
|
|
|
} else {
|
|
// пробуем расшифровать из base64
|
|
debase, err := base64.StdEncoding.DecodeString(config)
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error decode to string from base64 configfile. err: %s", err)
|
|
}
|
|
payload = string(debase)
|
|
}
|
|
err = DecodeConfig(payload, pointToCfg)
|
|
|
|
return payload, err
|
|
}
|
|
|
|
// DecodeConfig Читаем конфигурация из строки
|
|
func DecodeConfig(configfile string, cfg interface{}) (err error) {
|
|
if _, err = toml.Decode(configfile, cfg); err != nil {
|
|
fmt.Printf("%s Error: %s (configfile: %s)\n", warning, err, configfile)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// SearchConfigDir получаем путь до искомой конфигурации от переданной директории
|
|
func searchConfigDir(startDir, configuration string) (configPath string, err error) {
|
|
var nextPath string
|
|
directory, err := os.Open(startDir)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer directory.Close()
|
|
|
|
objects, err := directory.Readdir(-1)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// пробегаем текущую папку и считаем совпадание признаков
|
|
for _, obj := range objects {
|
|
nextPath = startDir + sep + obj.Name()
|
|
if obj.IsDir() {
|
|
dirName := obj.Name()
|
|
|
|
// не входим в скрытые папки
|
|
if dirName[:1] != "." {
|
|
configPath, err = searchConfigDir(nextPath, configuration)
|
|
if configPath != "" {
|
|
return configPath, err // поднимает результат наверх
|
|
}
|
|
}
|
|
} else {
|
|
if !strings.Contains(nextPath, "/.") {
|
|
// проверяем только файлы конфигурации (игнорируем .json)
|
|
if strings.Contains(obj.Name(), configuration+".cfg") {
|
|
return nextPath, err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return configPath, err
|
|
}
|
|
|