X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=gdb-xds.go;h=0e93b5244955b4a632e861a679d3d8d7e4ba247e;hb=8eec65457e532c0e6a9721e3c6df9a6a9489d96f;hp=981b977eb83544c1d3426085b45c95010a144833;hpb=26e08d45599deb4ade79e0ca45a97196f2bd7da9;p=src%2Fxds%2Fxds-gdb.git diff --git a/gdb-xds.go b/gdb-xds.go index 981b977..0e93b52 100644 --- a/gdb-xds.go +++ b/gdb-xds.go @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2017 "IoT.bzh" + * Author Sebastien Douheret + * + * 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 ( @@ -15,19 +33,20 @@ import ( sio_client "github.com/sebd71/go-socket.io-client" ) -// GdbXds - +// GdbXds - Implementation of IGDB used to interfacing XDS type GdbXds struct { - log *logrus.Logger - ccmd string - aargs []string - eenv []string - uri string - prjID string - sdkID string - rPath string - listPrj bool - cmdID string - xGdbPid string + log *logrus.Logger + ccmd string + aargs []string + eenv []string + agentURL string + serverURL string + prjID string + sdkID string + rPath string + listPrj bool + cmdID string + xGdbPid string httpCli *common.HTTPClient ioSock *sio_client.Client @@ -58,8 +77,10 @@ func NewGdbXds(log *logrus.Logger, args []string, env []string) *GdbXds { // SetConfig set additional config fields func (g *GdbXds) SetConfig(name string, value interface{}) error { switch name { - case "uri": - g.uri = value.(string) + case "agentURL": + g.agentURL = value.(string) + case "serverURL": + g.serverURL = value.(string) case "prjID": g.prjID = value.(string) case "sdkID": @@ -81,9 +102,15 @@ func (g *GdbXds) Init() (int, error) { g.cmdID = "" // Define HTTP and WS url - baseURL := g.uri - if !strings.HasPrefix(g.uri, "http://") { - baseURL = "http://" + g.uri + baseURL := g.agentURL + + // Allow to only set port number + if match, _ := regexp.MatchString("^([0-9]+)$", baseURL); match { + baseURL = "http://localhost:" + g.agentURL + } + // Add http prefix if missing + if baseURL != "" && !strings.HasPrefix(g.agentURL, "http://") { + baseURL = "http://" + g.agentURL } // Create HTTP client @@ -93,14 +120,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) } @@ -115,8 +150,25 @@ func (g *GdbXds) Init() (int, error) { } g.log.Infoln("XDS agent & server version:", ver) - // SEB Check that server is connected + // Get current config and update connection to server when needed + xdsConf := xaapiv1.APIConfig{} + if err := g.httpCli.Get("/config", &xdsConf); err != nil { + return int(syscallEBADE), err + } // FIXME: add multi-servers support + idx := 0 + svrCfg := xdsConf.Servers[idx] + if g.serverURL != "" && (svrCfg.URL != g.serverURL || !svrCfg.Connected) { + svrCfg.URL = g.serverURL + svrCfg.ConnRetry = 10 + newCfg := xaapiv1.APIConfig{} + if err := g.httpCli.Post("/config", xdsConf, &newCfg); err != nil { + return int(syscallEBADE), err + } + + } else if !svrCfg.Connected { + return int(syscallEBADE), fmt.Errorf("XDS server not connected (url=%s)", svrCfg.URL) + } // Get XDS projects list var data []byte @@ -164,9 +216,29 @@ func (g *GdbXds) Init() (int, error) { } }) + // SEB gdbPid := "" iosk.On(xaapiv1.ExecOutEvent, func(ev xaapiv1.ExecOutMsg) { if g.cbRead != nil { g.cbRead(ev.Timestamp, ev.Stdout, ev.Stderr) + /* + stdout := ev.Stdout + // SEB + //New Thread 15139 + if strings.Contains(stdout, "pid = ") { + re := regexp.MustCompile("pid = ([0-9]+)") + if res := re.FindAllStringSubmatch(stdout, -1); len(res) > 0 { + gdbPid = res[0][1] + } + g.log.Errorf("SEB FOUND THREAD in '%s' => gdbPid=%s", stdout, gdbPid) + } + if gdbPid != "" && g.xGdbPid != "" && strings.Contains(stdout, gdbPid) { + g.log.Errorf("SEB THREAD REPLACE 1 stdout=%s", stdout) + stdout = strings.Replace(stdout, gdbPid, g.xGdbPid, -1) + g.log.Errorf("SEB THREAD REPLACE 2 stdout=%s", stdout) + } + + g.cbRead(ev.Timestamp, stdout, ev.Stderr) + */ } }) @@ -243,7 +315,7 @@ func (g *GdbXds) Start(inferiorTTY bool) (int, error) { CmdTimeout: -1, // no timeout, end when stdin close or command exited normally } - g.log.Infof("POST %s/exec %v", g.uri, args) + g.log.Infof("POST %s/exec %v", g.agentURL, args) res := xaapiv1.ExecResult{} err = g.httpCli.Post("/exec", args, &res) if err != nil {