Added logfile support
[src/xds/xds-cli.git] / main.go
diff --git a/main.go b/main.go
index c8effe6..f9b32f3 100644 (file)
--- a/main.go
+++ b/main.go
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 "IoT.bzh"
+ * Copyright (C) 2017-2018 "IoT.bzh"
  * Author Sebastien Douheret <sebastien@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,9 +28,10 @@ import (
        "strings"
        "text/tabwriter"
 
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1"
+       common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
        "github.com/Sirupsen/logrus"
-       "github.com/iotbzh/xds-agent/lib/xaapiv1"
-       common "github.com/iotbzh/xds-common/golib"
+
        "github.com/joho/godotenv"
        socketio_client "github.com/sebd71/go-socket.io-client"
        "github.com/urfave/cli"
@@ -57,7 +58,7 @@ var AppSubVersion = "unknown-dev"
 
 // Application details
 const (
-       appCopyright    = "Copyright (C) 2017 IoT.bzh - Apache-2.0"
+       appCopyright    = "Copyright (C) 2017-2018 IoT.bzh - Apache-2.0"
        defaultLogLevel = "error"
 )
 
@@ -176,6 +177,12 @@ func main() {
                        Usage:  "logging level (supported levels: panic, fatal, error, warn, info, debug)",
                        Value:  defaultLogLevel,
                },
+               cli.StringFlag{
+                       Name:   "logfile",
+                       Value:  "stderr",
+                       Usage:  "filename where logs will be redirected (default stderr)\n\t",
+                       EnvVar: "XDS_LOGFILENAME",
+               },
                cli.StringFlag{
                        Name:   "url, u",
                        EnvVar: "XDS_AGENT_URL",
@@ -205,8 +212,8 @@ func main() {
 
        // Add --config option to all commands to support --config option either before or after command verb
        // IOW support following both syntaxes:
-       //   xds-cli exec --config myprj.conf ...
-       //   xds-cli --config myprj.conf exec ...
+       //   xds-cli exec --config myPrj.conf ...
+       //   xds-cli --config myPrj.conf exec ...
        for i, cmd := range app.Commands {
                if len(cmd.Flags) > 0 {
                        app.Commands[i].Flags = append(cmd.Flags, cli.StringFlag{Hidden: true, Name: "config, c"})
@@ -232,11 +239,16 @@ func main() {
        // Load config file if requested
        if confFile != "" {
                earlyPrintf("confFile detected: %v", confFile)
+               confFile, err := common.ResolveEnvVar(confFile)
+               if err != nil {
+                       exitError(1, "Error while resolving confFile: %v", err)
+               }
+               earlyPrintf("Resolved confFile: %v", confFile)
                if !common.Exists(confFile) {
                        exitError(1, "Error env config file not found")
                }
                // Load config file variables that will overwrite env variables
-               err := godotenv.Overload(confFile)
+               err = godotenv.Overload(confFile)
                if err != nil {
                        exitError(1, "Error loading env config file "+confFile)
                }
@@ -271,6 +283,17 @@ func main() {
                }
                Log.Formatter = &logrus.TextFormatter{}
 
+               if ctx.String("logfile") != "stderr" {
+                       logFile, _ := common.ResolveEnvVar(ctx.String("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, 1)
+                       }
+                       Log.Infof("Logging to file: %s", logFile)
+                       Log.Out = fdL
+               }
+
                Log.Infof("%s version: %s", AppName, app.Version)
                earlyDisplay()
                Log.Debugf("\nEnvironment: %v\n", os.Environ())
@@ -315,6 +338,11 @@ func XdsConnInit(ctx *cli.Context) error {
                serverURL = "http://" + serverURL
        }
 
+       lvl := common.HTTPLogLevelWarning
+       if Log.Level == logrus.DebugLevel {
+               lvl = common.HTTPLogLevelDebug
+       }
+
        // Create HTTP client
        Log.Debugln("Connect HTTP client on ", agentURL)
        conf := common.HTTPClientConfig{
@@ -323,15 +351,22 @@ func XdsConnInit(ctx *cli.Context) error {
                CsrfDisable:         true,
                LogOut:              Log.Out,
                LogPrefix:           "XDSAGENT: ",
-               LogLevel:            common.HTTPLogLevelWarning,
+               LogLevel:            lvl,
        }
 
        HTTPCli, err = common.HTTPNewClient(agentURL, conf)
        if err != nil {
                errmsg := err.Error()
-               if m, err := regexp.MatchString("Get http.?://", errmsg); m && err == nil {
+               m, err := regexp.MatchString("Get http.?://", errmsg)
+               if (m && err == nil) || strings.Contains(errmsg, "Failed to get device ID") {
                        i := strings.LastIndex(errmsg, ":")
-                       errmsg = "Cannot connection to " + agentURL + errmsg[i:]
+                       newErr := "Cannot connection to " + agentURL
+                       if i > 0 {
+                               newErr += " (" + strings.TrimSpace(errmsg[i+1:]) + ")"
+                       } else {
+                               newErr += " (" + strings.TrimSpace(errmsg) + ")"
+                       }
+                       errmsg = newErr
                }
                return cli.NewExitError(errmsg, 1)
        }
@@ -371,6 +406,9 @@ func XdsConnInit(ctx *cli.Context) error {
        if err := XdsConfigGet(&xdsConf); err != nil {
                return cli.NewExitError("ERROR while getting XDS config: "+err.Error(), 1)
        }
+       if len(xdsConf.Servers) < 1 {
+               return cli.NewExitError("No XDS Server connected", 1)
+       }
        svrCfg := xdsConf.Servers[XdsServerIndexGet()]
        if (serverURL != "" && svrCfg.URL != serverURL) || !svrCfg.Connected {
                Log.Infof("Update XDS Server config: serverURL=%v, svrCfg=%v", serverURL, svrCfg)