diff --git a/app.go b/app.go index 1c74e14d..2e72e1de 100644 --- a/app.go +++ b/app.go @@ -8,11 +8,9 @@ import ( "net/http" "os" "os/signal" - "path" "path/filepath" "runtime" "strconv" - "strings" "syscall" "time" @@ -26,9 +24,6 @@ import ( var VersionString = "undefined" const ( - // We use it to detect the working dir - executableName = "AdGuardHome" - // Used in config to indicate that syslog or eventlog (win) should be used for logger output configSyslog = "syslog" ) @@ -65,7 +60,7 @@ func run(args options) { } // configure working dir and config path - initWorkingDir() + initWorkingDir(args) // configure log level and output configureLogger(args) @@ -160,21 +155,17 @@ func run(args options) { } // initWorkingDir initializes the ourBinaryDir (basically, we use it as a working dir) -func initWorkingDir() { +func initWorkingDir(args options) { exec, err := os.Executable() if err != nil { panic(err) } - currentExecutableName := filepath.Base(exec) - currentExecutableName = strings.TrimSuffix(currentExecutableName, path.Ext(currentExecutableName)) - if currentExecutableName == executableName { - // Binary build - config.ourBinaryDir = filepath.Dir(exec) + if args.configFilename != "" { + // If there is a custom config file, use it's directory as our working dir + config.ourBinaryDir = filepath.Dir(args.configFilename) } else { - // Most likely we're debugging -- using current working directory in this case - workDir, _ := os.Getwd() - config.ourBinaryDir = workDir + config.ourBinaryDir = filepath.Dir(exec) } } @@ -356,11 +347,8 @@ func promptAndGetPassword(prompt string) (string, error) { } func askUsernamePasswordIfPossible() error { - configfile := config.ourConfigFilename - if !filepath.IsAbs(configfile) { - configfile = filepath.Join(config.ourBinaryDir, config.ourConfigFilename) - } - _, err := os.Stat(configfile) + configFile := config.getConfigFilename() + _, err := os.Stat(configFile) if !os.IsNotExist(err) { // do nothing, file exists return nil diff --git a/config.go b/config.go index ca9f52e5..33d717ef 100644 --- a/config.go +++ b/config.go @@ -87,6 +87,15 @@ var config = configuration{ SchemaVersion: currentSchemaVersion, } +// getConfigFilename returns path to the current config file +func (c *configuration) getConfigFilename() string { + configFile := config.ourConfigFilename + if !filepath.IsAbs(configFile) { + configFile = filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + } + return configFile +} + // getLogSettings reads logging settings from the config file. // we do it in a separate method in order to configure logger before the actual configuration is parsed and applied. func getLogSettings() logSettings { @@ -104,7 +113,7 @@ func getLogSettings() logSettings { // parseConfig loads configuration from the YAML file func parseConfig() error { - configFile := filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + configFile := config.getConfigFilename() log.Printf("Reading YAML file: %s", configFile) yamlFile, err := readConfigFile() if err != nil { @@ -131,7 +140,7 @@ func parseConfig() error { // readConfigFile reads config file contents if it exists func readConfigFile() ([]byte, error) { - configFile := filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + configFile := config.getConfigFilename() if _, err := os.Stat(configFile); os.IsNotExist(err) { // do nothing, file doesn't exist return nil, nil @@ -143,7 +152,7 @@ func readConfigFile() ([]byte, error) { func (c *configuration) write() error { c.Lock() defer c.Unlock() - configFile := filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + configFile := config.getConfigFilename() log.Printf("Writing YAML file: %s", configFile) yamlText, err := yaml.Marshal(&config) if err != nil { diff --git a/upgrade.go b/upgrade.go index 4b142de6..3d79e744 100644 --- a/upgrade.go +++ b/upgrade.go @@ -15,7 +15,7 @@ const currentSchemaVersion = 2 // used for upgrading from old configs to new con // Performs necessary upgrade operations if needed func upgradeConfig() error { // read a config file into an interface map, so we can manipulate values without losing any - configFile := filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + configFile := config.getConfigFilename() if _, err := os.Stat(configFile); os.IsNotExist(err) { log.Printf("config file %s does not exist, nothing to upgrade", configFile) return nil @@ -74,7 +74,7 @@ func upgradeConfigSchema(oldVersion int, diskConfig *map[string]interface{}) err return err } - configFile := filepath.Join(config.ourBinaryDir, config.ourConfigFilename) + configFile := config.getConfigFilename() body, err := yaml.Marshal(diskConfig) if err != nil { log.Printf("Couldn't generate YAML file: %s", err)