/*
- * 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");
"fmt"
"os"
"regexp"
+ "runtime"
"strconv"
"strings"
"syscall"
"text/tabwriter"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1"
+ common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git"
"github.com/Sirupsen/logrus"
- "github.com/iotbzh/xds-agent/lib/xaapiv1"
- common "github.com/iotbzh/xds-common/golib"
sio_client "github.com/sebd71/go-socket.io-client"
)
// SetConfig set additional config fields
func (g *GdbXds) SetConfig(name string, value interface{}) error {
+ var val string
+ if name != "listProject" {
+ val = strings.TrimSpace(value.(string))
+ }
switch name {
case "agentURL":
- g.agentURL = value.(string)
+ g.agentURL = val
case "serverURL":
- g.serverURL = value.(string)
+ g.serverURL = val
case "prjID":
- g.prjID = value.(string)
+ g.prjID = val
case "sdkID":
- g.sdkID = value.(string)
+ g.sdkID = val
case "rPath":
- g.rPath = value.(string)
+ g.rPath = val
case "listProject":
g.listPrj = value.(bool)
default:
}
})
+ // Monitor XDS server configuration changes (and specifically connected status)
+ iosk.On(xaapiv1.EVTServerConfig, func(ev xaapiv1.EventMsg) {
+ svrCfg, err := ev.DecodeServerCfg()
+ if err == nil && !svrCfg.Connected {
+ // TODO: should wait that server will be connected back
+ if g.cbOnExit != nil {
+ g.cbOnExit(-1, fmt.Errorf("XDS Server disconnected"))
+ } else {
+ fmt.Printf("XDS Server disconnected")
+ os.Exit(-1)
+ }
+ }
+ })
+
+ args := xaapiv1.EventRegisterArgs{Name: xaapiv1.EVTServerConfig}
+ if err := g.httpCli.Post("/events/register", args, nil); err != nil {
+ return 0, err
+ }
+
return 0, nil
}
// except if XDS_GDBSERVER_OUTPUT_NOFIX is defined
_, gdbserverNoFix := os.LookupEnv("XDS_GDBSERVER_OUTPUT_NOFIX")
+ // SDK ID must be set else $GDB cannot be resolved
+ if g.sdkID == "" {
+ return int(syscall.EINVAL), fmt.Errorf("sdkid must be set")
+ }
+
args := xaapiv1.ExecArgs{
ID: g.prjID,
SdkID: g.sdkID,
// Write writes message/string into gdb stdin
func (g *GdbXds) Write(args ...interface{}) error {
- return g.ioSock.Emit(xaapiv1.ExecInEvent, args...)
+ s := fmt.Sprint(args...)
+ return g.ioSock.Emit(xaapiv1.ExecInEvent, []byte(s))
}
// SendSignal is used to send a signal to remote process/gdb
//***** Private functions *****
func (g *GdbXds) printProjectsList() (int, error) {
+ var prjExample *xaapiv1.ProjectConfig
+ var sdkExample *xaapiv1.SDK
+
writer := new(tabwriter.Writer)
writer.Init(os.Stdout, 0, 8, 0, '\t', 0)
msg := ""
if len(g.projects) > 0 {
fmt.Fprintln(writer, "List of existing projects (use: export XDS_PROJECT_ID=<< ID >>):")
fmt.Fprintln(writer, "ID \t Label")
- for _, f := range g.projects {
+ for ii, f := range g.projects {
fmt.Fprintf(writer, " %s \t %s\n", f.ID, f.Label)
+ prjExample = &g.projects[ii]
}
}
}
fmt.Fprintln(writer, "\nList of installed cross SDKs (use: export XDS_SDK_ID=<< ID >>):")
fmt.Fprintln(writer, "ID \t Name")
- for _, s := range sdks {
- fmt.Fprintf(writer, " %s \t %s\n", s.ID, s.Name)
+ for ii, s := range sdks {
+ if s.Status == xaapiv1.SdkStatusInstalled {
+ fmt.Fprintf(writer, " %s \t %s\n", s.ID, s.Name)
+ sdkExample = &sdks[ii]
+ }
}
- if len(g.projects) > 0 && len(sdks) > 0 {
+ if prjExample != nil && sdkExample != nil {
fmt.Fprintln(writer, "")
fmt.Fprintln(writer, "For example: ")
- fmt.Fprintf(writer, " XDS_PROJECT_ID=%s XDS_SDK_ID=%s %s -x myGdbConf.ini\n",
- g.projects[0].ID[:8], sdks[0].ID[:8], AppName)
+ if runtime.GOOS == "windows" {
+ fmt.Fprintf(writer, " SET XDS_PROJECT_ID=%s && SET XDS_SDK_ID=%s && %s -x myGdbConf.ini\n",
+ prjExample.ID[:8], sdkExample.ID[:8], AppName)
+ } else {
+ fmt.Fprintf(writer, " XDS_PROJECT_ID=%s XDS_SDK_ID=%s %s -x myGdbConf.ini\n",
+ prjExample.ID[:8], sdkExample.ID[:8], AppName)
+ }
}
fmt.Fprintln(writer, "")
fmt.Fprintln(writer, "Or define settings within gdb configuration file (see help and :XDS-ENV: tag)")