Always close gdb pty/tty even if an error rises.
[src/xds/xds-server.git] / main.go
diff --git a/main.go b/main.go
index 65ab7a0..6089e74 100644 (file)
--- a/main.go
+++ b/main.go
@@ -14,6 +14,7 @@ import (
        "github.com/Sirupsen/logrus"
        "github.com/codegangsta/cli"
        "github.com/iotbzh/xds-server/lib/crosssdk"
+       "github.com/iotbzh/xds-server/lib/folder"
        "github.com/iotbzh/xds-server/lib/model"
        "github.com/iotbzh/xds-server/lib/syncthing"
        "github.com/iotbzh/xds-server/lib/webserver"
@@ -40,17 +41,18 @@ var AppSubVersion = "unknown-dev"
 
 // Context holds the XDS server context
 type Context struct {
-       ProgName    string
-       Cli         *cli.Context
-       Config      *xdsconfig.Config
-       Log         *logrus.Logger
-       SThg        *st.SyncThing
-       SThgCmd     *exec.Cmd
-       SThgInotCmd *exec.Cmd
-       MFolders    *model.Folders
-       SDKs        *crosssdk.SDKs
-       WWWServer   *webserver.Server
-       Exit        chan os.Signal
+       ProgName      string
+       Cli           *cli.Context
+       Config        *xdsconfig.Config
+       Log           *logrus.Logger
+       LogLevelSilly bool
+       SThg          *st.SyncThing
+       SThgCmd       *exec.Cmd
+       SThgInotCmd   *exec.Cmd
+       MFolders      *model.Folders
+       SDKs          *crosssdk.SDKs
+       WWWServer     *webserver.Server
+       Exit          chan os.Signal
 }
 
 // NewContext Create a new instance of XDS server
@@ -70,12 +72,15 @@ func NewContext(cliCtx *cli.Context) *Context {
        }
        log.Formatter = &logrus.TextFormatter{}
 
+       sillyVal, sillyLog := os.LookupEnv("XDS_LOG_SILLY")
+
        // Define default configuration
        ctx := Context{
-               ProgName: cliCtx.App.Name,
-               Cli:      cliCtx,
-               Log:      log,
-               Exit:     make(chan os.Signal, 1),
+               ProgName:      cliCtx.App.Name,
+               Cli:           cliCtx,
+               Log:           log,
+               LogLevelSilly: (sillyLog && sillyVal == "1"),
+               Exit:          make(chan os.Signal, 1),
        }
 
        // register handler on SIGTERM / exit
@@ -101,6 +106,14 @@ func handlerSigTerm(ctx *Context) {
        os.Exit(0)
 }
 
+// Helper function to log message on both stdout and logger
+func logPrint(ctx *Context, format string, args ...interface{}) {
+       fmt.Printf(format, args...)
+       if ctx.Log.Out != os.Stdout {
+               ctx.Log.Infof(format, args...)
+       }
+}
+
 // XDS Server application main routine
 func xdsApp(cliCtx *cli.Context) error {
        var err error
@@ -115,24 +128,31 @@ func xdsApp(cliCtx *cli.Context) error {
        }
        ctx.Config = cfg
 
-       // Logs redirected into a file when logsDir is set
-       logfilename := cliCtx.GlobalString("logfile")
-       if ctx.Config.FileConf.LogsDir != "" && logfilename != "stdout" {
-               if logfilename == "" {
-                       logfilename = "xds-server.log"
-               }
-               // is it an absolute path ?
-               logFile := logfilename
-               if logfilename[0] == '.' || logfilename[0] != '/' {
-                       logFile = filepath.Join(ctx.Config.FileConf.LogsDir, logfilename)
+       // Logs redirected into a file when logfile option or logsDir config is set
+       ctx.Config.LogVerboseOut = os.Stderr
+       if ctx.Config.FileConf.LogsDir != "" {
+               if ctx.Config.Options.LogFile != "stdout" {
+                       logFile := ctx.Config.Options.LogFile
+
+                       fdL, err := os.OpenFile(logFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
+                       if err != nil {
+                               msgErr := fmt.Sprintf("Cannot create log file %s", logFile)
+                               return cli.NewExitError(msgErr, int(syscall.EPERM))
+                       }
+                       ctx.Log.Out = fdL
+
+                       logPrint(ctx, "Logging file: %s\n", logFile)
                }
-               fmt.Printf("Logging file: %s\n", logFile)
-               fdL, err := os.OpenFile(logFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
+
+               logFileHTTPReq := filepath.Join(ctx.Config.FileConf.LogsDir, "xds-server-verbose.log")
+               fdLH, err := os.OpenFile(logFileHTTPReq, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
                if err != nil {
-                       msgErr := fmt.Sprintf("Cannot create log file %s", logFile)
+                       msgErr := fmt.Sprintf("Cannot create log file %s", logFileHTTPReq)
                        return cli.NewExitError(msgErr, int(syscall.EPERM))
                }
-               ctx.Log.Out = fdL
+               ctx.Config.LogVerboseOut = fdLH
+
+               logPrint(ctx, "Logging file for HTTP requests:  %s\n", logFileHTTPReq)
        }
 
        // Create syncthing instance when section "syncthing" is present in config.json
@@ -147,17 +167,17 @@ func xdsApp(cliCtx *cli.Context) error {
                if err != nil {
                        return cli.NewExitError(err, -4)
                }
-               fmt.Printf("Syncthing started (PID %d)\n", ctx.SThgCmd.Process.Pid)
+               logPrint(ctx, "Syncthing started (PID %d)\n", ctx.SThgCmd.Process.Pid)
 
                ctx.Log.Infof("Starting Syncthing-inotify...")
                ctx.SThgInotCmd, err = ctx.SThg.StartInotify()
                if err != nil {
                        return cli.NewExitError(err, -4)
                }
-               fmt.Printf("Syncthing-inotify started (PID %d)\n", ctx.SThgInotCmd.Process.Pid)
+               logPrint(ctx, "Syncthing-inotify started (PID %d)\n", ctx.SThgInotCmd.Process.Pid)
 
                // Establish connection with local Syncthing (retry if connection fail)
-               fmt.Printf("Establishing connection with Syncthing...\n")
+               logPrint(ctx, "Establishing connection with Syncthing...\n")
                time.Sleep(2 * time.Second)
                maxRetry := 30
                retry := maxRetry
@@ -178,6 +198,7 @@ func xdsApp(cliCtx *cli.Context) error {
                if ctx.Config.Builder, err = xdsconfig.NewBuilderConfig(ctx.SThg.MyID); err != nil {
                        return cli.NewExitError(err, -4)
                }
+               ctx.Config.SupportedSharing[folder.TypeCloudSync] = true
        }
 
        // Init model folder
@@ -194,8 +215,10 @@ func xdsApp(cliCtx *cli.Context) error {
                return cli.NewExitError(err, -6)
        }
 
-       // Create and start Web Server
-       ctx.WWWServer = webserver.New(ctx.Config, ctx.MFolders, ctx.SDKs, ctx.Log)
+       // Create Web Server
+       ctx.WWWServer = webserver.New(ctx.Config, ctx.MFolders, ctx.SDKs, ctx.Log, ctx.LogLevelSilly)
+
+       // Run Web Server until exit requested (blocking call)
        if err = ctx.WWWServer.Serve(); err != nil {
                ctx.Log.Println(err)
                return cli.NewExitError(err, -7)