diff --git a/conf/dev.ini b/conf/dev.ini deleted file mode 100644 index 6b9759bad21..00000000000 --- a/conf/dev.ini +++ /dev/null @@ -1,10 +0,0 @@ -app_mode = development - -[server] -router_logging = false - -[log] -level = Trace - - - diff --git a/main.go b/main.go index a7e731bc84c..ffe7e3d7cd3 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,7 @@ var commit = "NA" var buildstamp string var configFile = flag.String("config", "", "path to config file") +var homePath = flag.String("homepath", "", "path to grafana install/home path, defaults to working directory") var pidFile = flag.String("pidfile", "", "path to pid file") func init() { @@ -65,8 +66,9 @@ func main() { func initRuntime() { setting.NewConfigContext(&setting.CommandLineArgs{ - Config: *configFile, - Args: flag.Args(), + Config: *configFile, + HomePath: *homePath, + Args: flag.Args(), }) log.Info("Starting Grafana") diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 78b255818a8..0d5389ebc4f 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -106,14 +106,14 @@ var ( ) type CommandLineArgs struct { - Config string - Args []string + Config string + HomePath string + Args []string } func init() { IsWindows = runtime.GOOS == "windows" log.NewLogger(0, "console", `{"level": 0}`) - HomePath, _ = filepath.Abs(".") } func parseAppUrlAndSubUrl(section *ini.Section) (string, string) { @@ -226,6 +226,14 @@ func evalConfigValues() { } func loadSpecifedConfigFile(configFile string) { + if configFile == "" { + configFile = filepath.Join(HomePath, "conf/custom.ini") + // return without error if custom file does not exist + if !pathExists(configFile) { + return + } + } + userConfig, err := ini.Load(configFile) userConfig.BlockMode = false if err != nil { @@ -256,8 +264,6 @@ func loadSpecifedConfigFile(configFile string) { func loadConfiguration(args *CommandLineArgs) { var err error - args.Config = evalEnvVarExpression(args.Config) - // load config defaults defaultConfigFile := path.Join(HomePath, "conf/defaults.ini") configFiles = append(configFiles, defaultConfigFile) @@ -276,9 +282,7 @@ func loadConfiguration(args *CommandLineArgs) { applyCommandLineDefaultProperties(commandLineProps) // load specified config file - if args.Config != "" { - loadSpecifedConfigFile(args.Config) - } + loadSpecifedConfigFile(args.Config) // apply environment overrides applyEnvVariableOverrides() @@ -290,11 +294,40 @@ func loadConfiguration(args *CommandLineArgs) { evalConfigValues() } +func pathExists(path string) bool { + _, err := os.Stat(path) + if err == nil { + return true + } + if os.IsNotExist(err) { + return false + } + return false +} + +func setHomePath(args *CommandLineArgs) { + if args.HomePath != "" { + HomePath = args.HomePath + return + } + + HomePath, _ = filepath.Abs(".") + // check if homepath is correct + if pathExists(filepath.Join(HomePath, "conf/defaults.ini")) { + return + } + + // try down one path + if pathExists(filepath.Join(HomePath, "../conf/defaults.ini")) { + HomePath = filepath.Join(HomePath, "../") + } +} + func NewConfigContext(args *CommandLineArgs) { + setHomePath(args) loadConfiguration(args) DataPath = makeAbsolute(Cfg.Section("paths").Key("data").String(), HomePath) - initLogging(args) AppName = Cfg.Section("").Key("app_name").MustString("Grafana") @@ -314,7 +347,7 @@ func NewConfigContext(args *CommandLineArgs) { HttpAddr = server.Key("http_addr").MustString("0.0.0.0") HttpPort = server.Key("http_port").MustString("3000") - StaticRootPath = server.Key("static_root_path").MustString(path.Join(HomePath, "public")) + StaticRootPath = makeAbsolute(server.Key("static_root_path").String(), HomePath) RouterLogging = server.Key("router_logging").MustBool(false) EnableGzip = server.Key("enable_gzip").MustBool(false) diff --git a/pkg/setting/setting_test.go b/pkg/setting/setting_test.go index 1d0582a32cf..73ccabd2dbc 100644 --- a/pkg/setting/setting_test.go +++ b/pkg/setting/setting_test.go @@ -10,12 +10,10 @@ import ( func TestLoadingSettings(t *testing.T) { - HomePath, _ = filepath.Abs("../../") - Convey("Testing loading settings from ini file", t, func() { Convey("Given the default ini files", func() { - NewConfigContext(&CommandLineArgs{}) + NewConfigContext(&CommandLineArgs{HomePath: "../../"}) So(AppName, ShouldEqual, "Grafana") So(AdminUser, ShouldEqual, "admin") @@ -23,7 +21,7 @@ func TestLoadingSettings(t *testing.T) { Convey("Should be able to override via environment variables", func() { os.Setenv("GF_SECURITY_ADMIN_USER", "superduper") - NewConfigContext(&CommandLineArgs{}) + NewConfigContext(&CommandLineArgs{HomePath: "../../"}) So(AdminUser, ShouldEqual, "superduper") So(DataPath, ShouldEqual, filepath.Join(HomePath, "data")) @@ -40,7 +38,8 @@ func TestLoadingSettings(t *testing.T) { Convey("Should be able to override via command line", func() { NewConfigContext(&CommandLineArgs{ - Args: []string{"cfg:paths.data=/tmp/data", "cfg:paths.logs=/tmp/logs"}, + HomePath: "../../", + Args: []string{"cfg:paths.data=/tmp/data", "cfg:paths.logs=/tmp/logs"}, }) So(DataPath, ShouldEqual, "/tmp/data") @@ -49,6 +48,7 @@ func TestLoadingSettings(t *testing.T) { Convey("Should be able to override defaults via command line", func() { NewConfigContext(&CommandLineArgs{ + HomePath: "../../", Args: []string{ "cfg:default.server.domain=test2", }, @@ -60,8 +60,9 @@ func TestLoadingSettings(t *testing.T) { Convey("Defaults can be overriden in specified config file", func() { NewConfigContext(&CommandLineArgs{ - Args: []string{"cfg:default.paths.data=/tmp/data"}, - Config: filepath.Join(HomePath, "tests/config-files/override.ini"), + HomePath: "../../", + Config: filepath.Join(HomePath, "tests/config-files/override.ini"), + Args: []string{"cfg:default.paths.data=/tmp/data"}, }) So(DataPath, ShouldEqual, "/tmp/override") @@ -69,8 +70,9 @@ func TestLoadingSettings(t *testing.T) { Convey("Command line overrides specified config file", func() { NewConfigContext(&CommandLineArgs{ - Args: []string{"cfg:paths.data=/tmp/data"}, - Config: filepath.Join(HomePath, "tests/config-files/override.ini"), + HomePath: "../../", + Config: filepath.Join(HomePath, "tests/config-files/override.ini"), + Args: []string{"cfg:paths.data=/tmp/data"}, }) So(DataPath, ShouldEqual, "/tmp/data") @@ -79,7 +81,8 @@ func TestLoadingSettings(t *testing.T) { Convey("Can use environment variables in config values", func() { os.Setenv("GF_DATA_PATH", "/tmp/env_override") NewConfigContext(&CommandLineArgs{ - Args: []string{"cfg:paths.data=${GF_DATA_PATH}"}, + HomePath: "../../", + Args: []string{"cfg:paths.data=${GF_DATA_PATH}"}, }) So(DataPath, ShouldEqual, "/tmp/env_override")