Use go module as dependency tool instead of glide
[src/xds/xds-server.git] / lib / xdsconfig / config.go
index a3e5a7e..ad3346a 100644 (file)
@@ -1,25 +1,46 @@
+/*
+ * Copyright (C) 2017-2018 "IoT.bzh"
+ * Author Sebastien Douheret <sebastien@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package xdsconfig
 
 import (
        "fmt"
+       "io"
        "os"
+       "os/user"
+       "path"
+       "path/filepath"
 
+       common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
        "github.com/Sirupsen/logrus"
        "github.com/codegangsta/cli"
-       common "github.com/iotbzh/xds-common/golib"
 )
 
 // Config parameters (json format) of /config command
 type Config struct {
-       Version       string        `json:"version"`
-       APIVersion    string        `json:"apiVersion"`
-       VersionGitTag string        `json:"gitTag"`
-       Builder       BuilderConfig `json:"builder"`
+       // Public APIConfig fields
+       xsapiv1.APIConfig
 
        // Private (un-exported fields in REST GET /config route)
-       Options  Options        `json:"-"`
-       FileConf FileConfig     `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
@@ -32,22 +53,45 @@ type Options struct {
 
 // Config default values
 const (
-       DefaultAPIVersion = "1"
-       DefaultPort       = "8000"
-       DefaultShareDir   = "/mnt/share"
-       DefaultSdkRootDir = "/xdt/sdk"
+       DefaultAPIVersion         = "1"
+       DefaultPort               = "8000"
+       DefaultShareDir           = "projects"
+       DefaultSTHomeDir          = "syncthing-config"
+       DefaultSdkScriptsDir      = "${EXEPATH}/sdks"
+       DefaultXdsUtilsScriptsDir = "${EXEPATH}/xds-utils"
+       DefaultSdkDbUpdate        = "startup"
+       DefaultXdsSrvUpdateTime   = "24h"
 )
 
 // Init loads the configuration on start-up
 func Init(cliCtx *cli.Context, log *logrus.Logger) (*Config, error) {
        var err error
 
+       dfltShareDir := path.Join(ConfigRootDir(), DefaultShareDir)
+       dfltSTHomeDir := path.Join(ConfigRootDir(), DefaultSTHomeDir)
+       if resDir, err := common.ResolveEnvVar(dfltShareDir); err == nil {
+               dfltShareDir = resDir
+       }
+       if resDir, err := common.ResolveEnvVar(dfltSTHomeDir); err == nil {
+               dfltSTHomeDir = resDir
+       }
+
+       // Retrieve Server ID (or create one the first time)
+       uuid, err := ServerIDGet()
+       if err != nil {
+               return nil, err
+       }
+
        // Define default configuration
        c := Config{
-               Version:       cliCtx.App.Metadata["version"].(string),
-               APIVersion:    DefaultAPIVersion,
-               VersionGitTag: cliCtx.App.Metadata["git-tag"].(string),
-               Builder:       BuilderConfig{},
+               APIConfig: xsapiv1.APIConfig{
+                       ServerUID:        uuid,
+                       Version:          cliCtx.App.Metadata["version"].(string),
+                       APIVersion:       DefaultAPIVersion,
+                       VersionGitTag:    cliCtx.App.Metadata["git-tag"].(string),
+                       Builder:          xsapiv1.BuilderConfig{},
+                       SupportedSharing: map[string]bool{xsapiv1.TypePathMap: true},
+               },
 
                Options: Options{
                        ConfigFile:     cliCtx.GlobalString("config"),
@@ -56,14 +100,21 @@ func Init(cliCtx *cli.Context, log *logrus.Logger) (*Config, error) {
                        NoFolderConfig: cliCtx.GlobalBool("no-folderconfig"),
                },
                FileConf: FileConfig{
-                       WebAppDir:    "webapp/dist",
-                       ShareRootDir: DefaultShareDir,
-                       SdkRootDir:   DefaultSdkRootDir,
-                       HTTPPort:     DefaultPort,
+                       WebAppDir:          "www",
+                       ShareRootDir:       dfltShareDir,
+                       SdkScriptsDir:      DefaultSdkScriptsDir,
+                       XdsUtilsScriptsDir: DefaultXdsUtilsScriptsDir,
+                       SdkDbUpdate:        DefaultSdkDbUpdate,
+                       HTTPPort:           DefaultPort,
+                       SThgConf:           &SyncThingConf{Home: dfltSTHomeDir},
+                       LogsDir:            "",
+                       XdsSrvUpdateTime:   DefaultXdsSrvUpdateTime,
                },
                Log: log,
        }
 
+       c.Log.Infoln("Server UUID:          ", uuid)
+
        // config file settings overwrite default config
        err = readGlobalConfig(&c, c.Options.ConfigFile)
        if err != nil {
@@ -78,12 +129,68 @@ func Init(cliCtx *cli.Context, log *logrus.Logger) (*Config, error) {
        }
        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 directory: ", c.FileConf.LogsDir)
+
+       c.Log.Infoln("Logs file:            ", c.Options.LogFile)
+       c.Log.Infoln("Logs directory:       ", c.FileConf.LogsDir)
 
        return &c, nil
 }
+
+// ConfigRootDir return the root directory where xds server save all config files
+func ConfigRootDir() string {
+       root := "$HOME"
+       if usr, err := user.Current(); err == nil {
+               root = usr.HomeDir
+       }
+
+       // Default $HOME/.xds/server but may be changed by an env variable
+       if envVar, envDef := os.LookupEnv("XDS_SERVER_ROOT_CFG_DIR"); envDef {
+               root = envVar
+       }
+
+       return path.Join(root, "/.xds/server")
+}
+
+// WorkspaceRootDir return the path on server side where user xds-workspace dir is accessible
+func WorkspaceRootDir() string {
+       // May be overloaded by an env variable
+       if envVar, envDef := os.LookupEnv("XDS_SERVER_WORKSPACE_DIR"); envDef {
+               return envVar
+       }
+
+       home := "${HOME}"
+       if usr, err := user.Current(); err == nil {
+               home = usr.HomeDir
+       }
+
+       // Default value $HOME/xds-workspace
+       return path.Join(home, "xds-workspace")
+}