+/*
+ * 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 (
"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"
)
*cmdDef = append(*cmdDef, cli.Command{
Name: "exec",
Usage: "execute a command in XDS",
- Action: exec,
+ Action: execCmd,
Flags: []cli.Flag{
cli.StringFlag{
Name: "id",
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
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)
}
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}
})
}
}
- 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)
}
}
// 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)
// 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 {