aboutsummaryrefslogtreecommitdiffstats
path: root/lib/xdsconfig/config.go
blob: 56a9cf9e2eac20bea07194f108405127e7844627 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package xdsconfig

import (
	"fmt"
	"io"
	"path/filepath"

	"os"

	"github.com/Sirupsen/logrus"
	"github.com/urfave/cli"
	common "github.com/iotbzh/xds-common/golib"
	uuid "github.com/satori/go.uuid"
)

// Config parameters (json format) of /config command
type Config struct {
	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
const (
	DefaultAPIVersion = "1"
	DefaultLogLevel   = "error"
)

// Init loads the configuration on start-up
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),

		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: defaultSTHomeDir,
			},
		},
		Log: log,
	}

	c.Log.Infoln("Agent UUID:     ", uuid)

	// config file settings overwrite default 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
	//  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-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
}