+func sdksInstall(ctx *cli.Context) error {
+ id := GetID(ctx)
+ if id == "" {
+ return cli.NewExitError("id parameter or option must be set", 1)
+ }
+
+ // Process Socket IO events
+ type exitResult struct {
+ error string
+ code int
+ }
+ exitChan := make(chan exitResult, 1)
+
+ IOsk.On("disconnection", func(err error) {
+ Log.Debugf("WS disconnection event with err: %v\n", err)
+ errMsg := ""
+ if err != nil {
+ errMsg = err.Error()
+ }
+ exitChan <- exitResult{errMsg, 2}
+ })
+
+ IOsk.On(xaapiv1.EVTSDKInstall, func(ev xaapiv1.EventMsg) {
+ sdkEvt, _ := ev.DecodeSDKMsg()
+
+ if sdkEvt.Stdout != "" {
+ fmt.Printf("%s", sdkEvt.Stdout)
+ }
+ if sdkEvt.Stderr != "" {
+ fmt.Fprintf(os.Stderr, "%s", sdkEvt.Stderr)
+ }
+
+ if sdkEvt.Exited {
+ exitChan <- exitResult{sdkEvt.Error, sdkEvt.Code}
+ }
+ })
+
+ evReg := xaapiv1.EventRegisterArgs{Name: xaapiv1.EVTSDKInstall}
+ if err := HTTPCli.Post("/events/register", &evReg, nil); err != nil {
+ return cli.NewExitError(err, 1)
+ }
+
+ file := ctx.String("file")
+ force := ctx.Bool("force")
+ url := XdsServerComputeURL("/sdks")
+ sdks := xaapiv1.SDKInstallArgs{ID: id, Filename: file, Force: force}
+ newSdk := xaapiv1.SDK{}
+ if err := HTTPCli.Post(url, &sdks, &newSdk); err != nil {
+ return cli.NewExitError(err, 1)
+ }
+ Log.Debugf("Result of %s: %v", url, newSdk)
+ fmt.Printf("Installating of '%s' SDK (id %v) successfully started.\n", newSdk.Name, newSdk.ID)
+
+ // Wait exit
+ select {
+ case res := <-exitChan:
+ if res.code == 0 {
+ Log.Debugln("Exit successfully")
+ }
+ if res.error != "" {
+ Log.Debugln("Exit with ERROR: ", res.error)
+ }
+ return cli.NewExitError(res.error, res.code)
+ }