aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-28 21:44:26 +0200
committerSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-29 08:56:46 +0200
commitd94141ed7419867231a1050eb81c72bfd25003c6 (patch)
tree5ea9d86d2769527354d42853949f28d5b0c030e0
parent29b13449d2e8a5dad2aefda6e9a2b5661fecfc2a (diff)
Fixed path convertion/mapping for in/out and for command args.
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
-rw-r--r--lib/apiv1/exec.go43
-rw-r--r--lib/folder/folder-interface.go2
-rw-r--r--lib/folder/folder-pathmap.go25
-rw-r--r--lib/syncthing/folder-st.go25
4 files changed, 79 insertions, 16 deletions
diff --git a/lib/apiv1/exec.go b/lib/apiv1/exec.go
index 6300dba..fd0f8bb 100644
--- a/lib/apiv1/exec.go
+++ b/lib/apiv1/exec.go
@@ -118,8 +118,8 @@ func (s *APIService) execCmd(c *gin.Context) {
common.APIError(c, "Unknown id")
return
}
- folder := *f
- prj := folder.GetConfig()
+ fld := *f
+ prj := fld.GetConfig()
// Build command line
cmd := []string{}
@@ -135,7 +135,7 @@ func (s *APIService) execCmd(c *gin.Context) {
}
}
- cmd = append(cmd, "cd", folder.GetFullPath(args.RPath))
+ cmd = append(cmd, "cd", fld.GetFullPath(args.RPath))
// FIXME - add 'exec' prevents to use syntax:
// xds-exec -l debug -c xds-config.env -- "cd build && cmake .."
// but exec is mandatory to allow to pass correctly signals
@@ -145,7 +145,15 @@ func (s *APIService) execCmd(c *gin.Context) {
// Process command arguments
cmdArgs := make([]string, len(args.Args)+1)
- copy(cmdArgs, args.Args)
+
+ // Copy and Translate path from client to server
+ for _, aa := range args.Args {
+ if strings.Contains(aa, prj.ClientPath) {
+ cmdArgs = append(cmdArgs, fld.ConvPathCli2Svr(aa))
+ } else {
+ cmdArgs = append(cmdArgs, aa)
+ }
+ }
// Allocate pts if tty if used
if args.TTY {
@@ -193,9 +201,14 @@ func (s *APIService) execCmd(c *gin.Context) {
// Set correct path
data := e.UserData
- rootPath := (*data)["RootPath"].(string)
- clientPath := (*data)["ClientPath"].(string)
- stdin = strings.Replace(stdin, clientPath, rootPath+"/"+clientPath, -1)
+ prjID := (*data)["ID"].(string)
+ f := s.mfolders.Get(prjID)
+ if f == nil {
+ s.log.Errorf("InputCB: Cannot get folder ID %s", prjID)
+ } else {
+ // Translate paths from client to server
+ stdin = (*f).ConvPathCli2Svr(stdin)
+ }
return stdin, nil
}
@@ -212,12 +225,16 @@ func (s *APIService) execCmd(c *gin.Context) {
// Retrieve project ID and RootPath
data := e.UserData
prjID := (*data)["ID"].(string)
- prjRootPath := (*data)["RootPath"].(string)
gdbServerTTY := (*data)["gdbServerTTY"].(string)
- // Cleanup any references to internal rootpath in stdout & stderr
- stdout = strings.Replace(stdout, prjRootPath, "", -1)
- stderr = strings.Replace(stderr, prjRootPath, "", -1)
+ f := s.mfolders.Get(prjID)
+ if f == nil {
+ s.log.Errorf("OutputCB: Cannot get folder ID %s", prjID)
+ } else {
+ // Translate paths from server to client
+ stdout = (*f).ConvPathSvr2Cli(stdout)
+ stderr = (*f).ConvPathSvr2Cli(stderr)
+ }
s.log.Debugf("%s emitted - WS sid[4:] %s - id:%s - prjID:%s", ExecOutEvent, e.Sid[4:], e.CmdID, prjID)
if stdout != "" {
@@ -330,8 +347,6 @@ func (s *APIService) execCmd(c *gin.Context) {
// User data (used within callbacks)
data := make(map[string]interface{})
data["ID"] = prj.ID
- data["RootPath"] = prj.RootPath
- data["ClientPath"] = prj.ClientPath
data["ExitImmediate"] = args.ExitImmediate
if args.TTY && args.TTYGdbserverFix {
data["gdbServerTTY"] = "workaround"
@@ -341,7 +356,7 @@ func (s *APIService) execCmd(c *gin.Context) {
execWS.UserData = &data
// Start command execution
- s.log.Debugf("Execute [Cmd ID %s]: %v %v", execWS.CmdID, execWS.Cmd, execWS.Args)
+ s.log.Infof("Execute [Cmd ID %s]: %v %v", execWS.CmdID, execWS.Cmd, execWS.Args)
err = execWS.Start()
if err != nil {
diff --git a/lib/folder/folder-interface.go b/lib/folder/folder-interface.go
index c04cbd7..4beccb8 100644
--- a/lib/folder/folder-interface.go
+++ b/lib/folder/folder-interface.go
@@ -27,6 +27,8 @@ type IFOLDER interface {
Add(cfg FolderConfig) (*FolderConfig, error) // Add a new folder
GetConfig() FolderConfig // Get folder public configuration
GetFullPath(dir string) string // Get folder full path
+ ConvPathCli2Svr(s string) string // Convert path from Client to Server
+ ConvPathSvr2Cli(s string) string // Convert path from Server to Client
Remove() error // Remove a folder
RegisterEventChange(cb *EventCB, data *EventCBData) error // Request events registration (sent through WS)
UnRegisterEventChange() error // Un-register events
diff --git a/lib/folder/folder-pathmap.go b/lib/folder/folder-pathmap.go
index f73f271..1020026 100644
--- a/lib/folder/folder-pathmap.go
+++ b/lib/folder/folder-pathmap.go
@@ -5,6 +5,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
+ "strings"
common "github.com/iotbzh/xds-common/golib"
"github.com/iotbzh/xds-server/lib/xdsconfig"
@@ -80,7 +81,7 @@ func (f *PathMap) GetConfig() FolderConfig {
return f.config
}
-// GetFullPath returns the full path
+// GetFullPath returns the full path of a directory (from server POV)
func (f *PathMap) GetFullPath(dir string) string {
if &dir == nil {
return f.config.DataPathMap.ServerPath
@@ -88,6 +89,28 @@ func (f *PathMap) GetFullPath(dir string) string {
return filepath.Join(f.config.DataPathMap.ServerPath, dir)
}
+// ConvPathCli2Svr Convert path from Client to Server
+func (f *PathMap) ConvPathCli2Svr(s string) string {
+ if f.config.ClientPath != "" && f.config.DataPathMap.ServerPath != "" {
+ return strings.Replace(s,
+ f.config.ClientPath,
+ f.config.DataPathMap.ServerPath,
+ -1)
+ }
+ return s
+}
+
+// ConvPathSvr2Cli Convert path from Server to Client
+func (f *PathMap) ConvPathSvr2Cli(s string) string {
+ if f.config.ClientPath != "" && f.config.DataPathMap.ServerPath != "" {
+ return strings.Replace(s,
+ f.config.DataPathMap.ServerPath,
+ f.config.ClientPath,
+ -1)
+ }
+ return s
+}
+
// Remove a folder
func (f *PathMap) Remove() error {
// nothing to do
diff --git a/lib/syncthing/folder-st.go b/lib/syncthing/folder-st.go
index da27062..a372b6f 100644
--- a/lib/syncthing/folder-st.go
+++ b/lib/syncthing/folder-st.go
@@ -3,6 +3,7 @@ package st
import (
"fmt"
"path/filepath"
+ "strings"
"github.com/iotbzh/xds-server/lib/folder"
"github.com/iotbzh/xds-server/lib/xdsconfig"
@@ -93,7 +94,7 @@ func (f *STFolder) GetConfig() folder.FolderConfig {
return f.fConfig
}
-// GetFullPath returns the full path
+// GetFullPath returns the full path of a directory (from server POV)
func (f *STFolder) GetFullPath(dir string) string {
if &dir == nil {
dir = ""
@@ -104,6 +105,28 @@ func (f *STFolder) GetFullPath(dir string) string {
return filepath.Join(f.fConfig.RootPath, f.fConfig.ClientPath, dir)
}
+// ConvPathCli2Svr Convert path from Client to Server
+func (f *STFolder) ConvPathCli2Svr(s string) string {
+ if f.fConfig.ClientPath != "" && f.fConfig.RootPath != "" {
+ return strings.Replace(s,
+ f.fConfig.ClientPath,
+ f.fConfig.RootPath+"/"+f.fConfig.ClientPath,
+ -1)
+ }
+ return s
+}
+
+// ConvPathSvr2Cli Convert path from Server to Client
+func (f *STFolder) ConvPathSvr2Cli(s string) string {
+ if f.fConfig.ClientPath != "" && f.fConfig.RootPath != "" {
+ return strings.Replace(s,
+ f.fConfig.RootPath+"/"+f.fConfig.ClientPath,
+ f.fConfig.ClientPath,
+ -1)
+ }
+ return s
+}
+
// Remove a folder
func (f *STFolder) Remove() error {
return f.st.FolderDelete(f.stfConfig.ID)