Set default syncthing path.
[src/xds/xds-server.git] / lib / xdsconfig / config.go
1 package xdsconfig
2
3 import (
4         "fmt"
5         "io"
6         "os"
7         "path/filepath"
8
9         "github.com/Sirupsen/logrus"
10         "github.com/codegangsta/cli"
11         common "github.com/iotbzh/xds-common/golib"
12 )
13
14 // Config parameters (json format) of /config command
15 type Config struct {
16         Version       string        `json:"version"`
17         APIVersion    string        `json:"apiVersion"`
18         VersionGitTag string        `json:"gitTag"`
19         Builder       BuilderConfig `json:"builder"`
20
21         // Private (un-exported fields in REST GET /config route)
22         Options       Options        `json:"-"`
23         FileConf      FileConfig     `json:"-"`
24         Log           *logrus.Logger `json:"-"`
25         LogVerboseOut io.Writer      `json:"-"`
26 }
27
28 // Options set at the command line
29 type Options struct {
30         ConfigFile     string
31         LogLevel       string
32         LogFile        string
33         NoFolderConfig bool
34 }
35
36 // Config default values
37 const (
38         DefaultAPIVersion = "1"
39         DefaultPort       = "8000"
40         DefaultShareDir   = "${HOME}/.xds-server/projects"
41         DefaultSTHomeDir  = "${HOME}/.xds-server/syncthing-config"
42         DefaultSdkRootDir = "/xdt/sdk"
43 )
44
45 // Init loads the configuration on start-up
46 func Init(cliCtx *cli.Context, log *logrus.Logger) (*Config, error) {
47         var err error
48
49         dfltShareDir := DefaultShareDir
50         dfltSTHomeDir := DefaultSTHomeDir
51         if resDir, err := common.ResolveEnvVar(DefaultShareDir); err == nil {
52                 dfltShareDir = resDir
53         }
54         if resDir, err := common.ResolveEnvVar(DefaultSTHomeDir); err == nil {
55                 dfltSTHomeDir = resDir
56         }
57
58         // Define default configuration
59         c := Config{
60                 Version:       cliCtx.App.Metadata["version"].(string),
61                 APIVersion:    DefaultAPIVersion,
62                 VersionGitTag: cliCtx.App.Metadata["git-tag"].(string),
63                 Builder:       BuilderConfig{},
64
65                 Options: Options{
66                         ConfigFile:     cliCtx.GlobalString("config"),
67                         LogLevel:       cliCtx.GlobalString("log"),
68                         LogFile:        cliCtx.GlobalString("logfile"),
69                         NoFolderConfig: cliCtx.GlobalBool("no-folderconfig"),
70                 },
71                 FileConf: FileConfig{
72                         WebAppDir:    "webapp/dist",
73                         ShareRootDir: dfltShareDir,
74                         SdkRootDir:   DefaultSdkRootDir,
75                         HTTPPort:     DefaultPort,
76                         SThgConf:     &SyncThingConf{Home: dfltSTHomeDir},
77                         LogsDir:      "",
78                 },
79                 Log: log,
80         }
81
82         // config file settings overwrite default config
83         err = readGlobalConfig(&c, c.Options.ConfigFile)
84         if err != nil {
85                 return nil, err
86         }
87
88         // Update location of shared dir if needed
89         if !common.Exists(c.FileConf.ShareRootDir) {
90                 if err := os.MkdirAll(c.FileConf.ShareRootDir, 0770); err != nil {
91                         return nil, fmt.Errorf("No valid shared directory found: %v", err)
92                 }
93         }
94         c.Log.Infoln("Share root directory: ", c.FileConf.ShareRootDir)
95
96         // Where Logs are redirected:
97         //  default 'stdout' (logfile option default value)
98         //  else use file (or filepath) set by --logfile option
99         //  that may be overwritten by LogsDir field of config file
100         logF := c.Options.LogFile
101         logD := c.FileConf.LogsDir
102         if logF != "stdout" {
103                 if logD != "" {
104                         lf := filepath.Base(logF)
105                         if lf == "" || lf == "." {
106                                 lf = "xds-server.log"
107                         }
108                         logF = filepath.Join(logD, lf)
109                 } else {
110                         logD = filepath.Dir(logF)
111                 }
112         }
113         if logD == "" || logD == "." {
114                 logD = "/tmp/xds/logs"
115         }
116         c.Options.LogFile = logF
117         c.FileConf.LogsDir = logD
118
119         if c.FileConf.LogsDir != "" && !common.Exists(c.FileConf.LogsDir) {
120                 if err := os.MkdirAll(c.FileConf.LogsDir, 0770); err != nil {
121                         return nil, fmt.Errorf("Cannot create logs dir: %v", err)
122                 }
123         }
124         c.Log.Infoln("Logs file:      ", c.Options.LogFile)
125         c.Log.Infoln("Logs directory: ", c.FileConf.LogsDir)
126
127         return &c, nil
128 }