summaryrefslogtreecommitdiffstats
path: root/utils/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'utils/config.go')
-rw-r--r--utils/config.go102
1 files changed, 81 insertions, 21 deletions
diff --git a/utils/config.go b/utils/config.go
index 64085fcff..2fb6e689f 100644
--- a/utils/config.go
+++ b/utils/config.go
@@ -32,36 +32,96 @@ const (
LOG_FILENAME = "mattermost.log"
)
-// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or
-// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty
-// string is returned if no configuration is found.
-func FindConfigFile(fileName string) (path string) {
- if filepath.IsAbs(fileName) {
- if _, err := os.Stat(fileName); err == nil {
- return fileName
+var (
+ commonBaseSearchPaths = []string{
+ ".",
+ "..",
+ "../..",
+ "../../..",
+ }
+)
+
+func FindPath(path string, baseSearchPaths []string, filter func(os.FileInfo) bool) string {
+ if filepath.IsAbs(path) {
+ if _, err := os.Stat(path); err == nil {
+ return path
}
- } else {
- for _, dir := range []string{"./config", "../config", "../../config", "../../../config", "."} {
- path, _ := filepath.Abs(filepath.Join(dir, fileName))
- if _, err := os.Stat(path); err == nil {
- return path
+
+ return ""
+ }
+
+ searchPaths := []string{}
+ for _, baseSearchPath := range baseSearchPaths {
+ searchPaths = append(searchPaths, baseSearchPath)
+ }
+
+ // Additionally attempt to search relative to the location of the running binary.
+ var binaryDir string
+ if exe, err := os.Executable(); err == nil {
+ if exe, err = filepath.EvalSymlinks(exe); err == nil {
+ if exe, err = filepath.Abs(exe); err == nil {
+ binaryDir = filepath.Dir(exe)
}
}
}
- return ""
-}
+ if binaryDir != "" {
+ for _, baseSearchPath := range baseSearchPaths {
+ searchPaths = append(
+ searchPaths,
+ filepath.Join(binaryDir, baseSearchPath),
+ )
+ }
+ }
-// FindDir looks for the given directory in nearby ancestors, falling back to `./` if not found.
-func FindDir(dir string) (string, bool) {
- for _, parent := range []string{".", "..", "../..", "../../.."} {
- foundDir, err := filepath.Abs(filepath.Join(parent, dir))
+ for _, parent := range searchPaths {
+ found, err := filepath.Abs(filepath.Join(parent, path))
if err != nil {
continue
- } else if _, err := os.Stat(foundDir); err == nil {
- return foundDir, true
+ } else if fileInfo, err := os.Stat(found); err == nil {
+ if filter != nil {
+ if filter(fileInfo) {
+ return found
+ }
+ } else {
+ return found
+ }
}
}
- return "./", false
+
+ return ""
+}
+
+// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or
+// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty
+// string is returned if no configuration is found.
+func FindConfigFile(fileName string) (path string) {
+ found := FindFile(filepath.Join("config", fileName))
+ if found == "" {
+ found = FindPath(fileName, []string{"."}, nil)
+ }
+
+ return found
+}
+
+// FindFile looks for the given file in nearby ancestors relative to the current working
+// directory as well as the directory of the executable.
+func FindFile(path string) string {
+ return FindPath(path, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool {
+ return !fileInfo.IsDir()
+ })
+}
+
+// FindDir looks for the given directory in nearby ancestors relative to the current working
+// directory as well as the directory of the executable, falling back to `./` if not found.
+func FindDir(dir string) (string, bool) {
+ found := FindPath(dir, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool {
+ return fileInfo.IsDir()
+ })
+ if found == "" {
+ return "./", false
+ }
+
+ return found, true
}
func MloggerConfigFromLoggerConfig(s *model.LogSettings) *mlog.LoggerConfiguration {