X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=gdb-xds.go;h=54f2270f189eac4836520e41b2d4e7c1a7a623c6;hb=b14158a8c5c4fdd440bc19c5c72f25a15699d29a;hp=d57817d9ea6720cf61ae2c8d61200bba6ecfd0a0;hpb=9a0c120497cfe3cfdca6dfd084e999b6ab915ce8;p=src%2Fxds%2Fxds-gdb.git diff --git a/gdb-xds.go b/gdb-xds.go index d57817d..54f2270 100644 --- a/gdb-xds.go +++ b/gdb-xds.go @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 "IoT.bzh" + * Copyright (C) 2017-2018 "IoT.bzh" * Author Sebastien Douheret * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,13 +23,15 @@ import ( "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/golib" "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" ) @@ -76,17 +78,21 @@ func NewGdbXds(log *logrus.Logger, args []string, env []string) *GdbXds { // 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: @@ -120,14 +126,22 @@ func (g *GdbXds) Init() (int, error) { HeaderClientKeyName: "Xds-Agent-Sid", CsrfDisable: true, LogOut: g.log.Out, - LogLevel: common.HTTPLogLevelWarning, + LogPrefix: "XDSAGENT: ", + LogLevel: common.HTTPLogLevelDebug, } c, err := common.HTTPNewClient(baseURL, 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 " + baseURL + errmsg[i:] + newErr := "Cannot connection to " + baseURL + if i > 0 { + newErr += " (" + strings.TrimSpace(errmsg[i+1:]) + ")" + } else { + newErr += " (" + strings.TrimSpace(errmsg) + ")" + } + errmsg = newErr } return int(syscallEBADE), fmt.Errorf(errmsg) } @@ -246,6 +260,25 @@ func (g *GdbXds) Init() (int, error) { } }) + // 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 } @@ -295,6 +328,11 @@ func (g *GdbXds) Start(inferiorTTY bool) (int, error) { // 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, @@ -363,7 +401,8 @@ func (g *GdbXds) InferiorRead(f func(timestamp, stdout, stderr string)) { // 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 @@ -383,17 +422,15 @@ func (g *GdbXds) SendSignal(sig os.Signal) error { //***** Private functions ***** func (g *GdbXds) printProjectsList() (int, error) { + writer := new(tabwriter.Writer) + writer.Init(os.Stdout, 0, 8, 0, '\t', 0) msg := "" if len(g.projects) > 0 { - msg += "List of existing projects (use: export XDS_PROJECT_ID=<< ID >>): \n" - msg += " ID\t\t\t\t | Label" + fmt.Fprintln(writer, "List of existing projects (use: export XDS_PROJECT_ID=<< ID >>):") + fmt.Fprintln(writer, "ID \t Label") for _, f := range g.projects { - msg += fmt.Sprintf("\n %s\t | %s", f.ID, f.Label) - if f.DefaultSdk != "" { - msg += fmt.Sprintf("\t(default SDK: %s)", f.DefaultSdk) - } + fmt.Fprintf(writer, " %s \t %s\n", f.ID, f.Label) } - msg += "\n" } // FIXME : support multiple servers @@ -401,18 +438,28 @@ func (g *GdbXds) printProjectsList() (int, error) { if err := g.httpCli.Get("/servers/0/sdks", &sdks); err != nil { return int(syscallEBADE), err } - msg += "\nList of installed cross SDKs (use: export XDS_SDK_ID=<< ID >>): \n" - msg += " ID\t\t\t\t\t | NAME\n" + fmt.Fprintln(writer, "\nList of installed cross SDKs (use: export XDS_SDK_ID=<< ID >>):") + fmt.Fprintln(writer, "ID \t Name") for _, s := range sdks { - msg += fmt.Sprintf(" %s\t | %s\n", s.ID, s.Name) + if s.Status == xaapiv1.SdkStatusInstalled { + fmt.Fprintf(writer, " %s \t %s\n", s.ID, s.Name) + } } if len(g.projects) > 0 && len(sdks) > 0 { - msg += fmt.Sprintf("\n") - msg += fmt.Sprintf("For example: \n") - msg += fmt.Sprintf(" XDS_PROJECT_ID=%q XDS_SDK_ID=%q %s -x myGdbConf.ini\n", - g.projects[0].ID, sdks[0].ID, AppName) + fmt.Fprintln(writer, "") + fmt.Fprintln(writer, "For example: ") + if runtime.GOOS == "windows" { + fmt.Fprintf(writer, " SET XDS_PROJECT_ID=%s && SET XDS_SDK_ID=%s && %s -x myGdbConf.ini\n", + g.projects[0].ID[:8], sdks[0].ID[:8], AppName) + } else { + 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) + } } + fmt.Fprintln(writer, "") + fmt.Fprintln(writer, "Or define settings within gdb configuration file (see help and :XDS-ENV: tag)") + writer.Flush() return 0, fmt.Errorf(msg) }