diff --git a/cmd/root.go b/cmd/root.go index 1f35e71a..9c78398b 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -57,14 +57,7 @@ func Execute() { func init() { cobra.OnInitialize(initConfig) - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - // rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.hetzner-kube.yaml)") - - // Cobra also supports local flags, which will only run - // when this action is called directly. - // rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file to use") rootCmd.PersistentFlags().BoolP("debug", "d", false, "debug mode") } @@ -74,23 +67,41 @@ func initConfig() { // Use config file from the flag. viper.SetConfigFile(cfgFile) } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Search config in home directory with name ".hetzner-kube" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".hetzner-kube") - + setConfigDirectory() } - viper.AutomaticEnv() // read in environment variables that match + // read in environment variables that match + viper.AutomaticEnv() // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil { fmt.Println("Using config file:", viper.ConfigFileUsed()) } } + +func setConfigDirectory() { + // Find config dir based on XDG Base Directory Specification + // https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + xdgConfig := os.Getenv("XDG_CONFIG_HOME") + if xdgConfig != "" { + viper.AddConfigPath(xdgConfig) + } + + // Failback to home directory + home, err := homedir.Dir() + if err != nil { + fmt.Println(err) + } + + if err == nil { + viper.AddConfigPath(home) + } + + if xdgConfig == "" && err != nil { + fmt.Println("Unable to detect any config location, please specify it with --config flag") + os.Exit(1) + } + + // Search config directory with name ".hetzner-kube" (without extension). + viper.SetConfigName(".hetzner-kube") +}