X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsconfig%2Ffileconfig.go;h=2358a31dd2ab347056dfd16325e9adfc404553e8;hb=1c6af6236743aa0963d4919b5ef42627efa6aca7;hp=0c4828ccef8be17fae566021f7f839974f91d1ac;hpb=bfeab33538d50ee52750de4dd4c0e72b64f674f6;p=src%2Fxds%2Fxds-agent.git diff --git a/lib/xdsconfig/fileconfig.go b/lib/xdsconfig/fileconfig.go index 0c4828c..2358a31 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" + + common "github.com/iotbzh/xds-common/golib" ) type SyncThingConf struct { @@ -18,14 +18,16 @@ type SyncThingConf struct { } type FileConfig struct { - HTTPPort string `json:"httpPort"` - SThgConf *SyncThingConf `json:"syncthing"` + HTTPPort string `json:"httpPort"` + LogsDir string `json:"logsDir"` + XDSAPIKey string `json:"xds-apikey"` + SThgConf *SyncThingConf `json:"syncthing"` } // getConfigFromFile reads configuration from a config file. // Order to determine which config file is used: // 1/ from command line option: "--config myConfig.json" -// 2/ $HOME/.xds/agent-config.json file +// 2/ $HOME/.xds/agent/agent-config.json file // 3/ /agent-config.json file // 4/ /agent-config.json file @@ -36,7 +38,7 @@ func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) { searchIn = append(searchIn, confFile) } if usr, err := user.Current(); err == nil { - searchIn = append(searchIn, path.Join(usr.HomeDir, ".xds", "agent-config.json")) + searchIn = append(searchIn, path.Join(usr.HomeDir, ".xds", "agent", "agent-config.json")) } cwd, err := os.Getwd() if err == nil { @@ -54,67 +56,49 @@ func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) { break } } - fCfg := FileConfig{} - if cFile == nil { - // No config file found - return &fCfg, nil - } + // Use default settings + fCfg := *c.FileConf - c.log.Infof("Use config file: %s", *cFile) + // Read config file when existing + if cFile != nil { + c.Log.Infof("Use config file: %s", *cFile) - // TODO move on viper package to support comments in JSON and also - // bind with flags (command line options) - // see https://github.com/spf13/viper#working-with-flags + // TODO move on viper package to support comments in JSON and also + // bind with flags (command line options) + // see https://github.com/spf13/viper#working-with-flags - fd, _ := os.Open(*cFile) - defer fd.Close() - if err := json.NewDecoder(fd).Decode(&fCfg); err != nil { - return nil, err + fd, _ := os.Open(*cFile) + defer fd.Close() + if err := json.NewDecoder(fd).Decode(&fCfg); err != nil { + return nil, err + } } // Support environment variables (IOW ${MY_ENV_VAR} syntax) in agent-config.json - // TODO: better to use reflect package to iterate on fields and be more generic - var rep string - - if rep, err = resolveEnvVar(fCfg.SThgConf.BinDir); err != nil { - return nil, err + vars := []*string{ + &fCfg.LogsDir, } - fCfg.SThgConf.BinDir = path.Clean(rep) - - if rep, err = resolveEnvVar(fCfg.SThgConf.Home); err != nil { - return nil, err + if fCfg.SThgConf != nil { + vars = append(vars, &fCfg.SThgConf.Home, &fCfg.SThgConf.BinDir) } - fCfg.SThgConf.Home = path.Clean(rep) - - 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]) + for _, field := range vars { + var err error + *field, err = common.ResolveEnvVar(*field) + if err != nil { + return nil, err } - - rer := regexp.MustCompile("\\${" + v[1] + "}") - res = rer.ReplaceAllString(res, val) } - return res, nil -} - -// exists returns whether the given file or directory exists or not -func exists(path string) bool { - _, err := os.Stat(path) - if err == nil { - return true + // Config file settings overwrite default config + if fCfg.HTTPPort != "" { + c.HTTPPort = fCfg.HTTPPort } - if os.IsNotExist(err) { - return false + + // Set default apikey + // FIXME - rework with dynamic key + if fCfg.XDSAPIKey == "" { + fCfg.XDSAPIKey = "1234abcezam" } - return true + + return &fCfg, nil }