remove lock around connecting remote

This commit is contained in:
sawka
2022-08-24 22:57:41 -07:00
parent 5b1b67cf55
commit d0806bbd63
+35 -19
View File
@@ -294,10 +294,13 @@ func convertSSHOpts(opts *sstore.SSHOpts) shexec.SSHOpts {
} }
} }
func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) error { func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) (*os.File, error) {
msh.Lock.Lock()
defer msh.Lock.Unlock()
cmdPty, cmdTty, err := pty.Open() cmdPty, cmdTty, err := pty.Open()
if err != nil { if err != nil {
return err return nil, err
} }
msh.ControllingPty = cmdPty msh.ControllingPty = cmdPty
ecmd.ExtraFiles = append(ecmd.ExtraFiles, cmdTty) ecmd.ExtraFiles = append(ecmd.ExtraFiles, cmdTty)
@@ -307,18 +310,28 @@ func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) error {
ecmd.SysProcAttr.Setsid = true ecmd.SysProcAttr.Setsid = true
ecmd.SysProcAttr.Setctty = true ecmd.SysProcAttr.Setctty = true
ecmd.SysProcAttr.Ctty = len(ecmd.ExtraFiles) + 3 - 1 ecmd.SysProcAttr.Ctty = len(ecmd.ExtraFiles) + 3 - 1
return nil return cmdPty, nil
}
func (msh *MShellProc) setErrorStatus(err error) {
msh.Lock.Lock()
defer msh.Lock.Unlock()
msh.Status = StatusError
msh.Err = err
}
func (msh *MShellProc) getRemoteCopy() sstore.RemoteType {
msh.Lock.Lock()
defer msh.Lock.Unlock()
return *msh.Remote
} }
func (msh *MShellProc) Launch() { func (msh *MShellProc) Launch() {
msh.Lock.Lock() remote := msh.getRemoteCopy()
defer msh.Lock.Unlock() ecmd := convertSSHOpts(remote.SSHOpts).MakeSSHExecCmd(MShellServerCommand)
cmdPty, err := msh.addControllingTty(ecmd)
ecmd := convertSSHOpts(msh.Remote.SSHOpts).MakeSSHExecCmd(MShellServerCommand)
err := msh.addControllingTty(ecmd)
if err != nil { if err != nil {
msh.Status = StatusError msh.setErrorStatus(fmt.Errorf("cannot attach controlling tty to mshell command: %w", err))
msh.Err = fmt.Errorf("cannot attach controlling tty to mshell command: %w", err)
return return
} }
defer func() { defer func() {
@@ -326,12 +339,12 @@ func (msh *MShellProc) Launch() {
ecmd.ExtraFiles[len(ecmd.ExtraFiles)-1].Close() ecmd.ExtraFiles[len(ecmd.ExtraFiles)-1].Close()
} }
}() }()
remoteName := msh.Remote.GetName() remoteName := remote.GetName()
go func() { go func() {
fmt.Printf("[c-pty %s] starting...\n", msh.Remote.GetName()) fmt.Printf("[c-pty %s] starting...\n", remote.GetName())
buf := make([]byte, 100) buf := make([]byte, 100)
for { for {
n, readErr := msh.ControllingPty.Read(buf) n, readErr := cmdPty.Read(buf)
if readErr == io.EOF { if readErr == io.EOF {
break break
} }
@@ -348,21 +361,24 @@ func (msh *MShellProc) Launch() {
if remoteName == "test2" { if remoteName == "test2" {
go func() { go func() {
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
msh.ControllingPty.Write([]byte(Test2Pw)) cmdPty.Write([]byte(Test2Pw))
fmt.Printf("[c-pty %s] wrote password!\n", remoteName) fmt.Printf("[c-pty %s] wrote password!\n", remoteName)
}() }()
} }
cproc, uname, err := shexec.MakeClientProc(ecmd) cproc, uname, err := shexec.MakeClientProc(ecmd)
msh.UName = uname msh.WithLock(func() {
msh.UName = uname
})
if err != nil { if err != nil {
msh.Status = StatusError msh.setErrorStatus(err)
msh.Err = err
fmt.Printf("[error] connecting remote %s (%s): %v\n", msh.Remote.GetName(), msh.UName, err) fmt.Printf("[error] connecting remote %s (%s): %v\n", msh.Remote.GetName(), msh.UName, err)
return return
} }
fmt.Printf("connected remote %s\n", msh.Remote.GetName()) fmt.Printf("connected remote %s\n", msh.Remote.GetName())
msh.ServerProc = cproc msh.WithLock(func() {
msh.Status = StatusConnected msh.ServerProc = cproc
msh.Status = StatusConnected
})
go func() { go func() {
exitErr := cproc.Cmd.Wait() exitErr := cproc.Cmd.Wait()
exitCode := shexec.GetExitCode(exitErr) exitCode := shexec.GetExitCode(exitErr)