Set default syncthing path.
[src/xds/xds-server.git] / lib / xdsconfig / config.go
index 465620b..84e0778 100644 (file)
@@ -2,12 +2,13 @@ package xdsconfig
 
 import (
        "fmt"
-
+       "io"
        "os"
+       "path/filepath"
 
        "github.com/Sirupsen/logrus"
        "github.com/codegangsta/cli"
-       "github.com/iotbzh/xds-server/lib/common"
+       common "github.com/iotbzh/xds-common/golib"
 )
 
 // Config parameters (json format) of /config command
@@ -16,60 +17,111 @@ type Config struct {
        APIVersion    string        `json:"apiVersion"`
        VersionGitTag string        `json:"gitTag"`
        Builder       BuilderConfig `json:"builder"`
-       Folders       FoldersConfig `json:"folders"`
 
        // Private (un-exported fields in REST GET /config route)
-       FileConf     FileConfig     `json:"-"`
-       WebAppDir    string         `json:"-"`
-       HTTPPort     string         `json:"-"`
-       ShareRootDir string         `json:"-"`
-       Log          *logrus.Logger `json:"-"`
+       Options       Options        `json:"-"`
+       FileConf      FileConfig     `json:"-"`
+       Log           *logrus.Logger `json:"-"`
+       LogVerboseOut io.Writer      `json:"-"`
+}
+
+// Options set at the command line
+type Options struct {
+       ConfigFile     string
+       LogLevel       string
+       LogFile        string
+       NoFolderConfig bool
 }
 
 // Config default values
 const (
        DefaultAPIVersion = "1"
        DefaultPort       = "8000"
-       DefaultShareDir   = "/mnt/share"
+       DefaultShareDir   = "${HOME}/.xds-server/projects"
+       DefaultSTHomeDir  = "${HOME}/.xds-server/syncthing-config"
+       DefaultSdkRootDir = "/xdt/sdk"
 )
 
 // Init loads the configuration on start-up
 func Init(cliCtx *cli.Context, log *logrus.Logger) (*Config, error) {
        var err error
 
+       dfltShareDir := DefaultShareDir
+       dfltSTHomeDir := DefaultSTHomeDir
+       if resDir, err := common.ResolveEnvVar(DefaultShareDir); err == nil {
+               dfltShareDir = resDir
+       }
+       if resDir, err := common.ResolveEnvVar(DefaultSTHomeDir); err == nil {
+               dfltSTHomeDir = resDir
+       }
+
        // Define default configuration
        c := Config{
                Version:       cliCtx.App.Metadata["version"].(string),
                APIVersion:    DefaultAPIVersion,
                VersionGitTag: cliCtx.App.Metadata["git-tag"].(string),
                Builder:       BuilderConfig{},
-               Folders:       FoldersConfig{},
 
-               WebAppDir:    "webapp/dist",
-               HTTPPort:     DefaultPort,
-               ShareRootDir: DefaultShareDir,
-               Log:          log,
+               Options: Options{
+                       ConfigFile:     cliCtx.GlobalString("config"),
+                       LogLevel:       cliCtx.GlobalString("log"),
+                       LogFile:        cliCtx.GlobalString("logfile"),
+                       NoFolderConfig: cliCtx.GlobalBool("no-folderconfig"),
+               },
+               FileConf: FileConfig{
+                       WebAppDir:    "webapp/dist",
+                       ShareRootDir: dfltShareDir,
+                       SdkRootDir:   DefaultSdkRootDir,
+                       HTTPPort:     DefaultPort,
+                       SThgConf:     &SyncThingConf{Home: dfltSTHomeDir},
+                       LogsDir:      "",
+               },
+               Log: log,
        }
 
        // config file settings overwrite default config
-       err = updateConfigFromFile(&c, cliCtx.GlobalString("config"))
+       err = readGlobalConfig(&c, c.Options.ConfigFile)
        if err != nil {
                return nil, err
        }
 
        // Update location of shared dir if needed
-       if !common.Exists(c.ShareRootDir) {
-               if err := os.MkdirAll(c.ShareRootDir, 0770); err != nil {
+       if !common.Exists(c.FileConf.ShareRootDir) {
+               if err := os.MkdirAll(c.FileConf.ShareRootDir, 0770); err != nil {
                        return nil, fmt.Errorf("No valid shared directory found: %v", err)
                }
        }
-       c.Log.Infoln("Share root directory: ", c.ShareRootDir)
+       c.Log.Infoln("Share root directory: ", c.FileConf.ShareRootDir)
+
+       // Where Logs are redirected:
+       //  default 'stdout' (logfile option default value)
+       //  else use file (or filepath) set by --logfile option
+       //  that may be overwritten by LogsDir field of config file
+       logF := c.Options.LogFile
+       logD := c.FileConf.LogsDir
+       if logF != "stdout" {
+               if logD != "" {
+                       lf := filepath.Base(logF)
+                       if lf == "" || lf == "." {
+                               lf = "xds-server.log"
+                       }
+                       logF = filepath.Join(logD, lf)
+               } else {
+                       logD = filepath.Dir(logF)
+               }
+       }
+       if logD == "" || logD == "." {
+               logD = "/tmp/xds/logs"
+       }
+       c.Options.LogFile = logF
+       c.FileConf.LogsDir = logD
 
        if c.FileConf.LogsDir != "" && !common.Exists(c.FileConf.LogsDir) {
                if err := os.MkdirAll(c.FileConf.LogsDir, 0770); err != nil {
                        return nil, fmt.Errorf("Cannot create logs dir: %v", err)
                }
        }
+       c.Log.Infoln("Logs file:      ", c.Options.LogFile)
        c.Log.Infoln("Logs directory: ", c.FileConf.LogsDir)
 
        return &c, nil