X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsconfig%2Fconfig.go;h=ee20bd228f874105d2816db50809dcb1919aa216;hb=e97eebc18d726aa55738d7e19513491cf58a6e3a;hp=3f8a91d5eee43e05203d0cb2979473427c05cb36;hpb=c07adb807c41a1545a9a0f5bbf40080d86946538;p=src%2Fxds%2Fxds-server.git diff --git a/lib/xdsconfig/config.go b/lib/xdsconfig/config.go index 3f8a91d..ee20bd2 100644 --- a/lib/xdsconfig/config.go +++ b/lib/xdsconfig/config.go @@ -1,83 +1,159 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * 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" + "path/filepath" + common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1" "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" ) // 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"` - Folders FoldersConfig `json:"folders"` + // Public APIConfig fields + xsapiv1.APIConfig // 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" + DefaultAPIVersion = "1" + DefaultPort = "8000" + DefaultShareDir = "${HOME}/.xds/server/projects" + DefaultSTHomeDir = "${HOME}/.xds/server/syncthing-config" + DefaultSdkScriptsDir = "${EXEPATH}/sdks" + DefaultSdkDbUpdate = "startup" ) // 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 + } + + // 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{}, - Folders: FoldersConfig{}, - - WebAppDir: "webapp/dist", - HTTPPort: DefaultPort, - ShareRootDir: DefaultShareDir, - Log: log, + 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"), + LogLevel: cliCtx.GlobalString("log"), + LogFile: cliCtx.GlobalString("logfile"), + NoFolderConfig: cliCtx.GlobalBool("no-folderconfig"), + }, + FileConf: FileConfig{ + WebAppDir: "webapp/dist", + ShareRootDir: dfltShareDir, + SdkScriptsDir: DefaultSdkScriptsDir, + SdkDbUpdate: DefaultSdkDbUpdate, + HTTPPort: DefaultPort, + SThgConf: &SyncThingConf{Home: dfltSTHomeDir}, + LogsDir: "", + }, + Log: log, } + c.Log.Infoln("Server UUID: ", uuid) + // 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 !dirExists(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 != "" && !dirExists(c.FileConf.LogsDir) { + 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) - return &c, nil -} + c.Log.Infoln("Logs file: ", c.Options.LogFile) + c.Log.Infoln("Logs directory: ", c.FileConf.LogsDir) -func dirExists(path string) bool { - _, err := os.Stat(path) - if os.IsNotExist(err) { - return false - } - return true + return &c, nil }