mirror of
				https://github.com/traefik/traefik.git
				synced 2025-11-04 02:11:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package cli
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/rs/zerolog/log"
 | 
						|
	"github.com/traefik/paerser/cli"
 | 
						|
	"github.com/traefik/paerser/file"
 | 
						|
	"github.com/traefik/paerser/flag"
 | 
						|
)
 | 
						|
 | 
						|
// FileLoader loads a configuration from a file.
 | 
						|
type FileLoader struct {
 | 
						|
	ConfigFileFlag string
 | 
						|
	filename       string
 | 
						|
}
 | 
						|
 | 
						|
// GetFilename returns the configuration file if any.
 | 
						|
func (f *FileLoader) GetFilename() string {
 | 
						|
	return f.filename
 | 
						|
}
 | 
						|
 | 
						|
// Load loads the command's configuration from a file either specified with the -traefik.configfile flag, or from default locations.
 | 
						|
func (f *FileLoader) Load(args []string, cmd *cli.Command) (bool, error) {
 | 
						|
	ref, err := flag.Parse(args, cmd.Configuration)
 | 
						|
	if err != nil {
 | 
						|
		_ = cmd.PrintHelp(os.Stdout)
 | 
						|
		return false, err
 | 
						|
	}
 | 
						|
 | 
						|
	configFileFlag := "traefik.configfile"
 | 
						|
	if _, ok := ref["traefik.configFile"]; ok {
 | 
						|
		configFileFlag = "traefik.configFile"
 | 
						|
	}
 | 
						|
 | 
						|
	if f.ConfigFileFlag != "" {
 | 
						|
		configFileFlag = "traefik." + f.ConfigFileFlag
 | 
						|
		if _, ok := ref[strings.ToLower(configFileFlag)]; ok {
 | 
						|
			configFileFlag = "traefik." + strings.ToLower(f.ConfigFileFlag)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	configFile, err := loadConfigFiles(ref[configFileFlag], cmd.Configuration)
 | 
						|
	if err != nil {
 | 
						|
		return false, err
 | 
						|
	}
 | 
						|
 | 
						|
	f.filename = configFile
 | 
						|
 | 
						|
	if configFile == "" {
 | 
						|
		return false, nil
 | 
						|
	}
 | 
						|
 | 
						|
	log.Printf("Configuration loaded from file: %s", configFile)
 | 
						|
 | 
						|
	content, _ := os.ReadFile(configFile)
 | 
						|
	log.Debug().Str("configFile", configFile).Bytes("content", content).Send()
 | 
						|
 | 
						|
	return true, nil
 | 
						|
}
 | 
						|
 | 
						|
// loadConfigFiles tries to decode the given configuration file and all default locations for the configuration file.
 | 
						|
// It stops as soon as decoding one of them is successful.
 | 
						|
func loadConfigFiles(configFile string, element interface{}) (string, error) {
 | 
						|
	finder := cli.Finder{
 | 
						|
		BasePaths:  []string{"/etc/traefik/traefik", "$XDG_CONFIG_HOME/traefik", "$HOME/.config/traefik", "./traefik"},
 | 
						|
		Extensions: []string{"toml", "yaml", "yml"},
 | 
						|
	}
 | 
						|
 | 
						|
	filePath, err := finder.Find(configFile)
 | 
						|
	if err != nil {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
 | 
						|
	if len(filePath) == 0 {
 | 
						|
		return "", nil
 | 
						|
	}
 | 
						|
 | 
						|
	if err := file.Decode(filePath, element); err != nil {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
	return filePath, nil
 | 
						|
}
 |