From 319c10853c1961621a0c1ae05ac95b20a0ce277e Mon Sep 17 00:00:00 2001 From: Sebastien Douheret Date: Thu, 18 May 2017 10:55:19 +0200 Subject: [PATCH] Fix ResolveEnvVar function and add support of tilde (~/...) --- lib/common/filepath.go | 41 ++++++++++++++++++++++++++++++++++++++++- lib/xdsconfig/fileconfig.go | 26 ++++---------------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/lib/common/filepath.go b/lib/common/filepath.go index 603c2a2..42ef82f 100644 --- a/lib/common/filepath.go +++ b/lib/common/filepath.go @@ -1,6 +1,13 @@ package common -import "os" +import ( + "fmt" + "os" + "os/user" + "path" + "path/filepath" + "regexp" +) // Exists returns whether the given file or directory exists or not func Exists(path string) bool { @@ -13,3 +20,35 @@ func Exists(path string) bool { } return true } + +// ResolveEnvVar Resolved environment variable regarding the syntax ${MYVAR} +// or $MYVAR following by a slash or a backslash +func ResolveEnvVar(s string) (string, error) { + + // Resolved tilde : ~/ + if s[:2] == "~/" { + if usr, err := user.Current(); err == nil { + s = filepath.Join(usr.HomeDir, s[2:]) + } + } + + // Resolved ${MYVAR} + re := regexp.MustCompile("\\${([^}]+)}") + vars := re.FindAllStringSubmatch(s, -1) + res := s + for _, v := range vars { + val := os.Getenv(v[1]) + if val == "" { + return res, fmt.Errorf("ERROR: %s env variable not defined", v[1]) + } + + rer := regexp.MustCompile("\\${" + v[1] + "}") + res = rer.ReplaceAllString(res, val) + } + + // Resolved $MYVAR following by a slash (or a backslash for Windows) + // TODO + //re := regexp.MustCompile("\\$([^\\/])+/") + + return path.Clean(res), nil +} diff --git a/lib/xdsconfig/fileconfig.go b/lib/xdsconfig/fileconfig.go index 5cf8db2..535ee59 100644 --- a/lib/xdsconfig/fileconfig.go +++ b/lib/xdsconfig/fileconfig.go @@ -2,12 +2,12 @@ package xdsconfig import ( "encoding/json" - "fmt" "os" "os/user" "path" "path/filepath" - "regexp" + + "github.com/iotbzh/xds-agent/lib/common" ) type SyncThingConf struct { @@ -79,11 +79,11 @@ func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) { &fCfg.SThgConf.Home, &fCfg.SThgConf.BinDir} { - rep, err := resolveEnvVar(*field) + var err error + *field, err = common.ResolveEnvVar(*field) if err != nil { return nil, err } - *field = path.Clean(rep) } // Config file settings overwrite default config @@ -93,21 +93,3 @@ func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) { return &fCfg, nil } - -// resolveEnvVar Resolved environment variable regarding the syntax ${MYVAR} -func resolveEnvVar(s string) (string, error) { - re := regexp.MustCompile("\\${(.*)}") - vars := re.FindAllStringSubmatch(s, -1) - res := s - for _, v := range vars { - val := os.Getenv(v[1]) - if val == "" { - return res, fmt.Errorf("ERROR: %s env variable not defined", v[1]) - } - - rer := regexp.MustCompile("\\${" + v[1] + "}") - res = rer.ReplaceAllString(res, val) - } - - return res, nil -} -- 2.16.6