Update .gitreview file
[src/xds/xds-cli.git] / cmd-exec.go
index 612851f..98ceb78 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ * 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 main
 
 import (
@@ -5,9 +23,7 @@ import (
        "os"
        "strings"
 
-       "github.com/iotbzh/xds-agent/lib/apiv1"
-       common "github.com/iotbzh/xds-common/golib"
-       "github.com/joho/godotenv"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1"
        "github.com/urfave/cli"
 )
 
@@ -15,7 +31,7 @@ func initCmdExec(cmdDef *[]cli.Command) {
        *cmdDef = append(*cmdDef, cli.Command{
                Name:   "exec",
                Usage:  "execute a command in XDS",
-               Action: exec,
+               Action: execCmd,
                Flags: []cli.Flag{
                        cli.StringFlag{
                                Name:   "id",
@@ -23,23 +39,28 @@ func initCmdExec(cmdDef *[]cli.Command) {
                                Usage:  "project ID you want to build (mandatory variable)",
                        },
                        cli.StringFlag{
-                               Name:   "rpath",
+                               Name:   "rpath, p",
                                EnvVar: "XDS_RPATH",
                                Usage:  "relative path into project",
                        },
                        cli.StringFlag{
-                               Name:   "sdkid",
+                               Name:   "sdkid, sdk",
                                EnvVar: "XDS_SDK_ID",
                                Usage:  "Cross Sdk ID to use to build project",
                        },
+                       cli.BoolFlag{
+                               Name:   "ldlibpath-no-reset",
+                               Hidden: true,
+                               EnvVar: "XDS_LD_LIBRARY_PATH_NO_RESET",
+                               Usage:  "Don't reset LD_LIBRARY_PATH before executing command",
+                       },
                },
        })
 }
 
-func exec(ctx *cli.Context) error {
+func execCmd(ctx *cli.Context) error {
        prjID := ctx.String("id")
-       confFile := ctx.String("config")
-       rPath := ctx.String("rPath")
+       rPath := ctx.String("rpath")
        sdkid := ctx.String("sdkid")
 
        // Check mandatory args
@@ -47,29 +68,12 @@ func exec(ctx *cli.Context) error {
                return cli.NewExitError("project id must be set (see --id option)", 1)
        }
 
-       // Load config file if requested
-       envMap := make(map[string]string)
-       if 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)
-               if err != nil {
-                       exitError(1, "Error loading env config file "+confFile)
-               }
-               envMap, err = godotenv.Read(confFile)
-               if err != nil {
-                       exitError(1, "Error reading env config file "+confFile)
-               }
-       }
-
        argsCommand := make([]string, len(ctx.Args()))
        copy(argsCommand, ctx.Args())
        Log.Infof("Execute: /exec %v", argsCommand)
 
        // Log useful info for debugging
-       ver := apiv1.XDSVersion{}
+       ver := xaapiv1.XDSVersion{}
        XdsVersionGet(&ver)
        Log.Infof("XDS version: %v", ver)
 
@@ -80,7 +84,8 @@ func exec(ctx *cli.Context) error {
        }
        exitChan := make(chan exitResult, 1)
 
-       IOsk.On("disconnection", func(err error) {
+       IOSkClient.On("disconnection", func(err error) {
+               Log.Debugf("WS disconnection event with err: %v\n", err)
                exitChan <- exitResult{err, 2}
        })
 
@@ -97,16 +102,25 @@ func exec(ctx *cli.Context) error {
                }
        }
 
-       IOsk.On(apiv1.ExecOutEvent, func(ev apiv1.ExecOutMsg) {
+       IOSkClient.On(xaapiv1.ExecOutEvent, func(ev xaapiv1.ExecOutMsg) {
                outFunc(ev.Timestamp, ev.Stdout, ev.Stderr)
        })
 
-       IOsk.On(apiv1.ExecExitEvent, func(ev apiv1.ExecExitMsg) {
+       IOSkClient.On(xaapiv1.ExecExitEvent, func(ev xaapiv1.ExecExitMsg) {
                exitChan <- exitResult{ev.Error, ev.Code}
        })
 
+       IOSkClient.On(xaapiv1.EVTProjectChange, func(ev xaapiv1.EventMsg) {
+               prj, _ := ev.DecodeProjectConfig()
+               Log.Infof("Event %v (%v): %v", ev.Type, ev.Time, prj)
+       })
+       evReg := xaapiv1.EventRegisterArgs{Name: xaapiv1.EVTProjectChange}
+       if err := HTTPCli.Post("/events/register", &evReg, nil); err != nil {
+               return cli.NewExitError(err, 1)
+       }
+
        // Retrieve the project definition
-       prj := apiv1.ProjectConfig{}
+       prj := xaapiv1.ProjectConfig{}
        if err := HTTPCli.Get("/projects/"+prjID, &prj); err != nil {
                return cli.NewExitError(err, 1)
        }
@@ -128,21 +142,22 @@ func exec(ctx *cli.Context) error {
        }
 
        // Build env
-       Log.Debugf("Command env: %v", envMap)
+       Log.Debugf("Command env: %v", EnvConfFileMap)
        env := []string{}
-       for k, v := range envMap {
+       for k, v := range EnvConfFileMap {
                env = append(env, k+"="+v)
        }
 
        // Send build command
-       args := apiv1.ExecArgs{
-               ID:         prjID,
-               SdkID:      sdkid,
-               Cmd:        strings.Trim(argsCommand[0], " "),
-               Args:       argsCommand[1:],
-               Env:        env,
-               RPath:      rPath,
-               CmdTimeout: 60,
+       args := xaapiv1.ExecArgs{
+               ID:               prjID,
+               SdkID:            sdkid,
+               Cmd:              strings.Trim(argsCommand[0], " "),
+               Args:             argsCommand[1:],
+               Env:              env,
+               RPath:            rPath,
+               LdLibPathNoReset: ctx.Bool("ldlibpath-no-reset"),
+               CmdTimeout:       60,
        }
 
        LogPost("POST /exec %v", args)
@@ -152,6 +167,10 @@ func exec(ctx *cli.Context) error {
 
        // Wait exit
        select {
+       case res := <-IOSkClient.ServerDiscoChan:
+               Log.Debugf("XDS Server disconnected %v", res)
+               return cli.NewExitError(res.error, res.code)
+
        case res := <-exitChan:
                errStr := ""
                if res.code == 0 {