+/*
+ * Copyright (C) 2017 "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 st
import (
// SyncThing .
type SyncThing struct {
- BaseURL string
- APIKey string
- Home string
- STCmd *exec.Cmd
- STICmd *exec.Cmd
- MyID string
+ BaseURL string
+ APIKey string
+ Home string
+ STCmd *exec.Cmd
+ STICmd *exec.Cmd
+ MyID string
+ Connected bool
+ Events *Events
// Private fields
binDir string
logsDir string
exitSTChan chan ExitChan
exitSTIChan chan ExitChan
- conf *xdsconfig.Config
client *common.HTTPClient
log *logrus.Logger
- Events *Events
+ conf *xdsconfig.Config
}
// ExitChan Channel used for process exit
// NewSyncThing creates a new instance of Syncthing
func NewSyncThing(conf *xdsconfig.Config, log *logrus.Logger) *SyncThing {
var url, apiKey, home, binDir string
- var err error
stCfg := conf.FileConf.SThgConf
if stCfg != nil {
}
if url == "" {
- url = "http://localhost:8384"
+ url = "http://localhost:8385"
}
if url[0:7] != "http://" {
url = "http://" + url
}
if home == "" {
- home = "/mnt/share"
- }
-
- if binDir == "" {
- if binDir, err = filepath.Abs(filepath.Dir(os.Args[0])); err != nil {
- binDir = "/usr/local/bin"
- }
+ panic("home parameter must be set")
}
s := SyncThing{
// Start Starts syncthing process
func (s *SyncThing) startProc(exeName string, args []string, env []string, eChan *chan ExitChan) (*exec.Cmd, error) {
+ var err error
+ var exePath string
// Kill existing process (useful for debug ;-) )
if os.Getenv("DEBUG_MODE") != "" {
- exec.Command("bash", "-c", "pkill -9 "+exeName).Output()
+ fmt.Printf("\n!!! DEBUG_MODE set: KILL existing %s process(es) !!!\n", exeName)
+ exec.Command("bash", "-c", "ps -ax |grep "+exeName+" |grep "+s.BaseURL+" |cut -d' ' -f 1|xargs -I{} kill -9 {}").Output()
}
- path, err := exec.LookPath(path.Join(s.binDir, exeName))
+ // When not set (or set to '.') set bin to path of xds-agent executable
+ bdir := s.binDir
+ if bdir == "" || bdir == "." {
+ exe, _ := os.Executable()
+ if exeAbsPath, err := filepath.Abs(exe); err == nil {
+ if exePath, err := filepath.EvalSymlinks(exeAbsPath); err == nil {
+ bdir = filepath.Dir(exePath)
+ }
+ }
+ }
+
+ exePath, err = exec.LookPath(path.Join(bdir, exeName))
if err != nil {
- return nil, fmt.Errorf("Cannot find %s executable in %s", exeName, s.binDir)
+ // Let's try in /opt/AGL/bin
+ exePath, err = exec.LookPath(path.Join("opt", "AGL", "bin", exeName))
+ if err != nil {
+ return nil, fmt.Errorf("Cannot find %s executable in %s", exeName, bdir)
+ }
}
- cmd := exec.Command(path, args...)
+ cmd := exec.Command(exePath, args...)
cmd.Env = os.Environ()
for _, ev := range env {
cmd.Env = append(cmd.Env, ev)
env := []string{
"STNODEFAULTFOLDER=1",
"STNOUPGRADE=1",
- "STNORESTART=1", // FIXME SEB remove ?
}
s.STCmd, err = s.startProc("syncthing", args, env, &s.exitSTChan)
// Connect Establish HTTP connection with Syncthing
func (s *SyncThing) Connect() error {
var err error
+ s.Connected = false
s.client, err = common.HTTPNewClient(s.BaseURL,
common.HTTPClientConfig{
URLPrefix: "/rest",
HeaderClientKeyName: "X-Syncthing-ID",
+ LogOut: s.conf.LogVerboseOut,
+ LogPrefix: "SYNCTHING: ",
+ LogLevel: common.HTTPLogLevelWarning,
})
+ s.client.SetLogLevel(s.log.Level.String())
+
if err != nil {
msg := ": " + err.Error()
if strings.Contains(err.Error(), "connection refused") {
return fmt.Errorf("ERROR: cannot connect to Syncthing (null client)")
}
- // Redirect HTTP log into a file
- s.client.SetLogLevel(s.conf.Log.Level.String())
- s.client.LoggerPrefix = "SYNCTHING: "
- s.client.LoggerOut = s.conf.LogVerboseOut
-
s.MyID, err = s.IDGet()
if err != nil {
return fmt.Errorf("ERROR: cannot retrieve ID")
}
+ s.Connected = true
+
// Start events monitoring
err = s.Events.Start()