diff --git a/cli/cli.go b/cli/cli.go index 229441e..4da1087 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -135,6 +135,7 @@ func New(cfg *config.XCConfig, backend store.Backend) (*Cli, error) { remote.SetDebug(cli.debug) remote.SetUsePasswordManager(cli.usePasswordMgr) remote.SetNumThreads(cli.sshThreads) + remote.SetRemoteEnvironment(cfg.RemoteEnvironment) // interpreter cli.setInterpreter("none", cfg.Interpreter) @@ -232,6 +233,9 @@ func (c *Cli) OneCmd(line string) { var argsLine string line = strings.Trim(line, " \n\t") + if strings.HasPrefix(line, "#") { + return + } cmdRunes, rest := split([]rune(line)) cmd := string(cmdRunes) diff --git a/config/config.go b/config/config.go index 6e57c1b..dede5d2 100644 --- a/config/config.go +++ b/config/config.go @@ -90,6 +90,7 @@ type XCConfig struct { PasswordManagerPath string PasswordManagerOptions map[string]string LocalEnvironment map[string]string + RemoteEnvironment map[string]string Distribute string } @@ -163,6 +164,7 @@ func read(filename string, secondPass bool) (*XCConfig, error) { cfg.Readline = defaultReadlineConfig cfg.BackendCfg = &BackendConfig{Type: BTIni, Options: make(map[string]string)} cfg.LocalEnvironment = make(map[string]string) + cfg.RemoteEnvironment = make(map[string]string) hf, err := props.GetString("main.history_file") if err != nil { @@ -351,5 +353,13 @@ func read(filename string, secondPass bool) (*XCConfig, error) { } } + envkeys, err = props.Subkeys("remote_environ") + if err == nil { + for _, key := range envkeys { + value, _ := props.GetString(fmt.Sprintf("remote_environ.%s", key)) + cfg.RemoteEnvironment[key] = value + } + } + return cfg, nil } diff --git a/remote/remote.go b/remote/remote.go index b97a2c3..ea7e612 100644 --- a/remote/remote.go +++ b/remote/remote.go @@ -24,6 +24,7 @@ var ( outputFile *os.File poolLock *sync.Mutex poolSize int + remoteEnvironment map[string]string noneInterpreter string suInterpreter string @@ -114,6 +115,11 @@ func SetNumThreads(numThreads int) { poolSize = numThreads } +// SetRemoteEnvironment sets remote environ variables +func SetRemoteEnvironment(environ map[string]string) { + remoteEnvironment = environ +} + func prepareTempFiles(cmd string) (string, string, error) { f, err := ioutil.TempFile("", "xc.") if err != nil { @@ -123,6 +129,10 @@ func prepareTempFiles(cmd string) (string, string, error) { remoteFilename := filepath.Join(currentRemoteTmpdir, filepath.Base(f.Name())) io.WriteString(f, "#!/bin/bash\n\n") + for varName, value := range remoteEnvironment { + io.WriteString(f, fmt.Sprintf("%s=%s\n", varName, value)) + } + io.WriteString(f, "\n") io.WriteString(f, fmt.Sprintf("nohup bash -c \"sleep 1; rm -f $0\" >/dev/null 2>&1