2 * Copyright (C) 2017-2018 "IoT.bzh"
3 * Author Sebastien Douheret <sebastien@iot.bzh>
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
28 common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
32 // GlobalConfigFilename Global config filename
33 GlobalConfigFilename = "server-config.json"
34 // ServerDataFilename Server data filename
35 ServerDataFilename = "server-data.xml"
36 // FoldersConfigFilename Folders config filename
37 FoldersConfigFilename = "server-config_folders.xml"
38 // TargetsConfigFilename Targets config filename
39 TargetsConfigFilename = "server-config_targets.xml"
42 // SyncThingConf definition
43 type SyncThingConf struct {
44 BinDir string `json:"binDir"`
45 Home string `json:"home"`
46 GuiAddress string `json:"gui-address"`
47 GuiAPIKey string `json:"gui-apikey"`
48 RescanIntervalS int `json:"rescanIntervalS"`
51 // FileConfig is the JSON structure of xds-server config file (server-config.json)
52 type FileConfig struct {
53 WebAppDir string `json:"webAppDir"`
54 ShareRootDir string `json:"shareRootDir"`
55 SdkScriptsDir string `json:"sdkScriptsDir"`
56 XdsSrvUpdateScriptsDir string `json:"xdsSrvUpdateScriptsDir"`
57 SdkDbUpdate string `json:"sdkDbUpdate"`
58 HTTPPort string `json:"httpPort"`
59 SThgConf *SyncThingConf `json:"syncthing"`
60 LogsDir string `json:"logsDir"`
61 XdsSrvUpdateTime string `json:"xdsSrvUpdateTime"`
64 // readGlobalConfig reads configuration from a config file.
65 // Order to determine which config file is used:
66 // 1/ from command line option: "--config myConfig.json"
67 // 2/ $HOME/.xds/server/server-config.json file
68 // 3/ /etc/xds/server/server-config.json file
69 // 4/ <xds-server executable dir>/server-config.json file
70 func readGlobalConfig(c *Config, confFile string) error {
72 searchIn := make([]string, 0, 3)
74 searchIn = append(searchIn, confFile)
76 if _, err := user.Current(); err == nil {
77 searchIn = append(searchIn, path.Join(ConfigRootDir(), GlobalConfigFilename))
80 searchIn = append(searchIn, "/etc/xds/server/server-config.json")
83 ee, _ := os.Executable()
84 exeAbsPath, err := filepath.Abs(ee)
86 exePath, err = filepath.EvalSymlinks(exeAbsPath)
88 exePath = filepath.Dir(ee)
90 exePath = filepath.Dir(exeAbsPath)
93 searchIn = append(searchIn, path.Join(exePath, "server-config.json"))
96 for _, p := range searchIn {
97 if _, err := os.Stat(p); err == nil {
103 // No config file found
106 c.Log.Infof("Use config file: %s", *cFile)
108 // TODO move on viper package to support comments in JSON and also
109 // bind with flags (command line options)
110 // see https://github.com/spf13/viper#working-with-flags
111 fd, _ := os.Open(*cFile)
114 if err := json.NewDecoder(fd).Decode(&fCfg); err != nil {
118 // Support environment variables (IOW ${MY_ENV_VAR} syntax) in server-config.json
123 &fCfg.XdsSrvUpdateScriptsDir,
125 &fCfg.XdsSrvUpdateTime}
126 if fCfg.SThgConf != nil {
127 vars = append(vars, &fCfg.SThgConf.Home, &fCfg.SThgConf.BinDir)
129 for _, field := range vars {
131 if *field, err = common.ResolveEnvVar(*field); err != nil {
136 // Use config file settings else use default config
137 if fCfg.WebAppDir == "" {
138 fCfg.WebAppDir = c.FileConf.WebAppDir
140 if fCfg.ShareRootDir == "" {
141 fCfg.ShareRootDir = c.FileConf.ShareRootDir
143 if fCfg.SdkScriptsDir == "" {
144 fCfg.SdkScriptsDir = c.FileConf.SdkScriptsDir
146 if fCfg.XdsSrvUpdateScriptsDir == "" {
147 fCfg.XdsSrvUpdateScriptsDir = c.FileConf.XdsSrvUpdateScriptsDir
149 if fCfg.SdkDbUpdate == "" {
150 fCfg.SdkDbUpdate = c.FileConf.SdkDbUpdate
152 if fCfg.HTTPPort == "" {
153 fCfg.HTTPPort = c.FileConf.HTTPPort
155 if fCfg.LogsDir == "" {
156 fCfg.LogsDir = c.FileConf.LogsDir
158 if fCfg.XdsSrvUpdateTime == "" {
159 fCfg.XdsSrvUpdateTime = c.FileConf.XdsSrvUpdateTime
162 // Resolve webapp dir (support relative or full path)
163 fCfg.WebAppDir = strings.Trim(fCfg.WebAppDir, " ")
164 if !strings.HasPrefix(fCfg.WebAppDir, "/") && exePath != "" {
167 // Check first from current directory
168 for _, rootD := range []string{exePath, cwd} {
169 ff := path.Join(rootD, fCfg.WebAppDir, "index.html")
170 if common.Exists(ff) {
171 fCfg.WebAppDir = path.Join(rootD, fCfg.WebAppDir)
181 func configFilenameGet(cfgFile string) (string, error) {
182 return path.Join(ConfigRootDir(), cfgFile), nil
185 // FoldersConfigFilenameGet Return the FoldersConfig filename
186 func FoldersConfigFilenameGet() (string, error) {
187 return configFilenameGet(FoldersConfigFilename)
190 // TargetsConfigFilenameGet Return the TargetsConfig filename
191 func TargetsConfigFilenameGet() (string, error) {
192 return configFilenameGet(TargetsConfigFilename)
195 // ServerDataFilenameGet Return the ServerData filename
196 func ServerDataFilenameGet() (string, error) {
197 return configFilenameGet(ServerDataFilename)