Add xds-agent user systemd service file and install
[src/xds/xds-agent.git] / lib / xdsconfig / fileconfig.go
index 5cf8db2..d936bbe 100644 (file)
@@ -2,12 +2,11 @@ package xdsconfig
 
 import (
        "encoding/json"
-       "fmt"
        "os"
        "os/user"
        "path"
-       "path/filepath"
-       "regexp"
+
+       common "github.com/iotbzh/xds-common/golib"
 )
 
 type SyncThingConf struct {
@@ -18,17 +17,17 @@ type SyncThingConf struct {
 }
 
 type FileConfig struct {
-       HTTPPort string         `json:"httpPort"`
-       LogsDir  string         `json:"logsDir"`
-       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
-//  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) {
 
@@ -37,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 {
@@ -55,35 +48,37 @@ 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} {
-
-               rep, err := resolveEnvVar(*field)
+       }
+       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 {
                        return nil, err
                }
-               *field = path.Clean(rep)
        }
 
        // Config file settings overwrite default config
@@ -91,23 +86,11 @@ func updateConfigFromFile(c *Config, confFile string) (*FileConfig, error) {
                c.HTTPPort = fCfg.HTTPPort
        }
 
-       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)
+       // Set default apikey
+       // FIXME - rework with dynamic key
+       if fCfg.XDSAPIKey == "" {
+               fCfg.XDSAPIKey = "1234abcezam"
        }
 
-       return res, nil
+       return &fCfg, nil
 }