import (
"encoding/json"
- "fmt"
"os"
"os/user"
"path"
"path/filepath"
- "regexp"
"strings"
+
+ "github.com/iotbzh/xds-server/lib/common"
)
type SyncThingConf struct {
- Home string `json:"home"`
- GuiAddress string `json:"gui-address"`
- GuiAPIKey string `json:"gui-apikey"`
+ BinDir string `json:"binDir"`
+ Home string `json:"home"`
+ GuiAddress string `json:"gui-address"`
+ GuiAPIKey string `json:"gui-apikey"`
+ RescanIntervalS int `json:"rescanIntervalS"`
}
type FileConfig struct {
- WebAppDir string `json:"webAppDir"`
- ShareRootDir string `json:"shareRootDir"`
- HTTPPort string `json:"httpPort"`
- SThgConf SyncThingConf `json:"syncthing"`
+ WebAppDir string `json:"webAppDir"`
+ ShareRootDir string `json:"shareRootDir"`
+ SdkRootDir string `json:"sdkRootDir"`
+ HTTPPort string `json:"httpPort"`
+ SThgConf *SyncThingConf `json:"syncthing"`
+ LogsDir string `json:"logsDir"`
}
// 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/config.json file
-// 3/ <current_dir>/agent-config.json file
+// 3/ <current_dir>/config.json file
// 4/ <xds-server executable dir>/config.json file
func updateConfigFromFile(c *Config, confFile string) error {
if err := json.NewDecoder(fd).Decode(&fCfg); err != nil {
return err
}
- c.fileConf = fCfg
+ c.FileConf = fCfg
// Support environment variables (IOW ${MY_ENV_VAR} syntax) in config.json
- // TODO: better to use reflect package to iterate on fields and be more generic
- var rep string
- if rep, err = resolveEnvVar(fCfg.WebAppDir); err != nil {
- return err
- }
- fCfg.WebAppDir = path.Clean(rep)
-
- if rep, err = resolveEnvVar(fCfg.ShareRootDir); err != nil {
- return err
- }
- fCfg.ShareRootDir = path.Clean(rep)
-
- if rep, err = resolveEnvVar(fCfg.SThgConf.Home); err != nil {
- return err
+ for _, field := range []*string{
+ &fCfg.WebAppDir,
+ &fCfg.ShareRootDir,
+ &fCfg.SdkRootDir,
+ &fCfg.LogsDir,
+ &fCfg.SThgConf.Home,
+ &fCfg.SThgConf.BinDir} {
+
+ var err error
+ if *field, err = common.ResolveEnvVar(*field); err != nil {
+ return err
+ }
}
- fCfg.SThgConf.Home = path.Clean(rep)
// Config file settings overwrite default config
// Check first from current directory
for _, rootD := range []string{cwd, exePath} {
ff := path.Join(rootD, c.WebAppDir, "index.html")
- if exists(ff) {
+ if common.Exists(ff) {
c.WebAppDir = path.Join(rootD, c.WebAppDir)
break
}
return 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
-}
-
-// 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
- }
- if os.IsNotExist(err) {
- return false
- }
- return true
-}