Use go module as dependency tool instead of glide
[src/xds/xds-server.git] / lib / xdsserver / xdsserver.go
index dcdedc4..b6c6f2f 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ * 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 xdsserver
 
 import (
@@ -9,31 +26,34 @@ import (
        "syscall"
        "time"
 
+       st "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/syncthing"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xdsconfig"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
        "github.com/Sirupsen/logrus"
        "github.com/codegangsta/cli"
-       "github.com/iotbzh/xds-server/lib/xsapiv1"
-
-       "github.com/iotbzh/xds-server/lib/syncthing"
-       "github.com/iotbzh/xds-server/lib/xdsconfig"
 )
 
 const cookieMaxAge = "3600"
 
 // Context holds the XDS server context
 type Context struct {
-       ProgName      string
-       Cli           *cli.Context
-       Config        *xdsconfig.Config
-       Log           *logrus.Logger
-       LogLevelSilly bool
-       SThg          *st.SyncThing
-       SThgCmd       *exec.Cmd
-       SThgInotCmd   *exec.Cmd
-       mfolders      *Folders
-       sdks          *SDKs
-       WWWServer     *WebServer
-       sessions      *Sessions
-       Exit          chan os.Signal
+       ProgName         string
+       Cli              *cli.Context
+       Config           *xdsconfig.Config
+       Log              *logrus.Logger
+       LogLevelSilly    bool
+       LogSillyf        func(format string, args ...interface{})
+       SThg             *st.SyncThing
+       SThgCmd          *exec.Cmd
+       SThgInotCmd      *exec.Cmd
+       mfolders         *Folders
+       sdks             *SDKs
+       targets          *Targets
+       WWWServer        *WebServer
+       sessions         *Sessions
+       events           *Events
+       lockXdsSrvUpdate LockXdsUpdate
+       Exit             chan os.Signal
 }
 
 // NewXdsServer Create a new instance of XDS server
@@ -53,15 +73,24 @@ func NewXdsServer(cliCtx *cli.Context) *Context {
        }
        log.Formatter = &logrus.TextFormatter{}
 
+       // Support silly logging (printed on log.debug)
        sillyVal, sillyLog := os.LookupEnv("XDS_LOG_SILLY")
+       logSilly := sillyLog && sillyVal == "1"
+       sillyFunc := func(format string, args ...interface{}) {
+               if logSilly {
+                       log.Debugf("SILLY: "+format, args...)
+               }
+       }
 
        // Define default configuration
        ctx := Context{
-               ProgName:      cliCtx.App.Name,
-               Cli:           cliCtx,
-               Log:           log,
-               LogLevelSilly: (sillyLog && sillyVal == "1"),
-               Exit:          make(chan os.Signal, 1),
+               ProgName:         cliCtx.App.Name,
+               Cli:              cliCtx,
+               Log:              log,
+               LogLevelSilly:    logSilly,
+               LogSillyf:        sillyFunc,
+               lockXdsSrvUpdate: LockXdsUpdate{LockCpt: 0},
+               Exit:             make(chan os.Signal, 1),
        }
 
        // register handler on SIGTERM / exit
@@ -102,7 +131,10 @@ func (ctx *Context) Run() (int, error) {
                ctx._logPrint("Logging file for HTTP requests:  %s\n", logFileHTTPReq)
        }
 
-       // Create syncthing instance when section "syncthing" is present in config.json
+       // Create events management
+       ctx.events = EventsConstructor(ctx)
+
+       // Create syncthing instance when section "syncthing" is present in server-config.json
        if ctx.Config.FileConf.SThgConf != nil {
                ctx.SThg = st.NewSyncThing(ctx.Config, ctx.Log)
        }
@@ -149,7 +181,7 @@ func (ctx *Context) Run() (int, error) {
        }
 
        // Init model folder
-       ctx.mfolders = FoldersNew(ctx)
+       ctx.mfolders = FoldersConstructor(ctx)
 
        // Load initial folders config from disk
        if err := ctx.mfolders.LoadConfig(); err != nil {
@@ -157,16 +189,28 @@ func (ctx *Context) Run() (int, error) {
        }
 
        // Init cross SDKs
-       ctx.sdks, err = NewSDKs(ctx)
+       ctx.sdks, err = SDKsConstructor(ctx)
        if err != nil {
                return -6, err
        }
 
+       // Init target and terminals model
+       ctx.targets = TargetsConstructor(ctx)
+
+       // Load initial target & terminal config
+       if err := ctx.targets.LoadConfig(); err != nil {
+               return -6, err
+       }
+
        // Create Web Server
-       ctx.WWWServer = NewWebServer(ctx)
+       ctx.WWWServer = WebServerConstructor(ctx)
 
        // Sessions manager
-       ctx.sessions = NewClientSessions(ctx, cookieMaxAge)
+       ctx.sessions = ClientSessionsConstructor(ctx, cookieMaxAge)
+
+       // Check if a new package version is available
+       // and monitor updates
+       MonitorUpdates(ctx)
 
        // Run Web Server until exit requested (blocking call)
        if err = ctx.WWWServer.Serve(); err != nil {