X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsserver%2Fsdk.go;h=c1bf0433bb73851bffbf9d949dafc8d3e7b73bfd;hb=17812a0a4388ab0c87084ef7e8118d87e8fadcf7;hp=633fbee318317fd1c9809a51e4bf2dcd4e6a7380;hpb=dcdee5e2aa05ec07e7e750bea4faad63bce7b668;p=src%2Fxds%2Fxds-server.git diff --git a/lib/xdsserver/sdk.go b/lib/xdsserver/sdk.go index 633fbee..c1bf043 100644 --- a/lib/xdsserver/sdk.go +++ b/lib/xdsserver/sdk.go @@ -20,7 +20,6 @@ package xdsserver import ( "encoding/json" "fmt" - "os" "os/exec" "path" "strconv" @@ -62,15 +61,21 @@ type CrossSDK struct { scripts map[string]string installCmd *eows.ExecOverWS removeCmd *eows.ExecOverWS - - bufStdout string - bufStderr string } // ListCrossSDK List all available and installed SDK (call "db-dump" script) -func ListCrossSDK(scriptDir string, log *logrus.Logger) ([]xsapiv1.SDK, error) { +func ListCrossSDK(scriptDir string, update bool, log *logrus.Logger) ([]xsapiv1.SDK, error) { sdksList := []xsapiv1.SDK{} + // First update sdk DB when requested + if update { + out, err := UpdateSDKDb(scriptDir, log) + if err != nil { + log.Errorf("SDK DB update failure (%v): %v", err, out) + return sdksList, fmt.Errorf("Error while updating SDK DB (%v)", err) + } + } + // Retrieve SDKs list and info cmd := exec.Command(path.Join(scriptDir, scriptDbDump)) stdout, err := cmd.CombinedOutput() @@ -115,6 +120,15 @@ func GetSDKInfo(scriptDir, url, filename, md5sum string, log *logrus.Logger) (xs return sdk, nil } +// UpdateSDKDb Used db-update script to update SDK database +func UpdateSDKDb(scriptDir string, log *logrus.Logger) (string, error) { + args := []string{} + cmd := exec.Command(path.Join(scriptDir, scriptDbUpdate), args...) + stdout, err := cmd.CombinedOutput() + + return string(stdout), err +} + // NewCrossSDK creates a new instance of CrossSDK func NewCrossSDK(ctx *Context, sdk xsapiv1.SDK, scriptDir string) (*CrossSDK, error) { s := CrossSDK{ @@ -233,30 +247,20 @@ func (s *CrossSDK) Install(file string, force bool, timeout int, args []string, // Create new instance to execute command and sent output over WS s.installCmd = eows.New(s.scripts[scriptAdd], cmdArgs, sess.IOSocket, sess.ID, cmdID) s.installCmd.Log = s.Log + // TODO: enable Term s.installCmd.PtyMode = true + s.installCmd.LineTimeSpan = 500 * time.Millisecond.Nanoseconds() if timeout > 0 { s.installCmd.CmdExecTimeout = timeout } else { s.installCmd.CmdExecTimeout = 30 * 60 // default 30min } - // FIXME: temporary hack - s.bufStdout = "" - s.bufStderr = "" - SizeBufStdout := 10 - SizeBufStderr := 2000 - if valS, ok := os.LookupEnv("XDS_SDK_BUF_STDOUT"); ok { - if valI, err := strconv.Atoi(valS); err == nil { - SizeBufStdout = valI - } - } - if valS, ok := os.LookupEnv("XDS_SDK_BUF_STDERR"); ok { - if valI, err := strconv.Atoi(valS); err == nil { - SizeBufStderr = valI - } - } - // Define callback for output (stdout+stderr) - s.installCmd.OutputCB = func(e *eows.ExecOverWS, stdout, stderr string) { + s.installCmd.OutputCB = func(e *eows.ExecOverWS, bStdout, bStderr []byte) { + + stdout := string(bStdout) + stderr := string(bStderr) + // paranoia data := e.UserData sdkID := (*data)["SDKID"].(string) @@ -281,27 +285,18 @@ func (s *CrossSDK) Install(file string, force bool, timeout int, args []string, } } - // Temporary "Hack": Buffered sent data to avoid freeze in web Browser - // FIXME: remove bufStdout & bufStderr and implement better algorithm - s.bufStdout += stdout - s.bufStderr += stderr - if len(s.bufStdout) > SizeBufStdout || len(s.bufStderr) > SizeBufStderr { - // Emit event - err := (*so).Emit(xsapiv1.EVTSDKManagement, xsapiv1.SDKManagementMsg{ - CmdID: e.CmdID, - Timestamp: time.Now().String(), - Action: xsapiv1.SdkMgtActionInstall, - Sdk: s.sdk, - Progress: 0, // TODO add progress - Exited: false, - Stdout: s.bufStdout, - Stderr: s.bufStderr, - }) - if err != nil { - s.Log.Errorf("WS Emit : %v", err) - } - s.bufStdout = "" - s.bufStderr = "" + err := (*so).Emit(xsapiv1.EVTSDKManagement, xsapiv1.SDKManagementMsg{ + CmdID: e.CmdID, + Timestamp: time.Now().String(), + Action: xsapiv1.SdkMgtActionInstall, + Sdk: s.sdk, + Progress: 0, // TODO add progress + Exited: false, + Stdout: stdout, + Stderr: stderr, + }) + if err != nil { + s.Log.Errorf("WS Emit : %v", err) } } @@ -323,25 +318,6 @@ func (s *CrossSDK) Install(file string, force bool, timeout int, args []string, return } - // Emit event remaining data in bufStdout/err - if len(s.bufStderr) > 0 || len(s.bufStdout) > 0 { - err := (*so).Emit(xsapiv1.EVTSDKManagement, xsapiv1.SDKManagementMsg{ - CmdID: e.CmdID, - Timestamp: time.Now().String(), - Action: xsapiv1.SdkMgtActionInstall, - Sdk: s.sdk, - Progress: 50, // TODO add progress - Exited: false, - Stdout: s.bufStdout, - Stderr: s.bufStderr, - }) - if err != nil { - s.Log.Errorf("WS Emit : %v", err) - } - s.bufStdout = "" - s.bufStderr = "" - } - // Update SDK status if code == 0 && exitError == nil { s.sdk.LastError = ""