Fix logfile setting
[src/xds/xds-agent.git] / lib / xdsconfig / config.go
index 854d383..16390ae 100644 (file)
@@ -1,25 +1,52 @@
+/*
+ * 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"
+       "path/filepath"
 
        "os"
 
+       common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
        "github.com/Sirupsen/logrus"
-       "github.com/codegangsta/cli"
-       common "github.com/iotbzh/xds-common/golib"
+       uuid "github.com/satori/go.uuid"
+       "github.com/urfave/cli"
 )
 
 // Config parameters (json format) of /config command
 type Config struct {
-       Version       string `json:"version"`
-       APIVersion    string `json:"apiVersion"`
-       VersionGitTag string `json:"gitTag"`
-
-       // Private / un-exported fields
-       HTTPPort string         `json:"-"`
-       FileConf *FileConfig    `json:"-"`
-       Log      *logrus.Logger `json:"-"`
+       AgentUID      string
+       Version       string
+       APIVersion    string
+       VersionGitTag string
+       Options       Options
+       FileConf      FileConfig
+       Log           *logrus.Logger
+       LogVerboseOut io.Writer
+}
+
+// Options set at the command line
+type Options struct {
+       ConfigFile string
+       LogLevel   string
+       LogFile    string
 }
 
 // Config default values
@@ -32,39 +59,94 @@ const (
 func Init(ctx *cli.Context, log *logrus.Logger) (*Config, error) {
        var err error
 
+       defaultWebAppDir := "${EXEPATH}/www"
+       defaultSTHomeDir := "${HOME}/.xds/agent/syncthing-config"
+
+       // TODO: allocate uuid only the first time and save+reuse it later
+       uuid := uuid.NewV1().String()
+
        // Define default configuration
        c := Config{
+               AgentUID:      uuid,
                Version:       ctx.App.Metadata["version"].(string),
                APIVersion:    DefaultAPIVersion,
                VersionGitTag: ctx.App.Metadata["git-tag"].(string),
 
-               HTTPPort: "8010",
-               FileConf: &FileConfig{
-                       LogsDir: "/tmp/logs",
+               Options: Options{
+                       ConfigFile: ctx.GlobalString("config"),
+                       LogLevel:   ctx.GlobalString("log"),
+                       LogFile:    ctx.GlobalString("logfile"),
+               },
+
+               FileConf: FileConfig{
+                       HTTPPort:  "8800",
+                       WebAppDir: defaultWebAppDir,
+                       LogsDir:   "/tmp/logs",
+                       ServersConf: []XDSServerConf{
+                               XDSServerConf{
+                                       URL:       "http://localhost:8000",
+                                       ConnRetry: 10,
+                               },
+                       },
                        SThgConf: &SyncThingConf{
-                               Home: "${HOME}/.xds/agent/syncthing-config",
+                               Home: defaultSTHomeDir,
+                       },
+                       ProfileConf: ProfileConfT{
+                               XDSBinder: XDSBinderConf{
+                                       URL:       "http://localhost:8810",
+                                       ConnRetry: 10,
+                               },
                        },
                },
                Log: log,
        }
 
+       c.Log.Infoln("Agent UUID:     ", uuid)
+
        // config file settings overwrite default config
-       c.FileConf, err = updateConfigFromFile(&c, ctx.GlobalString("config"))
+       err = readGlobalConfig(&c, c.Options.ConfigFile)
        if err != nil {
                return nil, err
        }
 
+       // Handle where Logs are redirected:
+       //  default 'stdout' (logfile option default value)
+       //  else use file (or filepath) set by --logfile option
+       //  else use LogsDir field of config file
+       logF := c.Options.LogFile
+       logD := c.FileConf.LogsDir
+       if logF != "stdout" {
+               if logF != "" {
+                       if common.IsDir(logF) {
+                               logD = logF
+                               logF = filepath.Join(logF, "xds-agent.log")
+                       } else {
+                               logD = filepath.Dir(logF)
+                       }
+               } else if logD != "" {
+                       lf := filepath.Base(logF)
+                       if lf == "" || lf == "." {
+                               lf = "xds-agent.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
 }
-
-// UpdateAll Update the current configuration
-func (c *Config) UpdateAll(newCfg Config) error {
-       return fmt.Errorf("Not Supported")
-}