Add xds-agent user systemd service file and install
[src/xds/xds-agent.git] / lib / xdsconfig / fileconfig.go
index 2795206..d936bbe 100644 (file)
@@ -5,7 +5,6 @@ import (
        "os"
        "os/user"
        "path"
-       "path/filepath"
 
        common "github.com/iotbzh/xds-common/golib"
 )
@@ -27,9 +26,8 @@ type FileConfig struct {
 // 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
-//  3/ <current_dir>/agent-config.json file
-//  4/ <executable dir>/agent-config.json file
+//  2/ $HOME/.xds/agent/agent-config.json file
+//  3/ /etc/xds-agent/config.json file
 
 func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) {
 
@@ -38,17 +36,11 @@ 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"))
-       }
-       cwd, err := os.Getwd()
-       if err == nil {
-               searchIn = append(searchIn, path.Join(cwd, "agent-config.json"))
-       }
-       exePath, err := filepath.Abs(filepath.Dir(os.Args[0]))
-       if err == nil {
-               searchIn = append(searchIn, path.Join(exePath, "agent-config.json"))
+               searchIn = append(searchIn, path.Join(usr.HomeDir, ".xds", "agent", "agent-config.json"))
        }
 
+       searchIn = append(searchIn, "/etc/xds-agent/config.json")
+
        var cFile *string
        for _, p := range searchIn {
                if _, err := os.Stat(p); err == nil {
@@ -56,30 +48,32 @@ 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
-       for _, field := range []*string{
+       vars := []*string{
                &fCfg.LogsDir,
-               &fCfg.SThgConf.Home,
-               &fCfg.SThgConf.BinDir} {
-
+       }
+       if fCfg.SThgConf != nil {
+               vars = append(vars, &fCfg.SThgConf.Home, &fCfg.SThgConf.BinDir)
+       }
+       for _, field := range vars {
                var err error
                *field, err = common.ResolveEnvVar(*field)
                if err != nil {